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)
}
}