package main import ( "fmt" "net/http" "net/http/httptest" "testing" "time" ) func TestHandleVisit_Success(t *testing.T) { server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { w.WriteHeader(http.StatusOK) w.Write([]byte(`{"country":"Netherlands","regionName":"Noord-Holland","city":"Amsterdam"}`)) })) defer server.Close() v := SetupVisitHandler(&VisitHandlerArgs{baseUrl: server.URL}) visit := v.HandleVisit("home.collinduncan.com") if visit == nil { t.FailNow() } if visit.Location != "Amsterdam, Noord-Holland, Netherlands" { t.FailNow() } } func TestHandleVisit_NoRegion(t *testing.T) { server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { w.WriteHeader(http.StatusOK) w.Write([]byte(`{"country":"Netherlands","city":"Amsterdam"}`)) })) defer server.Close() v := SetupVisitHandler(&VisitHandlerArgs{baseUrl: server.URL}) visit := v.HandleVisit("home.collinduncan.com") if visit == nil { t.Fatalf("Location is nil") } if visit.Location != "Amsterdam, Netherlands" { t.Fatalf("Location is %s", visit.Location) } } func TestHandleVisit_NoCountry(t *testing.T) { server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { w.WriteHeader(http.StatusOK) w.Write([]byte(`{"regionName":"Noord-Holland","city":"Amsterdam"}`)) })) defer server.Close() v := SetupVisitHandler(&VisitHandlerArgs{baseUrl: server.URL}) visit := v.HandleVisit("home.collinduncan.com") if visit == nil { t.FailNow() } if visit.Location != "Amsterdam, Noord-Holland" { t.FailNow() } } func TestHandleVisit_NoCity(t *testing.T) { server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { w.WriteHeader(http.StatusOK) w.Write([]byte(`{"country":"Netherlands","regionName":"Noord-Holland"}`)) })) defer server.Close() v := SetupVisitHandler(&VisitHandlerArgs{baseUrl: server.URL}) visit := v.HandleVisit("home.collinduncan.com") if visit == nil { t.FailNow() } if visit.Location != "Noord-Holland, Netherlands" { t.FailNow() } } func TestHandleVisit_Nothing(t *testing.T) { server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { w.WriteHeader(http.StatusOK) w.Write([]byte(`{}`)) })) defer server.Close() v := SetupVisitHandler(&VisitHandlerArgs{baseUrl: server.URL}) visit := v.HandleVisit("home.collinduncan.com") if visit == nil { t.FailNow() } if visit.Location != "" { t.FailNow() } } func TestHandleVisit_RateLimit(t *testing.T) { server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { w.WriteHeader(http.StatusOK) w.Write([]byte(`{"country":"Netherlands","regionName":"Noord-Holland","city":"Amsterdam"}`)) })) defer server.Close() v := SetupVisitHandler(&VisitHandlerArgs{ baseUrl: server.URL, rateLimitAmount: 30, rateLimitDurationSeconds: 1, }) // pre-limit for i := 0; i < 30; i++ { visit := v.HandleVisit(fmt.Sprintf("home.collinduncan%d.com", i)) if visit == nil { t.Fatalf("Failed before rate-limiter %d", i) } if visit.Location != "Amsterdam, Noord-Holland, Netherlands" { t.Fatal("Failed before rate-limiter, location") } } visit := v.HandleVisit("home.collinduncan90.com") if visit != nil { t.Fatal("Failed to hit rate limiter") } time.Sleep(time.Second * 2) visit = v.HandleVisit("home.collinduncan90.com") if visit == nil { t.Fatal("Failed after rate-limiter") } if visit.Location != "Amsterdam, Noord-Holland, Netherlands" { t.Fatal("Failed after rate-limiter, location") } } func TestHandleVisit_Cache(t *testing.T) { server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { w.WriteHeader(http.StatusOK) w.Write([]byte(`{"country":"Netherlands","regionName":"Noord-Holland","city":"Amsterdam"}`)) })) defer server.Close() v := SetupVisitHandler(&VisitHandlerArgs{baseUrl: server.URL, rateLimitDurationSeconds: 1}) visit := v.HandleVisit("home.collinduncan.com") if visit == nil { t.FailNow() } if visit.Location != "Amsterdam, Noord-Holland, Netherlands" { t.FailNow() } visit = v.HandleVisit("home.collinduncan.com") if visit != nil { t.FailNow() } time.Sleep(time.Second * 2) visit = v.HandleVisit("home.collinduncan.com") if visit == nil { t.FailNow() } }