Klausuren-Hauptseite: gruppenübergreifende Liste mit Prioritäts-Score statt Datum

Sidebar-Klausuren war bisher ein Placeholder. Neue Seite zeigt alle Klausuren des
Schuljahres sortiert nach abgeleiteter Dringlichkeit (Korrekturfortschritt statt
manuellem Status), mit Detailbereich, Parallelkurs-Umschalter und Notenspiegel.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-29 01:27:18 +02:00
co-authored by Claude Sonnet 5
parent 9b04d7eb98
commit 7fbf035cbb
16 changed files with 950 additions and 6 deletions
+102
View File
@@ -0,0 +1,102 @@
using LehrerApp.Core.Models;
using LehrerApp.Core.Services;
using Xunit;
namespace LehrerApp.Tests;
public class ExamPriorityServiceTests
{
private static Exam MakeExam(ExamStatus status, DateOnly date) => new()
{
GroupId = Guid.NewGuid(), Title = "Klausur", Status = status, Date = date,
};
[Fact]
public void Evaluate_UnbearbeiteteKorrekturSteigtMitAlter()
{
var today = new DateOnly(2026, 8, 29);
var exam = MakeExam(ExamStatus.Conducted, today.AddDays(-10));
var result = ExamPriorityService.Evaluate(exam, expected: 20, evaluated: 0, today);
Assert.Equal(ExamListStatus.AwaitingCorrection, result.Status);
}
[Fact]
public void Evaluate_UnbearbeiteteKorrekturIstDringenderAlsLaufendeKorrektur()
{
var today = new DateOnly(2026, 8, 29);
var untouched = MakeExam(ExamStatus.Conducted, today.AddDays(-10));
var inProgress = MakeExam(ExamStatus.Conducted, today.AddDays(-10));
var untouchedResult = ExamPriorityService.Evaluate(untouched, expected: 20, evaluated: 0, today);
var progressResult = ExamPriorityService.Evaluate(inProgress, expected: 20, evaluated: 10, today);
Assert.True(untouchedResult.Score > progressResult.Score);
}
[Fact]
public void Evaluate_LaufendeKorrekturIstDringenderAlsGeplanteKlausur()
{
var today = new DateOnly(2026, 8, 29);
var inProgress = MakeExam(ExamStatus.Conducted, today.AddDays(-2));
var planned = MakeExam(ExamStatus.Planned, today.AddDays(1));
var progressResult = ExamPriorityService.Evaluate(inProgress, expected: 20, evaluated: 10, today);
var plannedResult = ExamPriorityService.Evaluate(planned, expected: 20, evaluated: 0, today);
Assert.True(progressResult.Score > plannedResult.Score);
}
[Fact]
public void Evaluate_HängengebliebeneKorrekturFälltAusDerDringlichenZone()
{
var today = new DateOnly(2026, 8, 29);
var stuck = MakeExam(ExamStatus.Conducted, today.AddDays(-(ExamPriorityService.StuckAfterDays + 5)));
var fresh = MakeExam(ExamStatus.Conducted, today.AddDays(-2));
// Ein einzelner nie nachschreibender Schüler: 19 von 20 erledigt, seit Wochen unverändert.
var stuckResult = ExamPriorityService.Evaluate(stuck, expected: 20, evaluated: 19, today);
var freshResult = ExamPriorityService.Evaluate(fresh, expected: 20, evaluated: 10, today);
Assert.Equal(ExamListStatus.CorrectionStuck, stuckResult.Status);
Assert.True(stuckResult.Score < freshResult.Score);
}
[Fact]
public void Evaluate_VollständigBewertetGiltAlsBereitZurRückgabe()
{
var today = new DateOnly(2026, 8, 29);
var exam = MakeExam(ExamStatus.Conducted, today.AddDays(-5));
var result = ExamPriorityService.Evaluate(exam, expected: 20, evaluated: 20, today);
Assert.Equal(ExamListStatus.AwaitingReturn, result.Status);
}
[Fact]
public void Evaluate_ZurückgegebenIstAmWenigstenDringlich()
{
var today = new DateOnly(2026, 8, 29);
var returned = MakeExam(ExamStatus.Returned, today.AddDays(-30));
var planned = MakeExam(ExamStatus.Planned, today.AddDays(60));
var returnedResult = ExamPriorityService.Evaluate(returned, expected: 20, evaluated: 20, today);
var plannedResult = ExamPriorityService.Evaluate(planned, expected: 20, evaluated: 0, today);
Assert.True(returnedResult.Score < plannedResult.Score);
}
[Fact]
public void Count_AbwesenderSchülerGiltAlsErledigt()
{
var exam = MakeExam(ExamStatus.Conducted, new DateOnly(2026, 8, 20));
var membership = new GroupMembership { GroupId = exam.GroupId, StudentId = Guid.NewGuid() };
var results = new List<ExamResult> { new() { ExamId = exam.Id, StudentId = membership.StudentId, Absent = true } };
var (expected, evaluated) = ExamCorrectionCounter.Count(exam, [membership], results);
Assert.Equal(1, expected);
Assert.Equal(1, evaluated);
}
}