178 lines
4.3 KiB
Go
178 lines
4.3 KiB
Go
|
|
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()
|
||
|
|
}
|
||
|
|
}
|