Files
LehrerApp/LehrerApp.Desktop.Tests/ExamRevealDialogViewModelTests.cs
T
adminandClaude Opus 5.5 4f61c1fbd2
CI / build-and-test (push) Canceled after 0s
Datenschutzkonforme Einzelansicht für Klausurergebnisse
Neuer Dialog ExamRevealDialog: zeigt zunächst nur den Namen eines Schülers,
erst nach „Aufdecken“ Note, Punktzahl und Punkte je Aufgabe. Blättern und
gezielte Auswahl oben; jeder Schülerwechsel deckt wieder zu. Erreichbar über
„Einzelansicht“ im Klausuren-Tab und auf der Klausuren-Hauptseite.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-06 08:15:45 +02:00

95 lines
3.2 KiB
C#

using LehrerApp.Core.Models;
using LehrerApp.Core.Services;
using LehrerApp.Desktop.ViewModels.Groups;
using Xunit;
namespace LehrerApp.Desktop.Tests;
/// Deckt 1.7.1 (datenschutzkonforme Einzelansicht) ab.
public sealed class ExamRevealDialogViewModelTests
{
private static (ExamRevealDialogViewModel Vm, Student Anna, Student Ben) Build()
{
var group = new LearningGroup { Name = "Q1 Chemie" };
var anna = new Student { FirstName = "Anna", LastName = "Bauer" };
var ben = new Student { FirstName = "Ben", LastName = "Cordes" };
var withoutResult = new Student { FirstName = "Cara", LastName = "Diehl" };
var exam = new Exam
{
GroupId = group.Id,
Title = "Klausur 1",
Tasks =
[
new ExamTask { Nr = 1, MaxPoints = 10 },
new ExamTask { Nr = 2, MaxPoints = 10, Variant = ExamVariant.A },
new ExamTask { Nr = 3, MaxPoints = 20, Variant = ExamVariant.B },
],
GradingKey = GradingService.DefaultKey1To6(),
};
var results = new FakeResults();
// Bewusst in "falscher" Reihenfolge eingefügt — die Liste sortiert nach Nachname.
results.Add(new ExamResult { ExamId = exam.Id, StudentId = ben.Id, Absent = true });
results.Add(new ExamResult
{
ExamId = exam.Id, StudentId = anna.Id, Points = [7.5, 9, 0], TotalPoints = 16.5,
Grade = "2", Variant = ExamVariant.A,
});
var vm = new ExamRevealDialogViewModel(results, new FakeStudents([ben, withoutResult, anna]),
new GradingService(), exam);
return (vm, anna, ben);
}
[Fact]
public void Start_ZeigtErstenSchülerZugedeckt_UndNurSchülerMitErgebnis()
{
var (vm, _, _) = Build();
Assert.Equal(["Bauer, Anna", "Cordes, Ben"], vm.Students.Select(s => s.ListName));
Assert.Equal("Anna Bauer", vm.SelectedStudent!.DisplayName);
Assert.False(vm.IsRevealed);
Assert.Equal("1 / 2", vm.PositionLabel);
}
[Fact]
public void Ergebnis_ZeigtNotePunkteUndNurAufgabenDerGeschriebenenFassung()
{
var (vm, _, _) = Build();
var anna = vm.SelectedStudent!;
Assert.Equal("2", anna.GradeDisplay);
Assert.Equal("16,5 von 20 Punkten", anna.PointsDisplay);
Assert.Equal(
[new ExamRevealTaskRow("Aufgabe 1", "7,5", "10"), new ExamRevealTaskRow("Aufgabe 2", "9", "10")],
anna.Tasks);
}
[Fact]
public void Schülerwechsel_DecktWiederZu()
{
var (vm, _, _) = Build();
vm.RevealCommand.Execute(null);
Assert.True(vm.IsRevealed);
vm.NextCommand.Execute(null);
Assert.False(vm.IsRevealed);
Assert.Equal("Ben Cordes", vm.SelectedStudent!.DisplayName);
Assert.True(vm.SelectedStudent.Absent);
Assert.Empty(vm.SelectedStudent.Tasks);
Assert.False(vm.NextCommand.CanExecute(null));
Assert.True(vm.PreviousCommand.CanExecute(null));
}
[Fact]
public void Zudecken_VerstecktErgebnisWieder()
{
var (vm, _, _) = Build();
vm.RevealCommand.Execute(null);
vm.HideCommand.Execute(null);
Assert.False(vm.IsRevealed);
}
}