Skip to content

Commit cc37881

Browse files
committed
fix: validate canned insight timezones
1 parent ffc4df9 commit cc37881

2 files changed

Lines changed: 14 additions & 0 deletions

File tree

internal/server/insights.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,10 @@ func normalizeCannedSessionFilters(
6161
if filters.Timezone == "" {
6262
filters.Timezone = "UTC"
6363
}
64+
if _, err := time.LoadLocation(filters.Timezone); err != nil {
65+
return insight.CannedSessionFilters{},
66+
"invalid timezone: " + filters.Timezone, false
67+
}
6468
filters.Machine = strings.TrimSpace(filters.Machine)
6569
filters.Agent = strings.TrimSpace(filters.Agent)
6670
filters.Termination = strings.TrimSpace(filters.Termination)

internal/server/insights_test.go

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -207,6 +207,16 @@ func TestGenerateCannedInsight_RequiresExplicitOptIn(t *testing.T) {
207207
assertBodyContains(t, w, "llm_opt_in")
208208
}
209209

210+
func TestGenerateCannedInsight_RejectsInvalidFilterTimezone(t *testing.T) {
211+
te := setup(t)
212+
213+
w := te.post(t, "/api/v1/insights/generate",
214+
`{"type":"llm_canned","kind":"prompt_maturity_review","date_from":"2025-01-15","date_to":"2025-01-15","agent":"claude","llm_opt_in":true,"filters":{"timezone":"Fake/Zone","include_one_shot":false,"automated_scope":"human"}}`)
215+
216+
assertStatus(t, w, http.StatusBadRequest)
217+
assertBodyContains(t, w, "invalid timezone: Fake/Zone")
218+
}
219+
210220
func TestGenerateCannedInsight_ReturnsValidationDetail(t *testing.T) {
211221
stubGen := func(
212222
_ context.Context, _, _ string, _ insight.LogFunc,

0 commit comments

Comments
 (0)