using LehrerApp.Core.Models; using LehrerApp.Desktop.ViewModels.Groups; using Xunit; namespace LehrerApp.Desktop.Tests; public sealed class SeatingPlanViewModelTests { [Fact] public void AuswahlEinesBereitsZugeordnetenSchuelers_VerschiebtIhnAufDenNeuenPlatz() { var groupId = Guid.NewGuid(); var student = new Student { FirstName = "Anna", LastName = "Beispiel" }; var students = new FakeStudents([student]); var memberships = new FakeMemberships([ new GroupMembership { GroupId = groupId, StudentId = student.Id }, ]); var plan = new SeatingPlan { GroupId = groupId, Name = "Standard", Rows = 1, Columns = 2, Assignments = [new SeatAssignment { Row = 0, Column = 0, StudentId = student.Id }], }; var plans = new FakeSeatingPlans([plan]); var vm = new SeatingPlanTabViewModel(plans, students, memberships, new FakeSessions([]), new FakeEntries(), new FakeAspects()); vm.Initialize(groupId, isReadOnly: false); vm.Seats[1].SelectedOption = vm.StudentOptions.Single(o => o.StudentId == student.Id); Assert.Null(vm.Seats[0].SelectedOption.StudentId); var assignment = Assert.Single(plans.GetById(plan.Id)!.Assignments); Assert.Equal((0, 1, student.Id), (assignment.Row, assignment.Column, assignment.StudentId)); } [Fact] public void ArchivierteGruppe_DeaktiviertSitzplatzbearbeitung() { var groupId = Guid.NewGuid(); var plan = new SeatingPlan { GroupId = groupId, Name = "Standard", Rows = 1, Columns = 1 }; var vm = new SeatingPlanTabViewModel( new FakeSeatingPlans([plan]), new FakeStudents([]), new FakeMemberships([]), new FakeSessions([]), new FakeEntries(), new FakeAspects()); vm.Initialize(groupId, isReadOnly: true); Assert.False(vm.IsEditable); Assert.False(vm.Seats.Single().CanEdit); Assert.False(vm.AddPlanCommand.CanExecute(null)); } [Fact] public void DragDrop_ZwischenBelegtenPlaetzen_TauschtDieSchueler() { var groupId = Guid.NewGuid(); var anna = new Student { FirstName = "Anna", LastName = "A" }; var ben = new Student { FirstName = "Ben", LastName = "B" }; var students = new FakeStudents([anna, ben]); var memberships = new FakeMemberships([ new GroupMembership { GroupId = groupId, StudentId = anna.Id }, new GroupMembership { GroupId = groupId, StudentId = ben.Id }, ]); var plan = new SeatingPlan { GroupId = groupId, Name = "Standard", Rows = 1, Columns = 2, Assignments = [ new SeatAssignment { Row = 0, Column = 0, StudentId = anna.Id }, new SeatAssignment { Row = 0, Column = 1, StudentId = ben.Id }, ], }; var plans = new FakeSeatingPlans([plan]); var vm = new SeatingPlanTabViewModel(plans, students, memberships, new FakeSessions([]), new FakeEntries(), new FakeAspects()); vm.Initialize(groupId, isReadOnly: false); vm.MoveSeat(vm.Seats[0], vm.Seats[1]); Assert.Equal(ben.Id, vm.Seats[0].SelectedOption.StudentId); Assert.Equal(anna.Id, vm.Seats[1].SelectedOption.StudentId); Assert.Equal(2, plans.GetById(plan.Id)!.Assignments.Count); } [Fact] public void SitzplatzBewertung_ErstelltHeutigeSitzungUndSpeichertAlleDreiBereiche() { var groupId = Guid.NewGuid(); var studentId = Guid.NewGuid(); var sessions = new FakeSessions([]); var entries = new FakeEntries(); var vm = new SeatAssessmentViewModel(sessions, entries, new FakeAspects(), groupId, studentId, "Beispiel, Anna", canEdit: true); vm.SetRatingByNumber(5); vm.ApplyAttendanceShortcut(1, clear: false); vm.ApplyHomeworkShortcut(7, clear: false); var session = Assert.Single(sessions.GetByGroup(groupId)); Assert.Equal(DateOnly.FromDateTime(DateTime.Today), session.Date); Assert.Equal("Sitzplan", session.Comment); var entry = entries.GetBySessionAndStudent(session.Id, studentId)!; Assert.Equal(2, entry.Ratings.Single(r => r.Key == "quality").Value); Assert.Equal(AttendanceStatus.Present, entry.Attendance); Assert.Equal(HomeworkStatus.MissingOpen, entry.Homework); Assert.True(entry.HomeworkMissing); } [Fact] public void SitzplatzBewertung_ArchiviertOhneSitzung_LegtKeineNeueSitzungAn() { var groupId = Guid.NewGuid(); var sessions = new FakeSessions([]); var vm = new SeatAssessmentViewModel(sessions, new FakeEntries(), new FakeAspects(), groupId, Guid.NewGuid(), "Beispiel, Anna", canEdit: false); vm.SetRatingByNumber(5); Assert.False(vm.CanEdit); Assert.Empty(sessions.GetByGroup(groupId)); } }