CI / build-and-test (push) Canceled after 0s
Der Stundenplan erkennt eine Stunde nur über Datum+Stundennummer (kein gespeichertes Verknüpfungsfeld). Per JSON-Import oder KI ohne Stundenplan-Bezug angelegte Stunden ohne passende Stundennummer tauchten dort nie auf - ein Klick auf den Termin bot nur "neu anlegen" an und hätte eine Dublette erzeugt. Neuer Button im Anlegen-Dialog sucht stattdessen nach einer passenden vorhandenen Stunde und hängt sie auf den geklickten Termin um. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
95 lines
3.9 KiB
C#
95 lines
3.9 KiB
C#
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);
|
|
}
|
|
}
|