Unterrichtsplanung: Serienerzeugung, Stundenraster, Aufsichten & Vertretung (Kapitel 4.2/4.3 Nachtrag)
Stunden serienweise aus dem Stundenplan erzeugen (4.2.5); Stundenraster (Uhrzeiten je Stunde) in den Einstellungen mit Zeitbedarf-Rückmeldung im Verlaufsplan-Editor; wiederkehrende Pausenaufsicht; neuer "Vertretung eintragen"-Dialog für einmalige Vertretungsaufsicht, Vertretungsstunde, Sondereinsätze (Ausflüge, Berufsmessen) und schlichten Stundenausfall. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
@@ -8,7 +8,8 @@ namespace LehrerApp.Desktop.Tests;
|
||||
|
||||
public sealed class SettingsViewModelTests
|
||||
{
|
||||
private static SettingsViewModel BuildViewModel(FakeSchoolHolidays? holidays = null)
|
||||
private static SettingsViewModel BuildViewModel(FakeSchoolHolidays? holidays = null,
|
||||
FakeSupervisionDuties? supervisionDuties = null)
|
||||
{
|
||||
// Bewusst kein "using": SchoolCalendarSettingsService liest den Pfad erst bei SetState,
|
||||
// das Verzeichnis muss über die Lebensdauer des ViewModels bestehen bleiben.
|
||||
@@ -22,7 +23,8 @@ public sealed class SettingsViewModelTests
|
||||
new DatabaseEncryptionService(), new AppLockService(tempPath),
|
||||
new LiteDbContext(new MemoryStream()), new PrivacySettingsService(tempPath),
|
||||
new FakeDocumentation(), new FakeStudents([]), new FakeShorthandCodes([]),
|
||||
holidays ?? new FakeSchoolHolidays(), new SchoolCalendarSettingsService(tempPath));
|
||||
holidays ?? new FakeSchoolHolidays(), new SchoolCalendarSettingsService(tempPath),
|
||||
new PeriodScheduleService(tempPath), supervisionDuties ?? new FakeSupervisionDuties());
|
||||
}
|
||||
|
||||
[Fact]
|
||||
@@ -97,10 +99,123 @@ public sealed class SettingsViewModelTests
|
||||
new DatabaseEncryptionService(), new AppLockService(tempPath),
|
||||
new LiteDbContext(new MemoryStream()), new PrivacySettingsService(tempPath),
|
||||
new FakeDocumentation(), new FakeStudents([]), new FakeShorthandCodes([]),
|
||||
new FakeSchoolHolidays(), calendarSettings);
|
||||
new FakeSchoolHolidays(), calendarSettings, new PeriodScheduleService(tempPath),
|
||||
new FakeSupervisionDuties());
|
||||
|
||||
vm.SelectedStateName = "Bayern";
|
||||
|
||||
Assert.Equal(GermanState.BY, calendarSettings.State);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void SavePeriodTimes_GueltigeEingabe_WirdPersistiert()
|
||||
{
|
||||
var tempPath = System.IO.Path.Combine(
|
||||
System.IO.Path.GetTempPath(), $"lehrerapp-settingsvm-periods-tests-{Guid.NewGuid():N}");
|
||||
Directory.CreateDirectory(tempPath);
|
||||
var periodSchedule = new PeriodScheduleService(tempPath);
|
||||
|
||||
var vm = new SettingsViewModel(
|
||||
new FakeSubjects([]), new FakeCompetencyDomains(), new FakeGradingKeyTemplates(),
|
||||
new FakeSchemes(), new GradingService(), new BackupService(tempPath),
|
||||
new DatabaseEncryptionService(), new AppLockService(tempPath),
|
||||
new LiteDbContext(new MemoryStream()), new PrivacySettingsService(tempPath),
|
||||
new FakeDocumentation(), new FakeStudents([]), new FakeShorthandCodes([]),
|
||||
new FakeSchoolHolidays(), new SchoolCalendarSettingsService(tempPath), periodSchedule,
|
||||
new FakeSupervisionDuties());
|
||||
|
||||
vm.PeriodTimes[0].StartText = "08:00";
|
||||
vm.PeriodTimes[0].EndText = "08:45";
|
||||
|
||||
vm.SavePeriodTimesCommand.Execute(null);
|
||||
|
||||
Assert.Equal("", vm.PeriodTimesError);
|
||||
Assert.Equal(45, periodSchedule.GetDurationMinutes(1));
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void SavePeriodTimes_EndeVorBeginn_SetztFehlerUndSpeichertNicht()
|
||||
{
|
||||
var tempPath = System.IO.Path.Combine(
|
||||
System.IO.Path.GetTempPath(), $"lehrerapp-settingsvm-periods-invalid-tests-{Guid.NewGuid():N}");
|
||||
Directory.CreateDirectory(tempPath);
|
||||
var periodSchedule = new PeriodScheduleService(tempPath);
|
||||
|
||||
var vm = new SettingsViewModel(
|
||||
new FakeSubjects([]), new FakeCompetencyDomains(), new FakeGradingKeyTemplates(),
|
||||
new FakeSchemes(), new GradingService(), new BackupService(tempPath),
|
||||
new DatabaseEncryptionService(), new AppLockService(tempPath),
|
||||
new LiteDbContext(new MemoryStream()), new PrivacySettingsService(tempPath),
|
||||
new FakeDocumentation(), new FakeStudents([]), new FakeShorthandCodes([]),
|
||||
new FakeSchoolHolidays(), new SchoolCalendarSettingsService(tempPath), periodSchedule,
|
||||
new FakeSupervisionDuties());
|
||||
|
||||
vm.PeriodTimes[0].StartText = "08:45";
|
||||
vm.PeriodTimes[0].EndText = "08:00";
|
||||
|
||||
vm.SavePeriodTimesCommand.Execute(null);
|
||||
|
||||
Assert.NotEqual("", vm.PeriodTimesError);
|
||||
Assert.Equal(0, periodSchedule.GetDurationMinutes(1));
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void AddSupervisionDuty_GueltigeEingabe_WirdGespeichertUndInListeAngezeigt()
|
||||
{
|
||||
var duties = new FakeSupervisionDuties();
|
||||
var vm = BuildViewModel(supervisionDuties: duties);
|
||||
vm.NewDutyWeekdayName = "Montag";
|
||||
vm.NewDutyAfterPeriod = 2;
|
||||
vm.NewDutyLocation = "Pausenhof";
|
||||
|
||||
vm.AddSupervisionDutyCommand.Execute(null);
|
||||
|
||||
Assert.Single(duties.GetAll());
|
||||
Assert.Single(vm.SupervisionDuties);
|
||||
Assert.Equal(DayOfWeek.Monday, duties.GetAll()[0].Weekday);
|
||||
Assert.Equal(2, duties.GetAll()[0].AfterPeriod);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void AddSupervisionDuty_FehlenderOrt_SetztFehlerUndSpeichertNicht()
|
||||
{
|
||||
var duties = new FakeSupervisionDuties();
|
||||
var vm = BuildViewModel(supervisionDuties: duties);
|
||||
vm.NewDutyWeekdayName = "Montag";
|
||||
vm.NewDutyAfterPeriod = 2;
|
||||
|
||||
vm.AddSupervisionDutyCommand.Execute(null);
|
||||
|
||||
Assert.Empty(duties.GetAll());
|
||||
Assert.NotEqual("", vm.NewDutyError);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void AddSupervisionDuty_PauseBereitsBelegt_ZeigtFreundlicheFehlermeldung()
|
||||
{
|
||||
var duties = new FakeSupervisionDuties();
|
||||
duties.Add(new SupervisionDuty { Weekday = DayOfWeek.Monday, AfterPeriod = 2, Location = "Pausenhof" });
|
||||
var vm = BuildViewModel(supervisionDuties: duties);
|
||||
vm.NewDutyWeekdayName = "Montag";
|
||||
vm.NewDutyAfterPeriod = 2;
|
||||
vm.NewDutyLocation = "Bibliothek";
|
||||
|
||||
vm.AddSupervisionDutyCommand.Execute(null);
|
||||
|
||||
Assert.Single(duties.GetAll());
|
||||
Assert.Equal("Für diese Pause ist bereits eine Aufsicht eingetragen.", vm.NewDutyError);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void RemoveSupervisionDuty_EntferntEintragAusRepositoryUndListe()
|
||||
{
|
||||
var duties = new FakeSupervisionDuties();
|
||||
duties.Add(new SupervisionDuty { Weekday = DayOfWeek.Monday, AfterPeriod = 2, Location = "Pausenhof" });
|
||||
var vm = BuildViewModel(supervisionDuties: duties);
|
||||
|
||||
vm.RemoveSupervisionDutyCommand.Execute(vm.SupervisionDuties[0]);
|
||||
|
||||
Assert.Empty(duties.GetAll());
|
||||
Assert.Empty(vm.SupervisionDuties);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user