| 1 | package console |
| 2 | |
| 3 | import ( |
| 4 | "bytes" |
| 5 | "encoding/json" |
| 6 | "log" |
| 7 | "net/http" |
| 8 | "strings" |
| 9 | "testing" |
| 10 | |
| 11 | "github.com/carlosframework/platform/internal/geo" |
| 12 | ) |
| 13 | |
| 14 | func TestAPIGeo(t *testing.T) { |
| 15 | fx, token := instanceFixture(t, "code-geo-api") |
| 16 | base := fx.ts.URL + "/api/cli/apps/" + fx.sqid + "/titogo/geo" |
| 17 | if st, _, _ := rawReq(t, http.MethodGet, base+"?ip=81.2.69.142", token, ""); st != http.StatusServiceUnavailable { |
| 18 | t.Fatalf("no reader = %d, want 503", st) |
| 19 | } |
| 20 | sw := geo.NewSwappable() |
| 21 | fx.srv.cfg.GeoIPReader = sw |
| 22 | if st, _, _ := rawReq(t, http.MethodGet, base+"?ip=81.2.69.142", token, ""); st != http.StatusServiceUnavailable { |
| 23 | t.Fatalf("empty reader = %d, want 503", st) |
| 24 | } |
| 25 | db, err := geo.OpenMMDB("../geo/testdata/GeoIP2-City-Test.mmdb") |
| 26 | if err != nil { |
| 27 | t.Fatal(err) |
| 28 | } |
| 29 | sw.Swap(db) |
| 30 | var logs bytes.Buffer |
| 31 | prev := log.Writer() |
| 32 | log.SetOutput(&logs) |
| 33 | defer log.SetOutput(prev) |
| 34 | st, _, body := rawReq(t, http.MethodGet, base+"?ip=81.2.69.142", token, "") |
| 35 | if st != 200 { |
| 36 | t.Fatalf("%d %s", st, body) |
| 37 | } |
| 38 | var got geoResponse |
| 39 | json.Unmarshal([]byte(body), &got) |
| 40 | if !got.Found || got.Country != "GB" || got.Subdivision != "GB-ENG" || got.Lat == nil || *got.Lat != 51.51 || got.Source != "GeoIP2-City" { |
| 41 | t.Fatalf("answer = %+v", got) |
| 42 | } |
| 43 | if got.Attribution != "" { |
| 44 | t.Fatal("GeoIP2 (commercial) has no known attribution; none must be invented") |
| 45 | } |
| 46 | if st, _, body := rawReq(t, http.MethodGet, base+"?ip=10.0.0.1", token, ""); st != 200 || !strings.Contains(body, `"found":false`) { |
| 47 | t.Fatalf("private address = %d %s", st, body) |
| 48 | } |
| 49 | if st, _, _ := rawReq(t, http.MethodGet, base+"?ip=not-an-ip", token, ""); st != http.StatusBadRequest { |
| 50 | t.Fatalf("bad ip = %d", st) |
| 51 | } |
| 52 | if st, _, _ := rawReq(t, http.MethodGet, base, token, ""); st != http.StatusBadRequest { |
| 53 | t.Fatalf("missing ip = %d", st) |
| 54 | } |
| 55 | if strings.Contains(logs.String(), "81.2.69.142") { |
| 56 | t.Fatalf("the queried address reached the log: %s", logs.String()) |
| 57 | } |
| 58 | } |
| 59 | |