package sources import ( "strings" "testing" "gitea.maximumdirect.net/ejr/feedkit/config" fksource "gitea.maximumdirect.net/ejr/feedkit/sources" ) func TestRegisterBuiltinsRegistersNWSHourlyForecastDriver(t *testing.T) { reg := fksource.NewRegistry() RegisterBuiltins(reg) in, err := reg.BuildInput(sourceConfigForDriver("nws_forecast_hourly")) if err != nil { t.Fatalf("BuildInput(nws_forecast_hourly) error = %v", err) } if _, ok := in.(fksource.PollSource); !ok { t.Fatalf("BuildInput(nws_forecast_hourly) type = %T, want PollSource", in) } } func TestRegisterBuiltinsRegistersNWSNarrativeForecastDriver(t *testing.T) { reg := fksource.NewRegistry() RegisterBuiltins(reg) in, err := reg.BuildInput(sourceConfigForDriver("nws_forecast_narrative")) if err != nil { t.Fatalf("BuildInput(nws_forecast_narrative) error = %v", err) } if _, ok := in.(fksource.PollSource); !ok { t.Fatalf("BuildInput(nws_forecast_narrative) type = %T, want PollSource", in) } } func TestRegisterBuiltinsRegistersNWSForecastDiscussionDriver(t *testing.T) { reg := fksource.NewRegistry() RegisterBuiltins(reg) in, err := reg.BuildInput(sourceConfigForDriver("nws_forecast_discussion")) if err != nil { t.Fatalf("BuildInput(nws_forecast_discussion) error = %v", err) } if _, ok := in.(fksource.PollSource); !ok { t.Fatalf("BuildInput(nws_forecast_discussion) type = %T, want PollSource", in) } } func TestRegisterBuiltinsDoesNotRegisterLegacyNWSForecastDriver(t *testing.T) { reg := fksource.NewRegistry() RegisterBuiltins(reg) _, err := reg.BuildInput(sourceConfigForDriver("nws_forecast")) if err == nil { t.Fatalf("BuildInput(nws_forecast) expected unknown driver error") } if !strings.Contains(err.Error(), `unknown source driver: "nws_forecast"`) { t.Fatalf("error = %q, want unknown source driver for nws_forecast", err) } } func TestRegisterBuiltinsRegistersAllCurrentDrivers(t *testing.T) { reg := fksource.NewRegistry() RegisterBuiltins(reg) drivers := []string{ "nws_observation", "nws_alerts", "nws_forecast_hourly", "nws_forecast_narrative", "nws_forecast_discussion", "openmeteo_observation", "openmeteo_forecast", "openweather_observation", } for _, driver := range drivers { in, err := reg.BuildInput(sourceConfigForDriver(driver)) if err != nil { t.Fatalf("BuildInput(%s) error = %v", driver, err) } if _, ok := in.(fksource.PollSource); !ok { t.Fatalf("BuildInput(%s) type = %T, want PollSource", driver, in) } } } func sourceConfigForDriver(driver string) config.SourceConfig { url := "https://example.invalid" if driver == "openweather_observation" { url = "https://example.invalid?units=metric" } return config.SourceConfig{ Name: "test-source", Driver: driver, Mode: config.SourceModePoll, Params: map[string]any{ "url": url, "user_agent": "test-agent", }, } }