package api import ( "bytes" "io" "log" "net/http" "net/http/httptest" "path/filepath" "testing" "gitea.dooplex.hu/admin/felhom-controller/internal/config" "gitea.dooplex.hu/admin/felhom-controller/internal/settings" ) func newGeoTestRouter(t *testing.T) (*Router, *int) { t.Helper() sett, err := settings.Load(filepath.Join(t.TempDir(), "settings.json"), log.New(io.Discard, "", 0)) if err != nil { t.Fatalf("settings.Load: %v", err) } calls := 0 r := &Router{cfg: &config.Config{}, sett: sett, logger: log.New(io.Discard, "", 0)} r.triggerReportPush = func() { calls++ } return r, &calls } func postGeoSettings(t *testing.T, r *Router, body string) *httptest.ResponseRecorder { t.Helper() req := httptest.NewRequest(http.MethodPost, "/api/geo/settings", bytes.NewReader([]byte(body))) rec := httptest.NewRecorder() r.geoUpdateSettings(rec, req) return rec } func TestGeoUpdateSettings_Success_PushesReport(t *testing.T) { r, calls := newGeoTestRouter(t) rec := postGeoSettings(t, r, `{"enabled":true,"allowed_countries":["HU"]}`) if rec.Code != http.StatusOK { t.Fatalf("status = %d, want 200; body=%s", rec.Code, rec.Body.String()) } if *calls != 1 { t.Fatalf("report push called %d times, want 1 (successful save)", *calls) } } // COMPANION: a validation-failed save (invalid country code) must NOT push a report. func TestGeoUpdateSettings_InvalidCountry_NoPush(t *testing.T) { r, calls := newGeoTestRouter(t) rec := postGeoSettings(t, r, `{"enabled":true,"allowed_countries":["XX"]}`) if rec.Code != http.StatusBadRequest { t.Fatalf("status = %d, want 400 (invalid country code)", rec.Code) } if *calls != 0 { t.Fatalf("report push called %d times, want 0 (validation failed before save)", *calls) } }