using LehrerApp.Core.Models; using LehrerApp.Core.Services; using LehrerApp.Desktop.ViewModels.Groups; using Xunit; namespace LehrerApp.Desktop.Tests; public sealed class GroupRolloverDialogViewModelTests { [Fact] public void Vorauswahl_NimmtNurAktiveSchuelerAmSchuljahresende() { var group = new LearningGroup { Name = "8a", SchoolYear = "2025/26", GradeLevel = 8 }; var fullYearStudent = Student("Ganzjahr"); var h1Student = Student("Halbjahr"); var withdrawnStudent = Student("Ausgetreten"); var inactiveStudent = Student("Inaktiv", active: false); var membershipList = new List { Membership(group, fullYearStudent, MembershipPeriod.FullYear), Membership(group, h1Student, MembershipPeriod.H1Only), Membership(group, withdrawnStudent, MembershipPeriod.FullYear, new DateOnly(2026, 5, 1)), Membership(group, inactiveStudent, MembershipPeriod.FullYear), }; var groups = new FakeGroups([group]); var memberships = new FakeMemberships(membershipList); var schemes = new FakeSchemes(); var schoolYears = new SchoolYearService(); var vm = new GroupRolloverDialogViewModel(group, new FakeStudents([fullYearStudent, h1Student, withdrawnStudent, inactiveStudent]), memberships, schemes, schoolYears, new GroupRolloverService(groups, memberships, schemes, schoolYears)); Assert.True(vm.Students.Single(s => s.FullName.Contains("Ganzjahr")).IsSelected); Assert.False(vm.Students.Single(s => s.FullName.Contains("Halbjahr")).IsSelected); Assert.False(vm.Students.Single(s => s.FullName.Contains("Ausgetreten")).IsSelected); var inactive = vm.Students.Single(s => s.FullName.Contains("Inaktiv")); Assert.False(inactive.IsSelected); Assert.False(inactive.CanSelect); Assert.Equal(1, vm.SelectedCount); } [Fact] public void Dialog_SchlaegtNaechstesSchuljahrUndNaechsteStufeVor() { var group = new LearningGroup { Name = "8a", SchoolYear = "2025/26", GradeLevel = 8 }; var student = Student("Ganzjahr"); var membershipList = new List { Membership(group, student, MembershipPeriod.FullYear) }; var groups = new FakeGroups([group]); var memberships = new FakeMemberships(membershipList); var schemes = new FakeSchemes(); var schoolYears = new SchoolYearService(); var vm = new GroupRolloverDialogViewModel(group, new FakeStudents([student]), memberships, schemes, schoolYears, new GroupRolloverService(groups, memberships, schemes, schoolYears)); Assert.Equal("2026/27", vm.TargetSchoolYear); Assert.Equal(9, vm.GradeLevel); Assert.True(vm.ArchiveSource); } private static Student Student(string lastName, bool active = true) => new() { FirstName = "Test", LastName = lastName, IsActive = active }; private static GroupMembership Membership(LearningGroup group, Student student, MembershipPeriod period, DateOnly? leftAt = null) => new() { GroupId = group.Id, StudentId = student.Id, Period = period, JoinedAt = new DateOnly(2025, 8, 1), LeftAt = leftAt, }; }