CI / build-and-test (push) Canceled after 0s
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
161 lines
7.6 KiB
C#
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);
|
|
}
|
|
}
|