using LehrerApp.Core.Models; using LehrerApp.Desktop.ViewModels.Groups; using Xunit; namespace LehrerApp.Desktop.Tests; /// Deckt die Kandidatensuche für den "Vorhandene Stunde verknüpfen"-Button im Stunden-anlegen- /// Dialog ab (Nutzer-Feedback: per JSON-Import/KI ohne Stundennummer angelegte Stunden tauchen im /// Stundenplan nicht auf, da der dort verwendete FindLessonForSlot per Datum+Stundennummer sucht). public class LessonFixItSearchTests { [Fact] public void FindCandidates_FindetVerwaisteStundeOhneStundennummerAmSelbenTag() { var lessons = new FakeLessons(); var groupId = Guid.NewGuid(); var unitId = Guid.NewGuid(); var date = new DateOnly(2026, 9, 8); var orphan = new Lesson { UnitId = unitId, GroupId = groupId, Date = date, LessonNumber = null, Topic = "Reflexionsgesetz" }; lessons.Add(orphan); var candidates = LessonFixItSearch.FindCandidates(lessons, groupId, date); var found = Assert.Single(candidates); Assert.Equal(orphan.Id, found.Id); } [Fact] public void FindCandidates_FindetStundeAmSelbenTagMitAbweichenderStundennummer() { var lessons = new FakeLessons(); var groupId = Guid.NewGuid(); var unitId = Guid.NewGuid(); var date = new DateOnly(2026, 9, 8); var wrongPeriod = new Lesson { UnitId = unitId, GroupId = groupId, Date = date, LessonNumber = 7, Topic = "Reflexionsgesetz" }; lessons.Add(wrongPeriod); var candidates = LessonFixItSearch.FindCandidates(lessons, groupId, date); var found = Assert.Single(candidates); Assert.Equal(wrongPeriod.Id, found.Id); } [Fact] public void FindCandidates_SortiertExaktesDatumVorNahenTerminenOhneStundennummer() { var lessons = new FakeLessons(); var groupId = Guid.NewGuid(); var unitId = Guid.NewGuid(); var date = new DateOnly(2026, 9, 8); var near = new Lesson { UnitId = unitId, GroupId = groupId, Date = date.AddDays(-2), LessonNumber = null, Topic = "Nah" }; var exact = new Lesson { UnitId = unitId, GroupId = groupId, Date = date, LessonNumber = null, Topic = "Exakt" }; lessons.Add(near); lessons.Add(exact); var candidates = LessonFixItSearch.FindCandidates(lessons, groupId, date); Assert.Equal(2, candidates.Count); Assert.Equal(exact.Id, candidates[0].Id); Assert.Equal(near.Id, candidates[1].Id); } [Fact] public void FindCandidates_IgnoriertStundenAusserhalbDesZeitfenstersUndAnderenGruppen() { var lessons = new FakeLessons(); var groupId = Guid.NewGuid(); var otherGroupId = Guid.NewGuid(); var unitId = Guid.NewGuid(); var date = new DateOnly(2026, 9, 8); lessons.Add(new Lesson { UnitId = unitId, GroupId = groupId, Date = date.AddDays(-30), LessonNumber = null, Topic = "Zu weit weg" }); lessons.Add(new Lesson { UnitId = unitId, GroupId = otherGroupId, Date = date, LessonNumber = null, Topic = "Andere Gruppe" }); // Gesetzte Stundennummer, aber exakt am gesuchten Datum — bewusst als Kandidat enthalten // (z.B. falsch nummerierter Import); der Nutzer entscheidet im Bestätigungs-/ // Auswahldialog, ob sie passt. lessons.Add(new Lesson { UnitId = unitId, GroupId = groupId, Date = date, LessonNumber = 3, Topic = "Falsch nummeriert, aber am gesuchten Tag" }); var candidates = LessonFixItSearch.FindCandidates(lessons, groupId, date); var found = Assert.Single(candidates); Assert.Equal("Falsch nummeriert, aber am gesuchten Tag", found.Topic); } [Fact] public void FindCandidates_LeerOhnePassendeStunde() { var lessons = new FakeLessons(); var groupId = Guid.NewGuid(); var date = new DateOnly(2026, 9, 8); var candidates = LessonFixItSearch.FindCandidates(lessons, groupId, date); Assert.Empty(candidates); } }