feat(schedule): support KOL subscription targets and random time windows
Extend schedule tasks to dispatch KOL subscription prompts in addition to prompt rules, add daily/weekly scheduling with fixed or random time windows, and track dispatch outcomes (last run, status, consecutive failures). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,62 @@
|
||||
package app
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
sharedschedule "github.com/geo-platform/tenant-api/internal/shared/schedule"
|
||||
)
|
||||
|
||||
func TestNormalizeSchedulePlanFixedTimeBuildsCronFromSelectedDays(t *testing.T) {
|
||||
plan, err := normalizeSchedulePlan(ScheduleTaskRequest{
|
||||
ScheduleKind: scheduleKindWeekly,
|
||||
ScheduleDays: []string{"mon", "wed", "fri"},
|
||||
ScheduleTimeMode: sharedschedule.TimeModeFixed,
|
||||
CronExpr: "17 3 * * mon,wed,fri",
|
||||
})
|
||||
if err != nil {
|
||||
t.Fatalf("normalizeSchedulePlan returned error: %v", err)
|
||||
}
|
||||
if plan.ScheduleKind != scheduleKindWeekly {
|
||||
t.Fatalf("expected weekly schedule, got %q", plan.ScheduleKind)
|
||||
}
|
||||
if plan.ScheduleTimeMode != sharedschedule.TimeModeFixed {
|
||||
t.Fatalf("expected fixed mode, got %q", plan.ScheduleTimeMode)
|
||||
}
|
||||
if plan.CronExpr != "17 3 * * mon,wed,fri" {
|
||||
t.Fatalf("unexpected cron expression: %q", plan.CronExpr)
|
||||
}
|
||||
if plan.RandomWindowStart != defaultRandomWindowStart || plan.RandomWindowEnd != defaultRandomWindowEnd {
|
||||
t.Fatalf("unexpected compatibility window: %s-%s", plan.RandomWindowStart, plan.RandomWindowEnd)
|
||||
}
|
||||
}
|
||||
|
||||
func TestNormalizeSchedulePlanRandomWindowAllowsEditableWindow(t *testing.T) {
|
||||
plan, err := normalizeSchedulePlan(ScheduleTaskRequest{
|
||||
ScheduleKind: scheduleKindWeekly,
|
||||
ScheduleDays: []string{"mon", "wed", "fri"},
|
||||
ScheduleTimeMode: sharedschedule.TimeModeRandomWindow,
|
||||
RandomWindowStart: "02:00:00",
|
||||
RandomWindowEnd: "04:30:00",
|
||||
})
|
||||
if err != nil {
|
||||
t.Fatalf("normalizeSchedulePlan returned error: %v", err)
|
||||
}
|
||||
if plan.ScheduleKind != scheduleKindWeekly {
|
||||
t.Fatalf("expected weekly schedule, got %q", plan.ScheduleKind)
|
||||
}
|
||||
if plan.ScheduleTimeMode != sharedschedule.TimeModeRandomWindow {
|
||||
t.Fatalf("expected random window mode, got %q", plan.ScheduleTimeMode)
|
||||
}
|
||||
if plan.RandomWindowStart != "02:00:00" || plan.RandomWindowEnd != "04:30:00" {
|
||||
t.Fatalf("unexpected random window: %s-%s", plan.RandomWindowStart, plan.RandomWindowEnd)
|
||||
}
|
||||
|
||||
_, err = normalizeSchedulePlan(ScheduleTaskRequest{
|
||||
ScheduleTimeMode: sharedschedule.TimeModeRandomWindow,
|
||||
RandomWindowStart: "05:00:00",
|
||||
RandomWindowEnd: "01:00:00",
|
||||
})
|
||||
if err == nil {
|
||||
t.Fatal("expected inverted random window to be rejected")
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user