package console import ( "bytes" "encoding/json" "log" "net/http" "strings" "testing" "github.com/carlosframework/platform/internal/geo" ) func TestAPIGeo(t *testing.T) { fx, token := instanceFixture(t, "code-geo-api") base := fx.ts.URL + "/api/cli/apps/" + fx.sqid + "/titogo/geo" if st, _, _ := rawReq(t, http.MethodGet, base+"?ip=81.2.69.142", token, ""); st != http.StatusServiceUnavailable { t.Fatalf("no reader = %d, want 503", st) } sw := geo.NewSwappable() fx.srv.cfg.GeoIPReader = sw if st, _, _ := rawReq(t, http.MethodGet, base+"?ip=81.2.69.142", token, ""); st != http.StatusServiceUnavailable { t.Fatalf("empty reader = %d, want 503", st) } db, err := geo.OpenMMDB("../geo/testdata/GeoIP2-City-Test.mmdb") if err != nil { t.Fatal(err) } sw.Swap(db) var logs bytes.Buffer prev := log.Writer() log.SetOutput(&logs) defer log.SetOutput(prev) st, _, body := rawReq(t, http.MethodGet, base+"?ip=81.2.69.142", token, "") if st != 200 { t.Fatalf("%d %s", st, body) } var got geoResponse json.Unmarshal([]byte(body), &got) if !got.Found || got.Country != "GB" || got.Subdivision != "GB-ENG" || got.Lat == nil || *got.Lat != 51.51 || got.Source != "GeoIP2-City" { t.Fatalf("answer = %+v", got) } if got.Attribution != "" { t.Fatal("GeoIP2 (commercial) has no known attribution; none must be invented") } if st, _, body := rawReq(t, http.MethodGet, base+"?ip=10.0.0.1", token, ""); st != 200 || !strings.Contains(body, `"found":false`) { t.Fatalf("private address = %d %s", st, body) } if st, _, _ := rawReq(t, http.MethodGet, base+"?ip=not-an-ip", token, ""); st != http.StatusBadRequest { t.Fatalf("bad ip = %d", st) } if st, _, _ := rawReq(t, http.MethodGet, base, token, ""); st != http.StatusBadRequest { t.Fatalf("missing ip = %d", st) } if strings.Contains(logs.String(), "81.2.69.142") { t.Fatalf("the queried address reached the log: %s", logs.String()) } }