From 3eccafad6b0915cfa05ab09e8a2d859327dbc529 Mon Sep 17 00:00:00 2001 From: Eric Rakestraw Date: Wed, 17 Jun 2026 16:07:40 +0000 Subject: [PATCH] Remove static batch report resolution --- internal/app/app.go | 21 +--------- internal/app/app_test.go | 19 --------- internal/app/batch_plan.go | 2 +- internal/app/batch_plan_test.go | 36 ++++++++--------- internal/report/period.go | 38 +---------------- internal/report/period_test.go | 72 --------------------------------- 6 files changed, 21 insertions(+), 167 deletions(-) diff --git a/internal/app/app.go b/internal/app/app.go index 0043c8a..da8cd86 100644 --- a/internal/app/app.go +++ b/internal/app/app.go @@ -272,7 +272,7 @@ func RunBatchDetailed(ctx context.Context, req BatchRequest) (*BatchResult, erro if err != nil { return nil, err } - plannedReports, err := planBatchReports(req, now, *collection) + plannedReports, err := planBatchRun(req, now, *collection) if err != nil { return nil, err } @@ -398,25 +398,6 @@ func ResolveGenerate(req GenerateRequest, now time.Time) (report.Resolved, error }) } -func ResolveBatch(req BatchRequest, now time.Time) ([]report.Resolved, error) { - location, err := timeutil.LoadLocation(req.Config.WeatherAPI.Timezone) - if err != nil { - return nil, err - } - batch, err := report.BatchForCommandName(string(req.Batch)) - if err != nil { - return nil, err - } - registry, err := reportRegistry(req.Config) - if err != nil { - return nil, err - } - return registry.BatchReports(batch, report.ResolveRequest{ - Now: now, - Location: location, - }) -} - func reportRegistry(cfg config.Config) (report.Registry, error) { overrides, err := cfg.ReportModuleOverrides() if err != nil { diff --git a/internal/app/app_test.go b/internal/app/app_test.go index c194582..21f0863 100644 --- a/internal/app/app_test.go +++ b/internal/app/app_test.go @@ -2214,25 +2214,6 @@ func TestResolveGenerateStorm(t *testing.T) { } } -func TestResolveBatchMorningSkipsWeekendOnSunday(t *testing.T) { - cfg := config.Defaults() - cfg.WeatherAPI.Timezone = "America/Chicago" - now := mustParse("2026-05-31T06:00:00-05:00") - - resolved, err := ResolveBatch(BatchRequest{Config: cfg, Batch: BatchMorning}, now) - if err != nil { - t.Fatalf("ResolveBatch() error = %v", err) - } - if len(resolved) != 2 { - t.Fatalf("resolved length = %d, want 2", len(resolved)) - } - for _, item := range resolved { - if item.Definition.ID == report.Weekend { - t.Fatal("morning batch included weekend on Sunday") - } - } -} - func TestRunBatchContinuesAfterReportFailure(t *testing.T) { server := dailyBundleServer(t) cfg := dailyWorkspaceConfig(t, server) diff --git a/internal/app/batch_plan.go b/internal/app/batch_plan.go index 09c785a..5f0ff1a 100644 --- a/internal/app/batch_plan.go +++ b/internal/app/batch_plan.go @@ -15,7 +15,7 @@ type plannedBatchReport struct { OutputCopyName string } -func planBatchReports(req BatchRequest, now time.Time, collection collect.Result) ([]plannedBatchReport, error) { +func planBatchRun(req BatchRequest, now time.Time, collection collect.Result) ([]plannedBatchReport, error) { location, err := timeutil.LoadLocation(req.Config.WeatherAPI.Timezone) if err != nil { return nil, err diff --git a/internal/app/batch_plan_test.go b/internal/app/batch_plan_test.go index 2c25d16..63c915e 100644 --- a/internal/app/batch_plan_test.go +++ b/internal/app/batch_plan_test.go @@ -12,39 +12,39 @@ import ( "gitea.maximumdirect.net/eric/weatherreporter/internal/weatherdata" ) -func TestPlanBatchReportsMorningOrder(t *testing.T) { +func TestPlanBatchRunMorningOrder(t *testing.T) { location := mustLoadTestLocation(t, "America/Chicago") hourly := hourlyRun(fullDayPeriods(t, "2026-05-31", location)...) - planned, err := planBatchReports(BatchRequest{Config: planningConfig(), Batch: BatchMorning}, mustParse("2026-05-29T08:00:00-05:00"), collectionWithHourly(hourly)) + planned, err := planBatchRun(BatchRequest{Config: planningConfig(), Batch: BatchMorning}, mustParse("2026-05-29T08:00:00-05:00"), collectionWithHourly(hourly)) if err != nil { - t.Fatalf("planBatchReports() error = %v", err) + t.Fatalf("planBatchRun() error = %v", err) } assertPlannedReportIDs(t, planned, report.Today, report.Tomorrow, report.Daily) } -func TestPlanBatchReportsEveningOrder(t *testing.T) { +func TestPlanBatchRunEveningOrder(t *testing.T) { location := mustLoadTestLocation(t, "America/Chicago") hourly := hourlyRun(fullDayPeriods(t, "2026-05-31", location)...) - planned, err := planBatchReports(BatchRequest{Config: planningConfig(), Batch: BatchEvening}, mustParse("2026-05-29T18:00:00-05:00"), collectionWithHourly(hourly)) + planned, err := planBatchRun(BatchRequest{Config: planningConfig(), Batch: BatchEvening}, mustParse("2026-05-29T18:00:00-05:00"), collectionWithHourly(hourly)) if err != nil { - t.Fatalf("planBatchReports() error = %v", err) + t.Fatalf("planBatchRun() error = %v", err) } assertPlannedReportIDs(t, planned, report.Tomorrow, report.Daily) } -func TestPlanBatchReportsDynamicDailyDatesStartAfterTomorrow(t *testing.T) { +func TestPlanBatchRunDynamicDailyDatesStartAfterTomorrow(t *testing.T) { location := mustLoadTestLocation(t, "America/Chicago") periods := fullDayPeriods(t, "2026-05-30", location) periods = append(periods, fullDayPeriods(t, "2026-05-31", location)...) periods = append(periods, fullDayPeriods(t, "2026-06-01", location)...) - planned, err := planBatchReports(BatchRequest{Config: planningConfig(), Batch: BatchMorning}, mustParse("2026-05-29T08:00:00-05:00"), collectionWithHourly(hourlyRun(periods...))) + planned, err := planBatchRun(BatchRequest{Config: planningConfig(), Batch: BatchMorning}, mustParse("2026-05-29T08:00:00-05:00"), collectionWithHourly(hourlyRun(periods...))) if err != nil { - t.Fatalf("planBatchReports() error = %v", err) + t.Fatalf("planBatchRun() error = %v", err) } daily := plannedDailyReports(planned) @@ -55,10 +55,10 @@ func TestPlanBatchReportsDynamicDailyDatesStartAfterTomorrow(t *testing.T) { assertPlanningPeriod(t, daily[1].Resolved.ValidPeriod, "2026-06-01T00:00:00-05:00", "2026-06-02T00:00:00-05:00") } -func TestPlanBatchReportsMorningExcludesLegacyStaticReports(t *testing.T) { - planned, err := planBatchReports(BatchRequest{Config: planningConfig(), Batch: BatchMorning}, mustParse("2026-05-29T08:00:00-05:00"), collect.Result{Bundle: &weatherdata.Bundle{}}) +func TestPlanBatchRunMorningExcludesLegacyStaticReports(t *testing.T) { + planned, err := planBatchRun(BatchRequest{Config: planningConfig(), Batch: BatchMorning}, mustParse("2026-05-29T08:00:00-05:00"), collect.Result{Bundle: &weatherdata.Bundle{}}) if err != nil { - t.Fatalf("planBatchReports() error = %v", err) + t.Fatalf("planBatchRun() error = %v", err) } for _, item := range planned { @@ -68,13 +68,13 @@ func TestPlanBatchReportsMorningExcludesLegacyStaticReports(t *testing.T) { } } -func TestPlanBatchReportsDynamicDailyOutputCopyNames(t *testing.T) { +func TestPlanBatchRunDynamicDailyOutputCopyNames(t *testing.T) { location := mustLoadTestLocation(t, "America/Chicago") hourly := hourlyRun(fullDayPeriods(t, "2026-05-31", location)...) - planned, err := planBatchReports(BatchRequest{Config: planningConfig(), Batch: BatchEvening}, mustParse("2026-05-29T18:00:00-05:00"), collectionWithHourly(hourly)) + planned, err := planBatchRun(BatchRequest{Config: planningConfig(), Batch: BatchEvening}, mustParse("2026-05-29T18:00:00-05:00"), collectionWithHourly(hourly)) if err != nil { - t.Fatalf("planBatchReports() error = %v", err) + t.Fatalf("planBatchRun() error = %v", err) } daily := plannedDailyReports(planned) @@ -89,10 +89,10 @@ func TestPlanBatchReportsDynamicDailyOutputCopyNames(t *testing.T) { } } -func TestPlanBatchReportsRejectsUnknownBatch(t *testing.T) { - _, err := planBatchReports(BatchRequest{Config: planningConfig(), Batch: BatchKind("hourly")}, mustParse("2026-05-29T08:00:00-05:00"), collect.Result{Bundle: &weatherdata.Bundle{}}) +func TestPlanBatchRunRejectsUnknownBatch(t *testing.T) { + _, err := planBatchRun(BatchRequest{Config: planningConfig(), Batch: BatchKind("hourly")}, mustParse("2026-05-29T08:00:00-05:00"), collect.Result{Bundle: &weatherdata.Bundle{}}) if err == nil || !strings.Contains(err.Error(), `unknown batch command "hourly"`) { - t.Fatalf("planBatchReports() error = %v, want unknown batch command", err) + t.Fatalf("planBatchRun() error = %v, want unknown batch command", err) } } diff --git a/internal/report/period.go b/internal/report/period.go index ecd5c3d..4431eaf 100644 --- a/internal/report/period.go +++ b/internal/report/period.go @@ -1,9 +1,6 @@ package report -import ( - "fmt" - "time" -) +import "time" func Resolve(id ID, req ResolveRequest) (Resolved, error) { return DefaultRegistry().Resolve(id, req) @@ -17,39 +14,6 @@ func (r Registry) Resolve(id ID, req ResolveRequest) (Resolved, error) { return r.resolveDefinition(definition, req) } -func (r Registry) BatchReports(batch Batch, req ResolveRequest) ([]Resolved, error) { - if req.Location == nil { - req.Location = time.UTC - } - if req.Now.IsZero() { - req.Now = time.Now() - } - switch batch { - case Morning: - ids := []ID{Today, ThreeDay} - if req.Now.In(req.Location).Weekday() != time.Sunday { - ids = append(ids, Weekend) - } - return r.resolveIDs(ids, req) - case Evening: - return r.resolveIDs([]ID{Tomorrow}, req) - default: - return nil, fmt.Errorf("unknown batch %q", batch) - } -} - -func (r Registry) resolveIDs(ids []ID, req ResolveRequest) ([]Resolved, error) { - resolved := make([]Resolved, 0, len(ids)) - for _, id := range ids { - item, err := r.Resolve(id, req) - if err != nil { - return nil, err - } - resolved = append(resolved, item) - } - return resolved, nil -} - func (r Registry) resolveDefinition(definition Definition, req ResolveRequest) (Resolved, error) { if req.Location == nil { req.Location = time.UTC diff --git a/internal/report/period_test.go b/internal/report/period_test.go index fcd57a2..6e9a982 100644 --- a/internal/report/period_test.go +++ b/internal/report/period_test.go @@ -241,55 +241,6 @@ func TestStormResolve(t *testing.T) { } } -func TestMorningBatchSkipsWeekendOnSunday(t *testing.T) { - location := mustLoadLocation(t) - resolved, err := DefaultRegistry().BatchReports(Morning, ResolveRequest{ - Now: mustParse("2026-05-31T06:00:00-05:00"), - Location: location, - }) - if err != nil { - t.Fatalf("BatchReports() error = %v", err) - } - ids := resolvedIDs(resolved) - if strings.Join(ids, ",") != "today,three_day" { - t.Fatalf("ids = %v, want today and three_day", ids) - } -} - -func TestEveningBatchIncludesTomorrow(t *testing.T) { - location := mustLoadLocation(t) - resolved, err := DefaultRegistry().BatchReports(Evening, ResolveRequest{ - Now: mustParse("2026-05-29T18:00:00-05:00"), - Location: location, - }) - if err != nil { - t.Fatalf("BatchReports() error = %v", err) - } - ids := resolvedIDs(resolved) - if strings.Join(ids, ",") != "tomorrow" { - t.Fatalf("ids = %v, want tomorrow", ids) - } -} - -func TestBatchesDoNotIncludeManualReports(t *testing.T) { - location := mustLoadLocation(t) - req := ResolveRequest{Now: mustParse("2026-05-29T06:00:00-05:00"), Location: location} - - morning, err := DefaultRegistry().BatchReports(Morning, req) - if err != nil { - t.Fatalf("BatchReports(morning) error = %v", err) - } - evening, err := DefaultRegistry().BatchReports(Evening, req) - if err != nil { - t.Fatalf("BatchReports(evening) error = %v", err) - } - for _, resolved := range append(morning, evening...) { - if resolved.Definition.ID == Hourly || resolved.Definition.ID == Daily { - t.Fatalf("batch included %q, want manual reports excluded", resolved.Definition.ID) - } - } -} - func TestIDForCommandName(t *testing.T) { tests := []struct { name string @@ -409,21 +360,6 @@ func TestBatchForCommandName(t *testing.T) { } } -func TestMorningBatchReportOrder(t *testing.T) { - location := mustLoadLocation(t) - resolved, err := DefaultRegistry().BatchReports(Morning, ResolveRequest{ - Now: mustParse("2026-05-29T06:00:00-05:00"), - Location: location, - }) - if err != nil { - t.Fatalf("BatchReports() error = %v", err) - } - ids := resolvedIDs(resolved) - if strings.Join(ids, ",") != "today,three_day,weekend" { - t.Fatalf("ids = %v, want morning report order", ids) - } -} - func TestRegistryLookupErrorIsActionable(t *testing.T) { _, err := DefaultRegistry().Lookup(ID("unknown")) if err == nil { @@ -813,14 +749,6 @@ func assertPeriod(t *testing.T, period timeutil.Period, wantStart string, wantEn } } -func resolvedIDs(resolved []Resolved) []string { - ids := make([]string, 0, len(resolved)) - for _, item := range resolved { - ids = append(ids, string(item.Definition.ID)) - } - return ids -} - func resolvedDefinitionIDs(definitions []Definition) []string { ids := make([]string, 0, len(definitions)) for _, definition := range definitions {