CI / build-and-test (push) Canceled after 0s
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>
95 lines
3.2 KiB
C#
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);
|
|
}
|
|
}
|