using LehrerApp.Core.Models; using LehrerApp.Core.Services; using LehrerApp.Desktop.ViewModels.Groups; using Xunit; namespace LehrerApp.Desktop.Tests; public sealed class GroupDetailViewModelTests { private static (GroupDetailViewModel Vm, FakeExams Exams, FakeWorkTasks Tasks) Build(LearningGroup group, Exam exam) { var exams = new FakeExams([exam]); var tasks = new FakeWorkTasks(); var groups = new FakeGroups([group]); var students = new FakeStudents([]); var memberships = new FakeMemberships([]); var subjects = new FakeSubjects([]); var grades = new FakeGrades(); var vm = new GroupDetailViewModel(groups, students, memberships, subjects, exams, grades, tasks, new ParticipationTabViewModel(new FakeSessions([]), new FakeEntries(), new FakeAspects(), students, memberships, groups, new FakeCompetencyDomains()), new GradeOverviewTabViewModel(grades, exams, new FakeResults(), students, memberships, new GradingService()), new PlanningTabViewModel(new FakeUnits(), new FakeLessons(), groups, subjects, new FakeCompetencyDomains(), TestSupport.BuildAiSettingsService(), new FakeSessions([])), new CompetencyOverviewTabViewModel(new FakeUnits(), exams, new FakeResults(), new FakeCompetencyDomains(), students, new CompetencyAnalysisService()), new SeatingPlanTabViewModel(new FakeSeatingPlans(), students, memberships, new FakeSessions([]), new FakeEntries(), new FakeAspects()), new GroupDocumentationTabViewModel(new FakeDocumentation(), students, groups)); vm.LoadGroup(group.Id); vm.SelectedExam = vm.Exams.First(e => e.Id == exam.Id); return (vm, exams, tasks); } [Fact] public void SetExamStatus_PlannedZuConducted_ErstelltKorrekturAufgabe() { var group = new LearningGroup { Name = "8a", SchoolYear = "2025/26" }; var exam = new Exam { GroupId = group.Id, Title = "Klausur 1", Date = new DateOnly(2026, 3, 10) }; var (vm, _, tasks) = Build(group, exam); vm.SetExamStatusCommand.Execute(ExamStatus.Conducted); var task = Assert.Single(tasks.GetAll()); Assert.Equal("Klausur korrigieren: Klausur 1", task.Title); Assert.Equal(TaskCategory.Correction, task.Category); Assert.Equal(group.Id, task.GroupId); Assert.Equal(new DateOnly(2026, 3, 24), task.DueDate); } [Fact] public void SetExamStatus_ConductedErneutGesetzt_ErstelltKeineZweiteAufgabe() { var group = new LearningGroup { Name = "8a", SchoolYear = "2025/26" }; var exam = new Exam { GroupId = group.Id, Title = "Klausur 1", Date = new DateOnly(2026, 3, 10) }; var (vm, _, tasks) = Build(group, exam); vm.SetExamStatusCommand.Execute(ExamStatus.Conducted); vm.SelectedExam = vm.Exams.First(e => e.Id == exam.Id); vm.SetExamStatusCommand.Execute(ExamStatus.Conducted); Assert.Single(tasks.GetAll()); } [Fact] public void SetExamStatus_DirektAufGraded_ErstelltKeineAufgabe() { var group = new LearningGroup { Name = "8a", SchoolYear = "2025/26" }; var exam = new Exam { GroupId = group.Id, Title = "Klausur 1", Date = new DateOnly(2026, 3, 10) }; var (vm, _, tasks) = Build(group, exam); vm.SetExamStatusCommand.Execute(ExamStatus.Graded); Assert.Empty(tasks.GetAll()); } }