Validate precipitation probabilities and ice wording

This commit is contained in:
2026-08-13 00:48:40 +00:00
parent 8e49ba88c7
commit 730929e2ed
10 changed files with 142 additions and 1 deletions

View File

@@ -101,6 +101,11 @@ func BuildDerived(req BuildDerivedRequest) (DerivedFacts, error) {
}
bundle := req.Collected.Bundle()
period := req.Resolved.ValidPeriod
if req.Collected.Hourly != nil {
if err := forecast.ValidatePrecipitationProbabilities(req.Collected.Hourly.Periods); err != nil {
return DerivedFacts{}, err
}
}
spcOutlooks, spcDiscussions := selectSPCConvectiveOutlooks(req.Collected.SPCConvectiveOutlooks, period)
derived := DerivedFacts{
ValidPeriodHourlyPeriods: forecast.SelectHourlyPeriods(req.Collected.Hourly, period),

View File

@@ -127,6 +127,21 @@ func TestBuildDerivedDailyIncludesNextDayOvernightAlerts(t *testing.T) {
}
}
func TestBuildDerivedRejectsInvalidPrecipitationProbability(t *testing.T) {
location := testLocation()
bundle := testBundle(location)
invalid := -1.0
bundle.Hourly.Periods[0].ProbabilityOfPrecipitationPercent = &invalid
_, err := BuildDerived(BuildDerivedRequest{
Resolved: resolveForTest(t, report.Hourly, mustParse("2026-05-29T08:00:00-05:00"), location),
Timezone: location.String(),
Collected: BuildCollected(bundle),
})
if err == nil || !strings.Contains(err.Error(), "invalid precipitation probability") {
t.Fatalf("BuildDerived() error = %v, want invalid precipitation probability", err)
}
}
func TestBuildDerivedTomorrow(t *testing.T) {
location := testLocation()
for _, id := range []report.ID{report.Tomorrow} {