Require explicit dates for daily generation
This commit is contained in:
@@ -17,7 +17,7 @@ const helpText = `weatherreporter prepares weather reports from normalized forec
|
||||
|
||||
Usage:
|
||||
weatherreporter --help
|
||||
weatherreporter generate daily [--config PATH] [--units VALUE] [--tz NAME] [--out PATH] [--date YYYY-MM-DD]
|
||||
weatherreporter generate daily --date YYYY-MM-DD [--config PATH] [--units VALUE] [--tz NAME] [--out PATH]
|
||||
weatherreporter generate today [--config PATH] [--units VALUE] [--tz NAME] [--out PATH] [--date YYYY-MM-DD]
|
||||
weatherreporter generate tomorrow [--config PATH] [--units VALUE] [--tz NAME] [--out PATH]
|
||||
weatherreporter generate hourly [--config PATH] [--units VALUE] [--tz NAME] [--out PATH]
|
||||
@@ -217,7 +217,15 @@ func (r Runner) resolveGenerate(args []string) (app.GenerateRequest, error) {
|
||||
}
|
||||
|
||||
switch reportKind {
|
||||
case app.ReportDaily, app.ReportToday:
|
||||
case app.ReportDaily:
|
||||
if opts.Date == "" {
|
||||
return app.GenerateRequest{}, fmt.Errorf("generate daily requires --date YYYY-MM-DD")
|
||||
}
|
||||
req.Date, err = timeutil.ParseLocalDate(opts.Date, location)
|
||||
if err != nil {
|
||||
return app.GenerateRequest{}, err
|
||||
}
|
||||
case app.ReportToday:
|
||||
if opts.Date == "" {
|
||||
req.Date = timeutil.LocalDate(r.Clock.Now(), location)
|
||||
} else {
|
||||
|
||||
@@ -23,7 +23,7 @@ func TestRunHelpLongFlag(t *testing.T) {
|
||||
t.Fatalf("Run() error = %v", err)
|
||||
}
|
||||
|
||||
if !strings.Contains(output.stdout, "generate daily") {
|
||||
if !strings.Contains(output.stdout, "weatherreporter generate daily --date YYYY-MM-DD") {
|
||||
t.Fatalf("help output missing generate command:\n%s", output.stdout)
|
||||
}
|
||||
if !strings.Contains(output.stdout, "generate today") {
|
||||
@@ -571,6 +571,14 @@ func TestRunGenerateDailyWritesMarkdownReport(t *testing.T) {
|
||||
if len(reportMatches) != 1 {
|
||||
t.Fatalf("managed reports = %#v, want one", reportMatches)
|
||||
}
|
||||
rawGeneratedTextPath := oneArtifact(t, workspaceRoot, "snapshots", "daily", "2026-05-29", "*.generated_text.raw.json")
|
||||
validatedGeneratedTextPath := oneArtifact(t, workspaceRoot, "snapshots", "daily", "2026-05-29", "*.generated_text.json")
|
||||
renderContextPath := oneArtifact(t, workspaceRoot, "snapshots", "daily", "2026-05-29", "*.render_context.json")
|
||||
metadataPath := oneArtifact(t, workspaceRoot, "snapshots", "daily", "2026-05-29", "*.metadata.json")
|
||||
assertFileContains(t, rawGeneratedTextPath, `"summary": "Showers are possible during the selected day."`)
|
||||
assertFileContains(t, validatedGeneratedTextPath, `"summary":"Showers are possible during the selected day."`)
|
||||
assertFileContains(t, renderContextPath, `"Title": "Friday's Weather"`)
|
||||
assertFileContains(t, metadataPath, `"generatedTextSchemaId": "daily"`)
|
||||
}
|
||||
|
||||
func TestRunGenerateTodayWritesGeneratedTextReport(t *testing.T) {
|
||||
@@ -975,14 +983,44 @@ func TestResolveGenerateHourlyRejectsDateAndStormBounds(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
func TestResolveGenerateDailyDefaultsDateInConfiguredTimezone(t *testing.T) {
|
||||
func TestResolveGenerateDailyRequiresDate(t *testing.T) {
|
||||
runner := Runner{Clock: fixedClock()}
|
||||
|
||||
req, err := runner.resolveGenerate([]string{"daily"})
|
||||
if err == nil {
|
||||
t.Fatal("resolveGenerate() error = nil, want required date error")
|
||||
}
|
||||
if !strings.Contains(err.Error(), "generate daily requires --date YYYY-MM-DD") {
|
||||
t.Fatalf("resolveGenerate() error = %q, want required date context", err.Error())
|
||||
}
|
||||
if !req.Date.IsZero() {
|
||||
t.Fatalf("Date = %s, want unset on error", req.Date)
|
||||
}
|
||||
}
|
||||
|
||||
func TestResolveGenerateDailyRejectsMalformedDate(t *testing.T) {
|
||||
runner := Runner{Clock: fixedClock()}
|
||||
|
||||
_, err := runner.resolveGenerate([]string{"daily", "--date", "bad-date"})
|
||||
if err == nil {
|
||||
t.Fatal("resolveGenerate() error = nil, want date parse error")
|
||||
}
|
||||
if !strings.Contains(err.Error(), `parse date "bad-date" as YYYY-MM-DD`) {
|
||||
t.Fatalf("resolveGenerate() error = %q, want date parse context", err.Error())
|
||||
}
|
||||
}
|
||||
|
||||
func TestResolveGenerateDailyParsesDate(t *testing.T) {
|
||||
runner := Runner{Clock: fixedClock()}
|
||||
|
||||
req, err := runner.resolveGenerate([]string{"daily", "--date", "2026-05-29"})
|
||||
if err != nil {
|
||||
t.Fatalf("resolveGenerate() error = %v", err)
|
||||
}
|
||||
|
||||
if req.Report != app.ReportDaily {
|
||||
t.Fatalf("Report = %q, want daily", req.Report)
|
||||
}
|
||||
if got := req.Date.Format(timeutil.DateLayout); got != "2026-05-29" {
|
||||
t.Fatalf("Date = %s, want 2026-05-29", got)
|
||||
}
|
||||
@@ -1024,7 +1062,7 @@ func TestResolveGenerateTodayDate(t *testing.T) {
|
||||
func TestResolveGenerateAppliesSharedFlags(t *testing.T) {
|
||||
runner := Runner{Clock: fixedClock()}
|
||||
|
||||
req, err := runner.resolveGenerate([]string{"daily", "--units", "metric", "--tz", "UTC", "--out", "./daily.md"})
|
||||
req, err := runner.resolveGenerate([]string{"daily", "--date", "2026-05-29", "--units", "metric", "--tz", "UTC", "--out", "./daily.md"})
|
||||
if err != nil {
|
||||
t.Fatalf("resolveGenerate() error = %v", err)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user