package main // The ≈ display's rate snapshot (fx.go): fetch, parse, last-good fallback, // and the empty-until-fetched public shape. import ( "encoding/json" "net/http" "net/http/httptest" "testing" ) const ecbSample = ` Reference rates ` func TestFXRefreshAndServe(t *testing.T) { feed := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { w.Write([]byte(ecbSample)) })) defer feed.Close() ts, s := newTestServer(t) get := func() (string, map[string]float64) { t.Helper() resp, err := http.Get(ts.URL + "/api/fx") if err != nil { t.Fatal(err) } defer resp.Body.Close() if resp.StatusCode != http.StatusOK { t.Fatalf("fx: HTTP %d", resp.StatusCode) } var body struct { Base string `json:"base"` Date string `json:"date"` Rates map[string]float64 `json:"rates"` } if err := json.NewDecoder(resp.Body).Decode(&body); err != nil { t.Fatal(err) } if body.Base != "EUR" { t.Fatalf("base = %q", body.Base) } return body.Date, body.Rates } // Before any fetch: an empty snapshot, still a clean 200 (the client just // shows no ≈ figure). if date, rates := get(); date != "" || len(rates) != 0 { t.Fatalf("pre-fetch snapshot = %q %v, want empty", date, rates) } if err := s.fx.refresh(http.DefaultClient, feed.URL); err != nil { t.Fatal(err) } date, rates := get() if date != "2026-07-17" || rates["USD"] != 1.0876 || rates["GBP"] != 0.8433 || len(rates) != 3 { t.Fatalf("snapshot = %q %v", date, rates) } // A failing feed keeps the last-good snapshot. feed.Close() if err := s.fx.refresh(http.DefaultClient, feed.URL); err == nil { t.Fatal("refresh against a dead feed reported success") } if date, rates := get(); date != "2026-07-17" || len(rates) != 3 { t.Fatalf("post-failure snapshot = %q %v, want last-good kept", date, rates) } // So does a feed that answers but parses to nothing. empty := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { w.Write([]byte(``)) })) defer empty.Close() if err := s.fx.refresh(http.DefaultClient, empty.URL); err == nil { t.Fatal("empty feed reported success") } if date, _ := get(); date != "2026-07-17" { t.Fatalf("empty feed replaced the snapshot (date %q)", date) } }