Added new, focused forecast discussion endpoints for key messages, short term, and long term discussions
All checks were successful
ci/woodpecker/push/build-image Pipeline was successful

This commit is contained in:
2026-03-29 08:05:16 -05:00
parent 0bccfc50d9
commit 6ea27cb2c5
9 changed files with 607 additions and 11 deletions

View File

@@ -209,6 +209,90 @@ func TestDiscussionPayloadTimezoneConversionAndCopySemantics(t *testing.T) {
assertOffsetSeconds(t, run.IssuedAt, 0)
}
func TestDiscussionFocusedPayloads(t *testing.T) {
loc := time.FixedZone("UTC-05:00", -5*60*60)
issuedAt := time.Date(2026, 7, 10, 12, 0, 0, 0, time.UTC)
updatedAt := issuedAt.Add(30 * time.Minute)
shortIssuedAt := issuedAt.Add(-15 * time.Minute)
longIssuedAt := issuedAt.Add(15 * time.Minute)
run := &model.WeatherForecastDiscussion{
OfficeID: "LSX",
OfficeName: "National Weather Service Saint Louis MO",
Product: model.ForecastDiscussionProductAFD,
IssuedAt: issuedAt,
UpdatedAt: &updatedAt,
KeyMessages: nil,
ShortTerm: &model.WeatherForecastDiscussionSection{Qualifier: "(Tonight)", IssuedAt: &shortIssuedAt, Text: "Short term text"},
LongTerm: &model.WeatherForecastDiscussionSection{Qualifier: "(Tomorrow)", IssuedAt: &longIssuedAt, Text: "Long term text"},
}
keyMessagesPayload := DiscussionKeyMessagesOnlyPayload(run, UnitsMetric, loc)
keyMessages, ok := keyMessagesPayload.(DiscussionKeyMessagesPayload)
if !ok {
t.Fatalf("expected DiscussionKeyMessagesPayload, got %T", keyMessagesPayload)
}
if keyMessages.KeyMessages == nil {
t.Fatalf("expected keyMessages slice to be non-nil")
}
if len(keyMessages.KeyMessages) != 0 {
t.Fatalf("expected empty keyMessages slice, got %#v", keyMessages.KeyMessages)
}
assertOffsetSeconds(t, keyMessages.IssuedAt, -5*60*60)
assertOffsetSeconds(t, *keyMessages.UpdatedAt, -5*60*60)
shortPayload := DiscussionShortTermOnlyPayload(run, UnitsMetric, loc)
shortTerm, ok := shortPayload.(DiscussionShortTermPayload)
if !ok {
t.Fatalf("expected DiscussionShortTermPayload, got %T", shortPayload)
}
if shortTerm.ShortTerm == nil {
t.Fatalf("expected shortTerm section")
}
if shortTerm.ShortTerm == run.ShortTerm {
t.Fatalf("expected shortTerm section copy")
}
assertOffsetSeconds(t, *shortTerm.ShortTerm.IssuedAt, -5*60*60)
longPayload := DiscussionLongTermOnlyPayload(run, UnitsMetric, loc)
longTerm, ok := longPayload.(DiscussionLongTermPayload)
if !ok {
t.Fatalf("expected DiscussionLongTermPayload, got %T", longPayload)
}
if longTerm.LongTerm == nil {
t.Fatalf("expected longTerm section")
}
if longTerm.LongTerm == run.LongTerm {
t.Fatalf("expected longTerm section copy")
}
assertOffsetSeconds(t, *longTerm.LongTerm.IssuedAt, -5*60*60)
}
func TestDiscussionFocusedPayloadsPreserveNilSections(t *testing.T) {
run := &model.WeatherForecastDiscussion{
OfficeID: "LSX",
Product: model.ForecastDiscussionProductAFD,
IssuedAt: time.Date(2026, 7, 10, 12, 0, 0, 0, time.UTC),
}
shortPayload := DiscussionShortTermOnlyPayload(run, UnitsMetric, nil)
shortTerm, ok := shortPayload.(DiscussionShortTermPayload)
if !ok {
t.Fatalf("expected DiscussionShortTermPayload, got %T", shortPayload)
}
if shortTerm.ShortTerm != nil {
t.Fatalf("expected nil shortTerm, got %+v", shortTerm.ShortTerm)
}
longPayload := DiscussionLongTermOnlyPayload(run, UnitsMetric, nil)
longTerm, ok := longPayload.(DiscussionLongTermPayload)
if !ok {
t.Fatalf("expected DiscussionLongTermPayload, got %T", longPayload)
}
if longTerm.LongTerm != nil {
t.Fatalf("expected nil longTerm, got %+v", longTerm.LongTerm)
}
}
func TestMetricCopyAndNilHandling(t *testing.T) {
obs := &model.WeatherObservation{
TemperatureC: float64Ptr(20.6),
@@ -239,6 +323,15 @@ func TestMetricCopyAndNilHandling(t *testing.T) {
if DiscussionPayload(nil, UnitsUS, nil) != nil {
t.Fatalf("expected nil discussion input to return nil payload")
}
if DiscussionKeyMessagesOnlyPayload(nil, UnitsUS, nil) != nil {
t.Fatalf("expected nil key messages discussion input to return nil payload")
}
if DiscussionShortTermOnlyPayload(nil, UnitsUS, nil) != nil {
t.Fatalf("expected nil short term discussion input to return nil payload")
}
if DiscussionLongTermOnlyPayload(nil, UnitsUS, nil) != nil {
t.Fatalf("expected nil long term discussion input to return nil payload")
}
if CurrentConditionsPayload(nil, UnitsUS, 0) != nil {
t.Fatalf("expected nil current conditions input to return nil payload")
}