Vier neue xUnit-Testprojekte (LehrerApp.Tests, .Data.Tests, .Desktop.Tests, .Sync.Tests) mit zusammen 104 Tests: GradingService, SchoolYearService, Repositories gegen In-Memory-LiteDB, Mitarbeits-Aggregation (3.2), Zeugnisnotenberechnung (2.4) und ConflictResolver. Dabei zwei echte Fehler in der Sync-Schicht gefunden und behoben: - SyncEvent.EventId fehlte [BsonId], wodurch EventQueue.Acknowledge() nie etwas aus der Queue löschte. - ConflictResolver verglich Zeitstempel unterschiedlicher DateTimeKind direkt (LiteDB liefert Local statt Utc zurück), was die Gleichstand- Regel außerhalb von UTC+0 verfälschte. SchoolYearService.CurrentSchoolYear()/RecentSchoolYears() um ein optionales today-Argument erweitert, um den Schuljahreswechsel deterministisch zu testen; LiteDbContext um einen Stream-Konstruktor für In-Memory-Tests.
28 lines
1.1 KiB
C#
28 lines
1.1 KiB
C#
namespace LehrerApp.Core.Services;
|
|
|
|
public class SchoolYearService
|
|
{
|
|
/// <param name="today">Nur für Tests — Standard ist das heutige Datum.</param>
|
|
public string CurrentSchoolYear(DateOnly? today = null) =>
|
|
FormatSchoolYear(StartYearFor(today ?? DateOnly.FromDateTime(DateTime.Today)));
|
|
|
|
public string FormatSchoolYear(int startYear) =>
|
|
$"{startYear}/{(startYear + 1) % 100:D2}";
|
|
|
|
public DateOnly SchoolYearStart(string sy) =>
|
|
new(int.Parse(sy.Split('/')[0]), 8, 1);
|
|
|
|
public DateOnly SchoolYearEnd(string sy) =>
|
|
new(int.Parse(sy.Split('/')[0]) + 1, 7, 31);
|
|
|
|
/// <param name="today">Nur für Tests — Standard ist das heutige Datum.</param>
|
|
public List<string> RecentSchoolYears(int count = 5, DateOnly? today = null)
|
|
{
|
|
var cur = StartYearFor(today ?? DateOnly.FromDateTime(DateTime.Today));
|
|
return Enumerable.Range(0, count).Select(i => FormatSchoolYear(cur - i)).ToList();
|
|
}
|
|
|
|
// Schuljahreswechsel liegt am 1. August: ab diesem Tag zählt das neue Schuljahr.
|
|
private static int StartYearFor(DateOnly date) => date.Month >= 8 ? date.Year : date.Year - 1;
|
|
}
|