package generatedtext import ( "strings" "testing" ) func TestValidateHourlyNormalizesJSON(t *testing.T) { value, normalized, err := ValidateHourly([]byte(`{ "summary": " Storm chances increase. ", "forecast_discussion": " A front will keep the region unsettled. ", "precipitation_timing": " Showers are most likely early this afternoon. " }`)) if err != nil { t.Fatalf("ValidateHourly() error = %v", err) } if value.Summary != "Storm chances increase." { t.Fatalf("Summary = %q, want trimmed summary", value.Summary) } if value.ForecastDiscussion != "A front will keep the region unsettled." { t.Fatalf("ForecastDiscussion = %q, want trimmed discussion", value.ForecastDiscussion) } if value.PrecipitationTiming != "Showers are most likely early this afternoon." { t.Fatalf("PrecipitationTiming = %q, want trimmed precipitation timing", value.PrecipitationTiming) } want := `{"summary":"Storm chances increase.","forecast_discussion":"A front will keep the region unsettled.","precipitation_timing":"Showers are most likely early this afternoon."}` if string(normalized) != want { t.Fatalf("normalized = %s, want %s", normalized, want) } } func TestValidateHourlyPreservesRequiredEmptyPrecipitationTiming(t *testing.T) { _, normalized, err := ValidateHourly([]byte(`{ "summary": "Storm chances increase.", "forecast_discussion": "A front will keep the region unsettled.", "precipitation_timing": " " }`)) if err != nil { t.Fatalf("ValidateHourly() error = %v", err) } want := `{"summary":"Storm chances increase.","forecast_discussion":"A front will keep the region unsettled.","precipitation_timing":""}` if string(normalized) != want { t.Fatalf("normalized = %s, want %s", normalized, want) } } func TestValidateHourlyRejectsInvalidInput(t *testing.T) { tests := []struct { name string in string want string }{ { name: "malformed", in: `{`, want: "decode hourly generated text", }, { name: "unknown field", in: `{"summary":"Storm chances increase.","forecast_discussion":"A front will keep the region unsettled.","extra":"value"}`, want: `unknown field "extra"`, }, { name: "missing summary", in: `{"forecast_discussion":"A front will keep the region unsettled."}`, want: "summary is required", }, { name: "blank forecast discussion", in: `{"summary":"Storm chances increase.","forecast_discussion":" "}`, want: "forecast discussion is required", }, { name: "missing precipitation timing", in: `{"summary":"Storm chances increase.","forecast_discussion":"A front will keep the region unsettled."}`, want: "precipitation timing is required", }, { name: "null precipitation timing", in: `{"summary":"Storm chances increase.","forecast_discussion":"A front will keep the region unsettled.","precipitation_timing":null}`, want: "precipitation timing must be a string", }, { name: "retired confidence field rejected", in: `{"summary":"Storm chances increase.","forecast_discussion":"A front will keep the region unsettled.","precipitation_timing":"","confidence":"Medium"}`, want: `unknown field "confidence"`, }, { name: "old timing field rejected", in: `{"summary":"Storm chances increase.","forecast_discussion":"A front will keep the region unsettled.","timing":"Late morning."}`, want: `unknown field "timing"`, }, { name: "old impacts field rejected", in: `{"summary":"Storm chances increase.","forecast_discussion":"A front will keep the region unsettled.","impacts":"Brief downpours."}`, want: `unknown field "impacts"`, }, { name: "multiple values", in: `{"summary":"Storm chances increase.","forecast_discussion":"A front will keep the region unsettled."} {}`, want: "multiple JSON values", }, } for _, test := range tests { t.Run(test.name, func(t *testing.T) { _, _, err := ValidateHourly([]byte(test.in)) if err == nil { t.Fatal("ValidateHourly() error = nil, want error") } if !strings.Contains(err.Error(), test.want) { t.Fatalf("ValidateHourly() error = %v, want %q", err, test.want) } }) } }