Made forecast-period conditionCode optional
This commit is contained in:
@@ -334,7 +334,7 @@ func TestForecastUSUnitsWithXMLFormatUppercaseQuery(t *testing.T) {
|
||||
Periods: []model.WeatherForecastPeriod{{
|
||||
StartTime: time.Now().UTC(),
|
||||
EndTime: time.Now().UTC().Add(time.Hour),
|
||||
ConditionCode: 1,
|
||||
ConditionCode: wmoCodePtr(1),
|
||||
TemperatureC: float64Ptr(10),
|
||||
}},
|
||||
},
|
||||
@@ -367,7 +367,7 @@ func TestForecastPrecisionTwo(t *testing.T) {
|
||||
Periods: []model.WeatherForecastPeriod{{
|
||||
StartTime: time.Now().UTC(),
|
||||
EndTime: time.Now().UTC().Add(time.Hour),
|
||||
ConditionCode: model.WMOUnknown,
|
||||
ConditionCode: wmoCodePtr(model.WMOUnknown),
|
||||
TemperatureC: float64Ptr(12.345),
|
||||
}},
|
||||
},
|
||||
@@ -412,7 +412,7 @@ func TestForecastJSONOmitsLegacyDescriptionFields(t *testing.T) {
|
||||
Periods: []model.WeatherForecastPeriod{{
|
||||
StartTime: time.Now().UTC(),
|
||||
EndTime: time.Now().UTC().Add(time.Hour),
|
||||
ConditionCode: model.WMOUnknown,
|
||||
ConditionCode: wmoCodePtr(model.WMOUnknown),
|
||||
TextDescription: "Cloudy",
|
||||
}},
|
||||
},
|
||||
@@ -463,7 +463,7 @@ func TestForecastTimezoneOffsetUppercaseTZConvertsAllTimes(t *testing.T) {
|
||||
Periods: []model.WeatherForecastPeriod{{
|
||||
StartTime: periodStart,
|
||||
EndTime: periodEnd,
|
||||
ConditionCode: model.WMOUnknown,
|
||||
ConditionCode: wmoCodePtr(model.WMOUnknown),
|
||||
}},
|
||||
},
|
||||
}, "/forecast/hourly")
|
||||
@@ -498,7 +498,7 @@ func TestForecastTimezoneAbbreviationCDT(t *testing.T) {
|
||||
Periods: []model.WeatherForecastPeriod{{
|
||||
StartTime: issuedAt,
|
||||
EndTime: issuedAt.Add(time.Hour),
|
||||
ConditionCode: model.WMOUnknown,
|
||||
ConditionCode: wmoCodePtr(model.WMOUnknown),
|
||||
}},
|
||||
},
|
||||
}, "/forecast/hourly")
|
||||
@@ -525,7 +525,7 @@ func TestForecastTimezoneCityAliasChicago(t *testing.T) {
|
||||
Periods: []model.WeatherForecastPeriod{{
|
||||
StartTime: issuedAt,
|
||||
EndTime: issuedAt.Add(time.Hour),
|
||||
ConditionCode: model.WMOUnknown,
|
||||
ConditionCode: wmoCodePtr(model.WMOUnknown),
|
||||
}},
|
||||
},
|
||||
}, "/forecast/hourly")
|
||||
@@ -587,9 +587,9 @@ func TestForecastHourlyTodayFiltersByStartDateUTCDefault(t *testing.T) {
|
||||
Product: model.ForecastProductHourly,
|
||||
IssuedAt: time.Date(2026, 7, 10, 11, 0, 0, 0, time.UTC),
|
||||
Periods: []model.WeatherForecastPeriod{
|
||||
{StartTime: time.Date(2026, 7, 10, 0, 30, 0, 0, time.UTC), EndTime: time.Date(2026, 7, 10, 1, 30, 0, 0, time.UTC), ConditionCode: model.WMOUnknown},
|
||||
{StartTime: time.Date(2026, 7, 10, 23, 0, 0, 0, time.UTC), EndTime: time.Date(2026, 7, 11, 0, 0, 0, 0, time.UTC), ConditionCode: model.WMOUnknown},
|
||||
{StartTime: time.Date(2026, 7, 11, 2, 0, 0, 0, time.UTC), EndTime: time.Date(2026, 7, 11, 3, 0, 0, 0, time.UTC), ConditionCode: model.WMOUnknown},
|
||||
{StartTime: time.Date(2026, 7, 10, 0, 30, 0, 0, time.UTC), EndTime: time.Date(2026, 7, 10, 1, 30, 0, 0, time.UTC), ConditionCode: wmoCodePtr(model.WMOUnknown)},
|
||||
{StartTime: time.Date(2026, 7, 10, 23, 0, 0, 0, time.UTC), EndTime: time.Date(2026, 7, 11, 0, 0, 0, 0, time.UTC), ConditionCode: wmoCodePtr(model.WMOUnknown)},
|
||||
{StartTime: time.Date(2026, 7, 11, 2, 0, 0, 0, time.UTC), EndTime: time.Date(2026, 7, 11, 3, 0, 0, 0, time.UTC), ConditionCode: wmoCodePtr(model.WMOUnknown)},
|
||||
},
|
||||
},
|
||||
}, "/forecast/hourly/today")
|
||||
@@ -622,9 +622,9 @@ func TestForecastHourlyTomorrowFiltersByStartDateUTCDefault(t *testing.T) {
|
||||
Product: model.ForecastProductHourly,
|
||||
IssuedAt: time.Date(2026, 7, 10, 11, 0, 0, 0, time.UTC),
|
||||
Periods: []model.WeatherForecastPeriod{
|
||||
{StartTime: time.Date(2026, 7, 10, 23, 0, 0, 0, time.UTC), EndTime: time.Date(2026, 7, 11, 0, 0, 0, 0, time.UTC), ConditionCode: model.WMOUnknown},
|
||||
{StartTime: time.Date(2026, 7, 11, 0, 0, 0, 0, time.UTC), EndTime: time.Date(2026, 7, 11, 1, 0, 0, 0, time.UTC), ConditionCode: model.WMOUnknown},
|
||||
{StartTime: time.Date(2026, 7, 11, 15, 0, 0, 0, time.UTC), EndTime: time.Date(2026, 7, 11, 16, 0, 0, 0, time.UTC), ConditionCode: model.WMOUnknown},
|
||||
{StartTime: time.Date(2026, 7, 10, 23, 0, 0, 0, time.UTC), EndTime: time.Date(2026, 7, 11, 0, 0, 0, 0, time.UTC), ConditionCode: wmoCodePtr(model.WMOUnknown)},
|
||||
{StartTime: time.Date(2026, 7, 11, 0, 0, 0, 0, time.UTC), EndTime: time.Date(2026, 7, 11, 1, 0, 0, 0, time.UTC), ConditionCode: wmoCodePtr(model.WMOUnknown)},
|
||||
{StartTime: time.Date(2026, 7, 11, 15, 0, 0, 0, time.UTC), EndTime: time.Date(2026, 7, 11, 16, 0, 0, 0, time.UTC), ConditionCode: wmoCodePtr(model.WMOUnknown)},
|
||||
},
|
||||
},
|
||||
}, "/forecast/hourly/tomorrow")
|
||||
@@ -657,9 +657,9 @@ func TestForecastHourlyTodayTimezoneAffectsDaySlice(t *testing.T) {
|
||||
Product: model.ForecastProductHourly,
|
||||
IssuedAt: time.Date(2026, 7, 10, 11, 0, 0, 0, time.UTC),
|
||||
Periods: []model.WeatherForecastPeriod{
|
||||
{StartTime: time.Date(2026, 7, 10, 4, 30, 0, 0, time.UTC), EndTime: time.Date(2026, 7, 10, 5, 30, 0, 0, time.UTC), ConditionCode: model.WMOUnknown},
|
||||
{StartTime: time.Date(2026, 7, 11, 3, 30, 0, 0, time.UTC), EndTime: time.Date(2026, 7, 11, 4, 30, 0, 0, time.UTC), ConditionCode: model.WMOUnknown},
|
||||
{StartTime: time.Date(2026, 7, 11, 5, 30, 0, 0, time.UTC), EndTime: time.Date(2026, 7, 11, 6, 30, 0, 0, time.UTC), ConditionCode: model.WMOUnknown},
|
||||
{StartTime: time.Date(2026, 7, 10, 4, 30, 0, 0, time.UTC), EndTime: time.Date(2026, 7, 10, 5, 30, 0, 0, time.UTC), ConditionCode: wmoCodePtr(model.WMOUnknown)},
|
||||
{StartTime: time.Date(2026, 7, 11, 3, 30, 0, 0, time.UTC), EndTime: time.Date(2026, 7, 11, 4, 30, 0, 0, time.UTC), ConditionCode: wmoCodePtr(model.WMOUnknown)},
|
||||
{StartTime: time.Date(2026, 7, 11, 5, 30, 0, 0, time.UTC), EndTime: time.Date(2026, 7, 11, 6, 30, 0, 0, time.UTC), ConditionCode: wmoCodePtr(model.WMOUnknown)},
|
||||
},
|
||||
},
|
||||
}, "/forecast/hourly/today")
|
||||
@@ -690,8 +690,8 @@ func TestForecastHourlyTomorrowTimezoneAffectsDaySlice(t *testing.T) {
|
||||
Product: model.ForecastProductHourly,
|
||||
IssuedAt: time.Date(2026, 7, 10, 11, 0, 0, 0, time.UTC),
|
||||
Periods: []model.WeatherForecastPeriod{
|
||||
{StartTime: time.Date(2026, 7, 11, 3, 30, 0, 0, time.UTC), EndTime: time.Date(2026, 7, 11, 4, 30, 0, 0, time.UTC), ConditionCode: model.WMOUnknown},
|
||||
{StartTime: time.Date(2026, 7, 11, 5, 30, 0, 0, time.UTC), EndTime: time.Date(2026, 7, 11, 6, 30, 0, 0, time.UTC), ConditionCode: model.WMOUnknown},
|
||||
{StartTime: time.Date(2026, 7, 11, 3, 30, 0, 0, time.UTC), EndTime: time.Date(2026, 7, 11, 4, 30, 0, 0, time.UTC), ConditionCode: wmoCodePtr(model.WMOUnknown)},
|
||||
{StartTime: time.Date(2026, 7, 11, 5, 30, 0, 0, time.UTC), EndTime: time.Date(2026, 7, 11, 6, 30, 0, 0, time.UTC), ConditionCode: wmoCodePtr(model.WMOUnknown)},
|
||||
},
|
||||
},
|
||||
}, "/forecast/hourly/tomorrow")
|
||||
@@ -724,7 +724,7 @@ func TestForecastHourlyTodaySupportsSameFlags(t *testing.T) {
|
||||
Periods: []model.WeatherForecastPeriod{{
|
||||
StartTime: time.Date(2026, 7, 10, 13, 0, 0, 0, time.UTC),
|
||||
EndTime: time.Date(2026, 7, 10, 14, 0, 0, 0, time.UTC),
|
||||
ConditionCode: 1,
|
||||
ConditionCode: wmoCodePtr(1),
|
||||
TemperatureC: float64Ptr(10.123),
|
||||
}},
|
||||
},
|
||||
@@ -755,7 +755,7 @@ func TestForecastHourlyTomorrowSupportsSameFlags(t *testing.T) {
|
||||
Periods: []model.WeatherForecastPeriod{{
|
||||
StartTime: time.Date(2026, 7, 11, 13, 0, 0, 0, time.UTC),
|
||||
EndTime: time.Date(2026, 7, 11, 14, 0, 0, 0, time.UTC),
|
||||
ConditionCode: 1,
|
||||
ConditionCode: wmoCodePtr(1),
|
||||
TemperatureC: float64Ptr(10.123),
|
||||
}},
|
||||
},
|
||||
@@ -835,7 +835,7 @@ func TestForecastHourlyTodayNoMatchingPeriodsReturnsDataWithEmptyPeriods(t *test
|
||||
Periods: []model.WeatherForecastPeriod{{
|
||||
StartTime: time.Date(2026, 7, 11, 13, 0, 0, 0, time.UTC),
|
||||
EndTime: time.Date(2026, 7, 11, 14, 0, 0, 0, time.UTC),
|
||||
ConditionCode: model.WMOUnknown,
|
||||
ConditionCode: wmoCodePtr(model.WMOUnknown),
|
||||
}},
|
||||
},
|
||||
}, "/forecast/hourly/today")
|
||||
@@ -888,7 +888,7 @@ func TestForecastNarrativePopulatedJSONEnvelope(t *testing.T) {
|
||||
StartTime: time.Now().UTC(),
|
||||
EndTime: time.Now().UTC().Add(12 * time.Hour),
|
||||
Name: "Tonight",
|
||||
ConditionCode: model.WMOUnknown,
|
||||
ConditionCode: wmoCodePtr(model.WMOUnknown),
|
||||
TextDescription: "Mostly clear overnight.",
|
||||
}},
|
||||
},
|
||||
@@ -952,7 +952,7 @@ func TestForecastNarrativeSupportsSameFlags(t *testing.T) {
|
||||
Periods: []model.WeatherForecastPeriod{{
|
||||
StartTime: time.Date(2026, 7, 10, 13, 0, 0, 0, time.UTC),
|
||||
EndTime: time.Date(2026, 7, 11, 1, 0, 0, 0, time.UTC),
|
||||
ConditionCode: 1,
|
||||
ConditionCode: wmoCodePtr(1),
|
||||
TemperatureC: float64Ptr(20.123),
|
||||
}},
|
||||
},
|
||||
@@ -1012,9 +1012,9 @@ func TestForecastNarrativeTodayTimezoneAffectsDaySlice(t *testing.T) {
|
||||
Product: model.ForecastProductNarrative,
|
||||
IssuedAt: time.Date(2026, 7, 10, 11, 0, 0, 0, time.UTC),
|
||||
Periods: []model.WeatherForecastPeriod{
|
||||
{StartTime: time.Date(2026, 7, 10, 4, 30, 0, 0, time.UTC), EndTime: time.Date(2026, 7, 10, 5, 30, 0, 0, time.UTC), ConditionCode: model.WMOUnknown},
|
||||
{StartTime: time.Date(2026, 7, 11, 3, 30, 0, 0, time.UTC), EndTime: time.Date(2026, 7, 11, 15, 30, 0, 0, time.UTC), ConditionCode: model.WMOUnknown},
|
||||
{StartTime: time.Date(2026, 7, 11, 5, 30, 0, 0, time.UTC), EndTime: time.Date(2026, 7, 11, 17, 30, 0, 0, time.UTC), ConditionCode: model.WMOUnknown},
|
||||
{StartTime: time.Date(2026, 7, 10, 4, 30, 0, 0, time.UTC), EndTime: time.Date(2026, 7, 10, 5, 30, 0, 0, time.UTC), ConditionCode: wmoCodePtr(model.WMOUnknown)},
|
||||
{StartTime: time.Date(2026, 7, 11, 3, 30, 0, 0, time.UTC), EndTime: time.Date(2026, 7, 11, 15, 30, 0, 0, time.UTC), ConditionCode: wmoCodePtr(model.WMOUnknown)},
|
||||
{StartTime: time.Date(2026, 7, 11, 5, 30, 0, 0, time.UTC), EndTime: time.Date(2026, 7, 11, 17, 30, 0, 0, time.UTC), ConditionCode: wmoCodePtr(model.WMOUnknown)},
|
||||
},
|
||||
},
|
||||
}, "/forecast/narrative/today")
|
||||
@@ -1045,9 +1045,9 @@ func TestForecastNarrativeTomorrowFiltersByStartDateUTCDefault(t *testing.T) {
|
||||
Product: model.ForecastProductNarrative,
|
||||
IssuedAt: time.Date(2026, 7, 10, 11, 0, 0, 0, time.UTC),
|
||||
Periods: []model.WeatherForecastPeriod{
|
||||
{StartTime: time.Date(2026, 7, 10, 23, 0, 0, 0, time.UTC), EndTime: time.Date(2026, 7, 11, 11, 0, 0, 0, time.UTC), ConditionCode: model.WMOUnknown},
|
||||
{StartTime: time.Date(2026, 7, 11, 0, 0, 0, 0, time.UTC), EndTime: time.Date(2026, 7, 11, 12, 0, 0, 0, time.UTC), ConditionCode: model.WMOUnknown},
|
||||
{StartTime: time.Date(2026, 7, 11, 12, 0, 0, 0, time.UTC), EndTime: time.Date(2026, 7, 12, 0, 0, 0, 0, time.UTC), ConditionCode: model.WMOUnknown},
|
||||
{StartTime: time.Date(2026, 7, 10, 23, 0, 0, 0, time.UTC), EndTime: time.Date(2026, 7, 11, 11, 0, 0, 0, time.UTC), ConditionCode: wmoCodePtr(model.WMOUnknown)},
|
||||
{StartTime: time.Date(2026, 7, 11, 0, 0, 0, 0, time.UTC), EndTime: time.Date(2026, 7, 11, 12, 0, 0, 0, time.UTC), ConditionCode: wmoCodePtr(model.WMOUnknown)},
|
||||
{StartTime: time.Date(2026, 7, 11, 12, 0, 0, 0, time.UTC), EndTime: time.Date(2026, 7, 12, 0, 0, 0, 0, time.UTC), ConditionCode: wmoCodePtr(model.WMOUnknown)},
|
||||
},
|
||||
},
|
||||
}, "/forecast/narrative/tomorrow")
|
||||
@@ -1806,6 +1806,11 @@ func float64Ptr(v float64) *float64 {
|
||||
return &v
|
||||
}
|
||||
|
||||
func wmoCodePtr(v model.WMOCode) *model.WMOCode {
|
||||
out := v
|
||||
return &out
|
||||
}
|
||||
|
||||
type forecastTimePayload struct {
|
||||
Data struct {
|
||||
IssuedAt time.Time `json:"issuedAt"`
|
||||
|
||||
Reference in New Issue
Block a user