Files
LehrerApp/LehrerApp.Desktop.Tests/TeachingModeOutstandingHomeworkViewModelTests.cs
T
adminandClaude Opus 5.5 6c0a2dbd2e
CI / build-and-test (push) Canceled after 0s
Nachreichungen direkt im Unterrichtsmodus erfassen
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-29 23:38:45 +02:00

161 lines
7.6 KiB
C#

using LehrerApp.Core.Models;
using LehrerApp.Desktop.ViewModels.Groups;
using Xunit;
namespace LehrerApp.Desktop.Tests;
public sealed class TeachingModeOutstandingHomeworkViewModelTests
{
[Fact]
public void Refresh_ZeigtJungeOffeneNachreichungenUndFiltertAktuellAbwesende()
{
var date = new DateOnly(2026, 9, 25);
var group = new LearningGroup { Name = "10c Chemie" };
var amelia = new Student { FirstName = "Amelia", LastName = "Gerste" };
var ben = new Student { FirstName = "Ben", LastName = "Muster" };
var carl = new Student { FirstName = "Carl", LastName = "Beispiel" };
var oldMember = new Student { FirstName = "Dana", LastName = "Alt" };
var previous = new ParticipationSession { GroupId = group.Id, Date = date.AddDays(-5) };
var older = new ParticipationSession { GroupId = group.Id, Date = date.AddDays(-130) };
var current = new ParticipationSession { GroupId = group.Id, Date = date };
var memberships = new FakeMemberships([
new GroupMembership { StudentId = amelia.Id, GroupId = group.Id },
new GroupMembership { StudentId = ben.Id, GroupId = group.Id },
new GroupMembership { StudentId = carl.Id, GroupId = group.Id },
new GroupMembership { StudentId = oldMember.Id, GroupId = group.Id,
Period = MembershipPeriod.Custom, JoinedAt = date.AddDays(-30), LeftAt = date.AddDays(-1) },
]);
var entries = new FakeEntries();
entries.Add(new ParticipationEntry { SessionId = previous.Id, StudentId = amelia.Id,
Homework = HomeworkStatus.MissingOverdue });
var benEntry = new ParticipationEntry { SessionId = previous.Id, StudentId = ben.Id,
Homework = HomeworkStatus.MissingOpen };
entries.Add(benEntry);
entries.Add(new ParticipationEntry { SessionId = previous.Id, StudentId = carl.Id,
Homework = HomeworkStatus.SubmittedLate });
entries.Add(new ParticipationEntry { SessionId = previous.Id, StudentId = oldMember.Id,
Homework = HomeworkStatus.MissingOverdue });
entries.Add(new ParticipationEntry { SessionId = older.Id, StudentId = ben.Id,
Homework = HomeworkStatus.MissingOverdue });
entries.Add(new ParticipationEntry { SessionId = current.Id, StudentId = ben.Id,
Attendance = AttendanceStatus.Present });
entries.Add(new ParticipationEntry { SessionId = current.Id, StudentId = amelia.Id,
Attendance = AttendanceStatus.ExcusePending });
var vm = new TeachingModeOutstandingHomeworkViewModel(group.Id, date,
new FakeStudents([amelia, ben, carl, oldMember]), memberships,
new FakeSessions([previous, older, current]), entries);
vm.SetCurrentSessionId(current.Id);
vm.IsExpanded = true;
Assert.Equal(ben.FullName, Assert.Single(vm.Rows).StudentName);
Assert.Equal("Offene Nachreichungen (1)", vm.Header);
vm.IncludeAbsentStudents = true;
Assert.Equal(2, vm.Rows.Count);
Assert.Contains(vm.Rows, r => r.StudentName == amelia.FullName &&
r.Status == HomeworkStatus.MissingOverdue);
vm.IncludeAbsentStudents = false;
var currentAmelia = entries.GetBySessionAndStudent(current.Id, amelia.Id)!;
currentAmelia.Attendance = AttendanceStatus.Present;
entries.Save(currentAmelia);
vm.Refresh();
Assert.Equal(2, vm.Rows.Count);
benEntry.Homework = HomeworkStatus.SubmittedLate;
entries.Save(benEntry);
vm.Refresh();
Assert.Equal(amelia.FullName, Assert.Single(vm.Rows).StudentName);
}
[Theory]
[InlineData(HomeworkStatus.MissingOpen, "submitted", HomeworkStatus.SubmittedLate)]
[InlineData(HomeworkStatus.MissingOpen, "final", HomeworkStatus.MissingOverdue)]
[InlineData(HomeworkStatus.MissingOpen, "partial", HomeworkStatus.PartialMissingOverdue)]
[InlineData(HomeworkStatus.MissingOverdue, "submitted", HomeworkStatus.SubmittedLate)]
[InlineData(HomeworkStatus.PartiallyCompleted, "submitted", HomeworkStatus.PartialSubmittedLate)]
[InlineData(HomeworkStatus.PartiallyCompleted, "final", HomeworkStatus.PartialMissingOverdue)]
[InlineData(HomeworkStatus.PartialMissingOverdue, "submitted", HomeworkStatus.PartialSubmittedLate)]
public void Zeilenaktionen_SetzenPassendenEndstatus(HomeworkStatus start, string action, HomeworkStatus expected)
{
var (vm, entries, entry) = CreateSingle(start);
vm.Refresh();
var row = Assert.Single(vm.Rows);
var command = action switch
{
"submitted" => row.MarkSubmittedCommand,
"final" => row.MarkFinalCommand,
_ => row.MarkPartialCommand,
};
command.Execute(null);
var saved = entries.GetBySessionAndStudent(entry.SessionId, entry.StudentId)!;
Assert.Equal(expected, saved.Homework);
Assert.Equal(HomeworkDisplay.CountsAsMissing(expected), saved.HomeworkMissing);
Assert.Equal(HomeworkDisplay.CountsAsMissing(expected), vm.Rows.Count == 1);
}
[Fact]
public void Zeilenaktionen_BietenNurSinnvolleOptionenAn()
{
var (vm, _, _) = CreateSingle(HomeworkStatus.MissingOverdue);
vm.Refresh();
var overdue = Assert.Single(vm.Rows);
Assert.False(overdue.CanMarkFinal);
Assert.True(overdue.CanMarkPartial);
(vm, _, _) = CreateSingle(HomeworkStatus.PartiallyCompleted);
vm.Refresh();
var partial = Assert.Single(vm.Rows);
Assert.True(partial.CanMarkFinal);
Assert.False(partial.CanMarkPartial);
(vm, _, _) = CreateSingle(HomeworkStatus.MissingOpen, isReadOnly: true);
vm.Refresh();
Assert.False(Assert.Single(vm.Rows).CanEdit);
}
[Fact]
public void Undo_StelltVorherigenStatusWiederHer()
{
var (vm, entries, entry) = CreateSingle(HomeworkStatus.MissingOpen);
var changed = 0;
vm.OnHomeworkChanged = () => changed++;
vm.Refresh();
Assert.False(vm.UndoCommand.CanExecute(null));
vm.Rows[0].MarkSubmittedCommand.Execute(null);
Assert.Empty(vm.Rows);
Assert.NotNull(vm.LastChangeLabel);
Assert.True(vm.UndoCommand.CanExecute(null));
vm.UndoCommand.Execute(null);
var saved = entries.GetBySessionAndStudent(entry.SessionId, entry.StudentId)!;
Assert.Equal(HomeworkStatus.MissingOpen, saved.Homework);
Assert.True(saved.HomeworkMissing);
Assert.Single(vm.Rows);
Assert.Null(vm.LastChangeLabel);
Assert.False(vm.UndoCommand.CanExecute(null));
Assert.Equal(2, changed);
}
private static (TeachingModeOutstandingHomeworkViewModel Vm, FakeEntries Entries, ParticipationEntry Entry)
CreateSingle(HomeworkStatus status, bool isReadOnly = false)
{
var date = new DateOnly(2026, 9, 25);
var group = new LearningGroup { Name = "10c Chemie" };
var student = new Student { FirstName = "Ben", LastName = "Muster" };
var session = new ParticipationSession { GroupId = group.Id, Date = date.AddDays(-5) };
var entries = new FakeEntries();
var entry = new ParticipationEntry { SessionId = session.Id, StudentId = student.Id,
Homework = status, HomeworkMissing = true };
entries.Add(entry);
var vm = new TeachingModeOutstandingHomeworkViewModel(group.Id, date,
new FakeStudents([student]),
new FakeMemberships([new GroupMembership { StudentId = student.Id, GroupId = group.Id }]),
new FakeSessions([session]), entries, isReadOnly);
return (vm, entries, entry);
}
}