collinenlucy.nl/visits_test.go

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