Add cross-office NWS forecast discussion coverage
This commit is contained in:
@@ -553,6 +553,60 @@ func TestParseForecastDiscussionTextSectionKeepsArbitraryDashedProse(t *testing.
|
||||
}
|
||||
}
|
||||
|
||||
func TestParseForecastDiscussionHTMLParsesCrossOfficeLayout(t *testing.T) {
|
||||
got, err := ParseForecastDiscussionHTML(loadForecastDiscussionBOUSampleHTML(t))
|
||||
if err != nil {
|
||||
t.Fatalf("ParseForecastDiscussionHTML() error = %v", err)
|
||||
}
|
||||
if got.OfficeID != "BOU" || got.OfficeName != "National Weather Service Denver CO" {
|
||||
t.Fatalf("OfficeID=%q OfficeName=%q", got.OfficeID, got.OfficeName)
|
||||
}
|
||||
wantIssuedAt := time.Date(2026, 4, 7, 19, 0, 0, 0, time.UTC)
|
||||
if !got.IssuedAt.Equal(wantIssuedAt) {
|
||||
t.Fatalf("IssuedAt = %s, want %s", got.IssuedAt.Format(time.RFC3339), wantIssuedAt.Format(time.RFC3339))
|
||||
}
|
||||
wantMessages := []string{
|
||||
"Strong winds are expected along the Front Range this evening.",
|
||||
"Cooler temperatures arrive on Wednesday.",
|
||||
}
|
||||
if !reflect.DeepEqual(got.KeyMessages, wantMessages) {
|
||||
t.Fatalf("KeyMessages = %#v, want %#v", got.KeyMessages, wantMessages)
|
||||
}
|
||||
|
||||
if got.ShortTerm == nil {
|
||||
t.Fatalf("ShortTerm is nil")
|
||||
}
|
||||
if got.ShortTerm.Qualifier != "(Tonight through Wednesday)" {
|
||||
t.Fatalf("ShortTerm.Qualifier = %q", got.ShortTerm.Qualifier)
|
||||
}
|
||||
if got.ShortTerm.IssuedAt == nil || !got.ShortTerm.IssuedAt.Equal(wantIssuedAt) {
|
||||
t.Fatalf("ShortTerm.IssuedAt = %v, want %s", got.ShortTerm.IssuedAt, wantIssuedAt.Format(time.RFC3339))
|
||||
}
|
||||
if got.ShortTerm.Text != "Gusty west winds will continue through the evening before decreasing overnight." {
|
||||
t.Fatalf("ShortTerm.Text = %q", got.ShortTerm.Text)
|
||||
}
|
||||
|
||||
if got.LongTerm == nil {
|
||||
t.Fatalf("LongTerm is nil")
|
||||
}
|
||||
if got.LongTerm.Qualifier != "(Thursday through Saturday)" {
|
||||
t.Fatalf("LongTerm.Qualifier = %q", got.LongTerm.Qualifier)
|
||||
}
|
||||
if got.LongTerm.IssuedAt == nil || !got.LongTerm.IssuedAt.Equal(wantIssuedAt) {
|
||||
t.Fatalf("LongTerm.IssuedAt = %v, want %s", got.LongTerm.IssuedAt, wantIssuedAt.Format(time.RFC3339))
|
||||
}
|
||||
if got.LongTerm.Text != "Warmer and drier conditions return Thursday, followed by a chance of showers Friday." {
|
||||
t.Fatalf("LongTerm.Text = %q", got.LongTerm.Text)
|
||||
}
|
||||
|
||||
allText := strings.Join(append(append([]string(nil), got.KeyMessages...), got.ShortTerm.Text, got.LongTerm.Text), "\n")
|
||||
for _, unwanted := range []string{"Changed Discussion", "Updated at", "Issued at", "ISSUED AT", "AVIATION", "VFR conditions"} {
|
||||
if strings.Contains(allText, unwanted) {
|
||||
t.Fatalf("parsed content includes %q: %q", unwanted, allText)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func TestParseForecastDiscussionHTMLParsesExpectedFields(t *testing.T) {
|
||||
raw := loadForecastDiscussionSampleHTML(t)
|
||||
|
||||
@@ -707,6 +761,17 @@ func loadForecastDiscussionSampleHTML(t *testing.T) string {
|
||||
return string(b)
|
||||
}
|
||||
|
||||
func loadForecastDiscussionBOUSampleHTML(t *testing.T) string {
|
||||
t.Helper()
|
||||
|
||||
path := filepath.Join("testdata", "forecast_discussion_bou_sample.html")
|
||||
b, err := os.ReadFile(path)
|
||||
if err != nil {
|
||||
t.Fatalf("os.ReadFile(%q) error = %v", path, err)
|
||||
}
|
||||
return string(b)
|
||||
}
|
||||
|
||||
func loadMixedFormatForecastDiscussionSampleHTML(t *testing.T) string {
|
||||
t.Helper()
|
||||
|
||||
|
||||
Reference in New Issue
Block a user