Cron: Bereich mit Schritt (7-22/3) lesen, ungueltige Ausdruecke im Scanner melden (#597)

Der Nachrichten-Digest im Dauerbetrieb der Test-VM lief nie: CronExpression
verstand 'von-bis/schritt' nicht, TaskSchedule verschluckte den Fehler.
Version 0.1.5.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Richard
2026-09-14 15:51:36 +02:00
co-authored by Claude Opus 5
parent 6581fd0187
commit 8ab9d99abe
6 changed files with 118 additions and 13 deletions
@@ -13,6 +13,42 @@ public sealed class TaskScheduleTests
private static DateTime Utc(int y, int mo, int d, int h, int mi)
=> new(y, mo, d, h, mi, 0, DateTimeKind.Utc);
// ─── #597: ungültiger Cron-Ausdruck ───
[Fact]
public void Ungueltiger_Cron_Ausdruck_wird_benannt_statt_verschwiegen()
{
var task = new TaskItem
{
Id = "t-1", CreatedAt = Utc(2026, 9, 14, 6, 0),
When = new TaskWhen { Kind = TaskWhenKind.Cron, Value = "0 7-22/x * * *", TimeZone = "Europe/Berlin" }
};
TaskSchedule.DueOccurrence(task, Utc(2026, 9, 14, 11, 0)).ShouldBeNull();
TaskSchedule.InvalidCron(task).ShouldNotBeNull().ShouldContain("'x' ist keine Zahl");
}
[Fact]
public void Nachrichten_Digest_aus_dem_Testbetrieb_ist_um_13_Uhr_faellig()
{
var task = new TaskItem
{
Id = "t-7e0bbe", CreatedAt = Utc(2026, 9, 14, 10, 30),
When = new TaskWhen { Kind = TaskWhenKind.Cron, Value = "0 7-22/3 * * *", TimeZone = "Europe/Berlin" }
};
TaskSchedule.InvalidCron(task).ShouldBeNull();
// 13:00 Berlin (MESZ) = 11:00 UTC
TaskSchedule.DueOccurrence(task, Utc(2026, 9, 14, 11, 0)).ShouldBe("2026-09-14T11:00:00.0000000Z");
}
[Fact]
public void Andere_Terminarten_haben_keinen_Cron_Fehler()
=> TaskSchedule.InvalidCron(new TaskItem
{
Id = "t-1", When = new TaskWhen { Kind = TaskWhenKind.Every, Value = "kaputt" }
}).ShouldBeNull();
// ─── Einmalig, ohne Termin ───
[Fact]