package sources import ( "context" "net/http" "net/http/httptest" "strings" "testing" "gitea.maximumdirect.net/ejr/feedkit/config" ) func TestNewHTTPSourceConditionalDefaultsTrue(t *testing.T) { src, err := NewHTTPSource("test_driver", config.SourceConfig{ Name: "test-source", Driver: "test_driver", Params: map[string]any{ "url": "https://example.invalid", "user_agent": "test-agent", }, }, "application/json") if err != nil { t.Fatalf("NewHTTPSource() error = %v", err) } if !src.Conditional { t.Fatalf("Conditional = false, want true") } } func TestNewHTTPSourceRejectsInvalidConditional(t *testing.T) { _, err := NewHTTPSource("test_driver", config.SourceConfig{ Name: "test-source", Driver: "test_driver", Params: map[string]any{ "url": "https://example.invalid", "user_agent": "test-agent", "conditional": "sometimes", }, }, "application/json") if err == nil { t.Fatalf("NewHTTPSource() error = nil, want error") } if !strings.Contains(err.Error(), "params.conditional must be a boolean") { t.Fatalf("NewHTTPSource() error = %q, want params.conditional must be a boolean", err) } } func TestNewHTTPSourceConditionalCanBeExplicitlyFalse(t *testing.T) { src, err := NewHTTPSource("test_driver", config.SourceConfig{ Name: "test-source", Driver: "test_driver", Params: map[string]any{ "url": "https://example.invalid", "user_agent": "test-agent", "conditional": false, }, }, "application/json") if err != nil { t.Fatalf("NewHTTPSource() error = %v", err) } if src.Conditional { t.Fatalf("Conditional = true, want false") } } func TestHTTPSourceFetchJSONIfChanged(t *testing.T) { var call int srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { call++ switch call { case 1: w.Header().Set("ETag", `"v1"`) _, _ = w.Write([]byte(`{"ok":true}`)) case 2: if got := r.Header.Get("If-None-Match"); got != `"v1"` { t.Fatalf("second request If-None-Match = %q", got) } w.WriteHeader(http.StatusNotModified) default: t.Fatalf("unexpected call count %d", call) } })) defer srv.Close() src, err := NewHTTPSource("test_driver", config.SourceConfig{ Name: "test-source", Driver: "test_driver", Params: map[string]any{ "url": srv.URL, "user_agent": "test-agent", }, }, "application/json") if err != nil { t.Fatalf("NewHTTPSource() error = %v", err) } raw, changed, err := src.FetchJSONIfChanged(context.Background()) if err != nil { t.Fatalf("first FetchJSONIfChanged() error = %v", err) } if !changed { t.Fatalf("first FetchJSONIfChanged() changed = false, want true") } if got := string(raw); got != `{"ok":true}` { t.Fatalf("first FetchJSONIfChanged() body = %q", got) } raw, changed, err = src.FetchJSONIfChanged(context.Background()) if err != nil { t.Fatalf("second FetchJSONIfChanged() error = %v", err) } if changed { t.Fatalf("second FetchJSONIfChanged() changed = true, want false") } if raw != nil { t.Fatalf("second FetchJSONIfChanged() body = %q, want nil", string(raw)) } }