feat(SimpleRouter): add tests for simplerouter #9
Fixes: #9 Closes: #10
This commit is contained in:
409
unstable/simplerouter/router_test.go
Normal file
409
unstable/simplerouter/router_test.go
Normal file
@@ -0,0 +1,409 @@
|
||||
package SimpleRouter
|
||||
|
||||
import (
|
||||
"net/http"
|
||||
"net/http/httptest"
|
||||
"sync"
|
||||
"syscall"
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
Testing "github.com/lbatuska/goutils/testing"
|
||||
)
|
||||
|
||||
func setupServer(wg *sync.WaitGroup) {
|
||||
defer wg.Done()
|
||||
|
||||
simpleRouter := SimpleRouter()
|
||||
simpleRouter.GET("test", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
||||
time.Sleep(time.Second * 5)
|
||||
w.WriteHeader(200)
|
||||
}))
|
||||
simpleRouter.GET("test2", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
||||
w.WriteHeader(200)
|
||||
}))
|
||||
|
||||
simpleRouter.StartWithGracefulShutdown("0.0.0.0:8080")
|
||||
}
|
||||
|
||||
func sendKillSignal(wg *sync.WaitGroup) {
|
||||
defer wg.Done()
|
||||
|
||||
time.Sleep(time.Second * 4)
|
||||
syscall.Kill(syscall.Getpid(), syscall.SIGINT)
|
||||
}
|
||||
|
||||
func Test_gracefulShutdown(t *testing.T) {
|
||||
var wg sync.WaitGroup
|
||||
wg.Add(2)
|
||||
|
||||
go setupServer(&wg)
|
||||
go sendKillSignal(&wg)
|
||||
|
||||
time.Sleep(time.Second * 2)
|
||||
res, err := http.Get("http://localhost:8080/test")
|
||||
Testing.AssertNotError(t, err)
|
||||
Testing.AssertEqual(t, http.StatusOK, res.StatusCode)
|
||||
|
||||
wg.Wait()
|
||||
}
|
||||
|
||||
func Test_middlewares(t *testing.T) {
|
||||
counter := 0
|
||||
mw1 := func(next http.Handler) http.Handler {
|
||||
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
||||
counter += 1
|
||||
next.ServeHTTP(w, r)
|
||||
})
|
||||
}
|
||||
mw2 := func(next http.Handler) http.Handler {
|
||||
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
||||
counter = counter * 2
|
||||
next.ServeHTTP(w, r)
|
||||
})
|
||||
}
|
||||
simpleRouter := SimpleRouter()
|
||||
simpleRouter.PushMiddleware(mw1)
|
||||
simpleRouter.PushMiddleware(mw2)
|
||||
simpleRouter.GET("test", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {}))
|
||||
|
||||
ts := httptest.NewServer(simpleRouter)
|
||||
req, _ := http.NewRequest("GET", ts.URL+"/test", nil)
|
||||
_, err := http.DefaultClient.Do(req)
|
||||
|
||||
Testing.AssertNotError(t, err)
|
||||
Testing.AssertEqual(t, 2, counter)
|
||||
ts.Close()
|
||||
counter = 0
|
||||
|
||||
simpleRouter.PopMiddleware()
|
||||
simpleRouter.PopMiddleware()
|
||||
simpleRouter.PushMiddleware(mw2)
|
||||
simpleRouter.PushMiddleware(mw1)
|
||||
simpleRouter.GET("test2", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {}))
|
||||
|
||||
ts = httptest.NewServer(simpleRouter)
|
||||
req, _ = http.NewRequest("GET", ts.URL+"/test2", nil)
|
||||
_, err = http.DefaultClient.Do(req)
|
||||
|
||||
Testing.AssertNotError(t, err)
|
||||
Testing.AssertEqual(t, 1, counter)
|
||||
ts.Close()
|
||||
counter = 0
|
||||
|
||||
simpleRouter.PopMiddleware()
|
||||
simpleRouter.PopMiddleware()
|
||||
simpleRouter.PushMiddleware(mw1)
|
||||
simpleRouter.PushMiddleware(mw2)
|
||||
simpleRouter.PushMiddleware(mw1)
|
||||
simpleRouter.PushMiddleware(mw2)
|
||||
simpleRouter.GET("test3", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {}))
|
||||
|
||||
ts = httptest.NewServer(simpleRouter)
|
||||
defer ts.Close()
|
||||
req, _ = http.NewRequest("GET", ts.URL+"/test3", nil)
|
||||
_, err = http.DefaultClient.Do(req)
|
||||
|
||||
Testing.AssertNotError(t, err)
|
||||
Testing.AssertEqual(t, 6, counter)
|
||||
ts.Close()
|
||||
}
|
||||
|
||||
func Test_middlewares2(t *testing.T) {
|
||||
counter := 0
|
||||
mw1 := func(next http.Handler) http.Handler {
|
||||
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
||||
counter += 1
|
||||
next.ServeHTTP(w, r)
|
||||
})
|
||||
}
|
||||
mw2 := func(next http.Handler) http.Handler {
|
||||
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
||||
counter = counter * 2
|
||||
next.ServeHTTP(w, r)
|
||||
})
|
||||
}
|
||||
simpleRouter := SimpleRouter()
|
||||
simpleRouter.PushMiddleware(mw1, mw2)
|
||||
simpleRouter.GET("test", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {}))
|
||||
|
||||
ts := httptest.NewServer(simpleRouter)
|
||||
req, _ := http.NewRequest("GET", ts.URL+"/test", nil)
|
||||
_, err := http.DefaultClient.Do(req)
|
||||
|
||||
Testing.AssertNotError(t, err)
|
||||
Testing.AssertEqual(t, 2, counter)
|
||||
ts.Close()
|
||||
counter = 0
|
||||
|
||||
simpleRouter.PopMiddleware()
|
||||
simpleRouter.PopMiddleware()
|
||||
simpleRouter.PushMiddleware(mw2, mw1)
|
||||
simpleRouter.GET("test2", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {}))
|
||||
|
||||
ts = httptest.NewServer(simpleRouter)
|
||||
req, _ = http.NewRequest("GET", ts.URL+"/test2", nil)
|
||||
_, err = http.DefaultClient.Do(req)
|
||||
|
||||
Testing.AssertNotError(t, err)
|
||||
Testing.AssertEqual(t, 1, counter)
|
||||
ts.Close()
|
||||
counter = 0
|
||||
|
||||
simpleRouter.PopMiddleware()
|
||||
simpleRouter.PopMiddleware()
|
||||
simpleRouter.PushMiddleware(mw1, mw2, mw1, mw2)
|
||||
simpleRouter.GET("test3", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {}))
|
||||
|
||||
ts = httptest.NewServer(simpleRouter)
|
||||
defer ts.Close()
|
||||
req, _ = http.NewRequest("GET", ts.URL+"/test3", nil)
|
||||
_, err = http.DefaultClient.Do(req)
|
||||
|
||||
Testing.AssertNotError(t, err)
|
||||
Testing.AssertEqual(t, 6, counter)
|
||||
ts.Close()
|
||||
}
|
||||
|
||||
func Test_globalMiddlewares(t *testing.T) {
|
||||
counter := 0
|
||||
mw1 := func(next http.Handler) http.Handler {
|
||||
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
||||
counter += 1
|
||||
next.ServeHTTP(w, r)
|
||||
})
|
||||
}
|
||||
mw2 := func(next http.Handler) http.Handler {
|
||||
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
||||
counter = counter * 2
|
||||
next.ServeHTTP(w, r)
|
||||
})
|
||||
}
|
||||
gmw1 := func(next http.Handler) http.Handler {
|
||||
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
||||
counter += 3
|
||||
next.ServeHTTP(w, r)
|
||||
})
|
||||
}
|
||||
gmw2 := func(next http.Handler) http.Handler {
|
||||
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
||||
counter = counter * 4
|
||||
next.ServeHTTP(w, r)
|
||||
})
|
||||
}
|
||||
simpleRouter := SimpleRouter()
|
||||
simpleRouter.PushGlobalMiddleware(gmw1)
|
||||
simpleRouter.PushGlobalMiddleware(gmw2)
|
||||
simpleRouter.PushMiddleware(mw1, mw2)
|
||||
simpleRouter.GET("test", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {}))
|
||||
simpleRouter.GET("test2", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {}))
|
||||
|
||||
ts := httptest.NewServer(simpleRouter)
|
||||
req, _ := http.NewRequest("GET", ts.URL+"/test", nil)
|
||||
_, err := http.DefaultClient.Do(req)
|
||||
Testing.AssertNotError(t, err)
|
||||
Testing.AssertEqual(t, 26, counter)
|
||||
counter = 0
|
||||
|
||||
req2, _ := http.NewRequest("GET", ts.URL+"/test2", nil)
|
||||
_, err2 := http.DefaultClient.Do(req2)
|
||||
Testing.AssertNotError(t, err2)
|
||||
Testing.AssertEqual(t, 26, counter)
|
||||
ts.Close()
|
||||
counter = 0
|
||||
|
||||
simpleRouter.PopGlobalMiddleware()
|
||||
simpleRouter.PopGlobalMiddleware()
|
||||
simpleRouter.PushGlobalMiddleware(gmw2)
|
||||
simpleRouter.PushGlobalMiddleware(gmw1)
|
||||
|
||||
ts = httptest.NewServer(simpleRouter)
|
||||
req, _ = http.NewRequest("GET", ts.URL+"/test", nil)
|
||||
_, err = http.DefaultClient.Do(req)
|
||||
Testing.AssertNotError(t, err)
|
||||
Testing.AssertEqual(t, 8, counter)
|
||||
counter = 0
|
||||
|
||||
req2, _ = http.NewRequest("GET", ts.URL+"/test2", nil)
|
||||
_, err2 = http.DefaultClient.Do(req2)
|
||||
Testing.AssertNotError(t, err2)
|
||||
Testing.AssertEqual(t, 8, counter)
|
||||
ts.Close()
|
||||
counter = 0
|
||||
}
|
||||
|
||||
func Test_globalMiddlewares2(t *testing.T) {
|
||||
counter := 0
|
||||
mw1 := func(next http.Handler) http.Handler {
|
||||
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
||||
counter += 1
|
||||
next.ServeHTTP(w, r)
|
||||
})
|
||||
}
|
||||
mw2 := func(next http.Handler) http.Handler {
|
||||
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
||||
counter = counter * 2
|
||||
next.ServeHTTP(w, r)
|
||||
})
|
||||
}
|
||||
gmw1 := func(next http.Handler) http.Handler {
|
||||
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
||||
counter += 3
|
||||
next.ServeHTTP(w, r)
|
||||
})
|
||||
}
|
||||
gmw2 := func(next http.Handler) http.Handler {
|
||||
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
||||
counter = counter * 4
|
||||
next.ServeHTTP(w, r)
|
||||
})
|
||||
}
|
||||
simpleRouter := SimpleRouter()
|
||||
simpleRouter.PushGlobalMiddleware(gmw1, gmw2)
|
||||
simpleRouter.PushMiddleware(mw1, mw2)
|
||||
simpleRouter.GET("test", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {}))
|
||||
simpleRouter.GET("test2", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {}))
|
||||
|
||||
ts := httptest.NewServer(simpleRouter)
|
||||
req, _ := http.NewRequest("GET", ts.URL+"/test", nil)
|
||||
_, err := http.DefaultClient.Do(req)
|
||||
Testing.AssertNotError(t, err)
|
||||
Testing.AssertEqual(t, 26, counter)
|
||||
counter = 0
|
||||
|
||||
req2, _ := http.NewRequest("GET", ts.URL+"/test2", nil)
|
||||
_, err2 := http.DefaultClient.Do(req2)
|
||||
Testing.AssertNotError(t, err2)
|
||||
Testing.AssertEqual(t, 26, counter)
|
||||
ts.Close()
|
||||
counter = 0
|
||||
|
||||
simpleRouter.PopGlobalMiddleware()
|
||||
simpleRouter.PopGlobalMiddleware()
|
||||
simpleRouter.PushGlobalMiddleware(gmw2, gmw1)
|
||||
|
||||
ts = httptest.NewServer(simpleRouter)
|
||||
req, _ = http.NewRequest("GET", ts.URL+"/test", nil)
|
||||
_, err = http.DefaultClient.Do(req)
|
||||
Testing.AssertNotError(t, err)
|
||||
Testing.AssertEqual(t, 8, counter)
|
||||
counter = 0
|
||||
|
||||
req2, _ = http.NewRequest("GET", ts.URL+"/test2", nil)
|
||||
_, err2 = http.DefaultClient.Do(req2)
|
||||
Testing.AssertNotError(t, err2)
|
||||
Testing.AssertEqual(t, 8, counter)
|
||||
ts.Close()
|
||||
counter = 0
|
||||
}
|
||||
|
||||
func Test_handle(t *testing.T) {
|
||||
counter := 0
|
||||
subpathHandler := func() http.Handler {
|
||||
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
||||
counter = 1
|
||||
})
|
||||
}
|
||||
regularHandler := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
||||
counter = 2
|
||||
})
|
||||
simpleRouter := SimpleRouter()
|
||||
simpleRouter.SubpathHandle("test/", subpathHandler())
|
||||
simpleRouter.Handle("GET", "test2", regularHandler)
|
||||
|
||||
ts := httptest.NewServer(simpleRouter)
|
||||
defer ts.Close()
|
||||
req, _ := http.NewRequest("GET", ts.URL+"/test/1", nil)
|
||||
res, err := http.DefaultClient.Do(req)
|
||||
Testing.AssertNotError(t, err)
|
||||
Testing.AssertEqual(t, http.StatusOK, res.StatusCode)
|
||||
Testing.AssertEqual(t, 1, counter)
|
||||
|
||||
req, _ = http.NewRequest("GET", ts.URL+"/test/2", nil)
|
||||
res, err = http.DefaultClient.Do(req)
|
||||
Testing.AssertNotError(t, err)
|
||||
Testing.AssertEqual(t, http.StatusOK, res.StatusCode)
|
||||
Testing.AssertEqual(t, 1, counter)
|
||||
|
||||
req, _ = http.NewRequest("GET", ts.URL+"/test2", nil)
|
||||
res, err = http.DefaultClient.Do(req)
|
||||
Testing.AssertNotError(t, err)
|
||||
Testing.AssertEqual(t, http.StatusOK, res.StatusCode)
|
||||
Testing.AssertEqual(t, 2, counter)
|
||||
}
|
||||
|
||||
func Test_methods(t *testing.T) {
|
||||
simpleRouter := SimpleRouter()
|
||||
simpleRouter.GET("test", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {}))
|
||||
simpleRouter.POST("test2", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {}))
|
||||
simpleRouter.PATCH("test3", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {}))
|
||||
simpleRouter.PUT("test4", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {}))
|
||||
simpleRouter.DELETE("test5", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {}))
|
||||
simpleRouter.OPTIONS("test6", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {}))
|
||||
simpleRouter.HEAD("test7", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {}))
|
||||
|
||||
ts := httptest.NewServer(simpleRouter)
|
||||
defer ts.Close()
|
||||
req, _ := http.NewRequest("GET", ts.URL+"/test", nil)
|
||||
req2, _ := http.NewRequest("POST", ts.URL+"/test", nil)
|
||||
res, err := http.DefaultClient.Do(req)
|
||||
Testing.AssertNotError(t, err)
|
||||
Testing.AssertEqual(t, http.StatusOK, res.StatusCode)
|
||||
res2, err := http.DefaultClient.Do(req2)
|
||||
Testing.AssertNotError(t, err)
|
||||
Testing.AssertEqual(t, http.StatusMethodNotAllowed, res2.StatusCode)
|
||||
|
||||
req, _ = http.NewRequest("POST", ts.URL+"/test2", nil)
|
||||
req2, _ = http.NewRequest("PATCH", ts.URL+"/test2", nil)
|
||||
res, err = http.DefaultClient.Do(req)
|
||||
Testing.AssertNotError(t, err)
|
||||
Testing.AssertEqual(t, http.StatusOK, res.StatusCode)
|
||||
res2, err = http.DefaultClient.Do(req2)
|
||||
Testing.AssertNotError(t, err)
|
||||
Testing.AssertEqual(t, http.StatusMethodNotAllowed, res2.StatusCode)
|
||||
|
||||
req, _ = http.NewRequest("PATCH", ts.URL+"/test3", nil)
|
||||
req2, _ = http.NewRequest("PUT", ts.URL+"/test3", nil)
|
||||
res, err = http.DefaultClient.Do(req)
|
||||
Testing.AssertNotError(t, err)
|
||||
Testing.AssertEqual(t, http.StatusOK, res.StatusCode)
|
||||
res2, err = http.DefaultClient.Do(req2)
|
||||
Testing.AssertNotError(t, err)
|
||||
Testing.AssertEqual(t, http.StatusMethodNotAllowed, res2.StatusCode)
|
||||
|
||||
req, _ = http.NewRequest("PUT", ts.URL+"/test4", nil)
|
||||
req2, _ = http.NewRequest("DELETE", ts.URL+"/test4", nil)
|
||||
res, err = http.DefaultClient.Do(req)
|
||||
Testing.AssertNotError(t, err)
|
||||
Testing.AssertEqual(t, http.StatusOK, res.StatusCode)
|
||||
res2, err = http.DefaultClient.Do(req2)
|
||||
Testing.AssertNotError(t, err)
|
||||
Testing.AssertEqual(t, http.StatusMethodNotAllowed, res2.StatusCode)
|
||||
|
||||
req, _ = http.NewRequest("DELETE", ts.URL+"/test5", nil)
|
||||
req2, _ = http.NewRequest("OPTIONS", ts.URL+"/test5", nil)
|
||||
res, err = http.DefaultClient.Do(req)
|
||||
Testing.AssertNotError(t, err)
|
||||
Testing.AssertEqual(t, http.StatusOK, res.StatusCode)
|
||||
res2, err = http.DefaultClient.Do(req2)
|
||||
Testing.AssertNotError(t, err)
|
||||
Testing.AssertEqual(t, http.StatusMethodNotAllowed, res2.StatusCode)
|
||||
|
||||
req, _ = http.NewRequest("OPTIONS", ts.URL+"/test6", nil)
|
||||
req2, _ = http.NewRequest("HEAD", ts.URL+"/test6", nil)
|
||||
res, err = http.DefaultClient.Do(req)
|
||||
Testing.AssertNotError(t, err)
|
||||
Testing.AssertEqual(t, http.StatusOK, res.StatusCode)
|
||||
res2, err = http.DefaultClient.Do(req2)
|
||||
Testing.AssertNotError(t, err)
|
||||
Testing.AssertEqual(t, http.StatusMethodNotAllowed, res2.StatusCode)
|
||||
|
||||
req, _ = http.NewRequest("HEAD", ts.URL+"/test7", nil)
|
||||
req2, _ = http.NewRequest("GET", ts.URL+"/test7", nil)
|
||||
res, err = http.DefaultClient.Do(req)
|
||||
Testing.AssertNotError(t, err)
|
||||
Testing.AssertEqual(t, http.StatusOK, res.StatusCode)
|
||||
res2, err = http.DefaultClient.Do(req2)
|
||||
Testing.AssertNotError(t, err)
|
||||
Testing.AssertEqual(t, http.StatusMethodNotAllowed, res2.StatusCode)
|
||||
}
|
||||
Reference in New Issue
Block a user