From 21b5aaeac2123d1904cc1cbd90f9c9ffc6b1e9bb Mon Sep 17 00:00:00 2001 From: Levente Nas Date: Mon, 2 Dec 2024 15:34:38 +0100 Subject: [PATCH] feat: add tests for simplerouter #9 --- unstable/simplerouter/router_test.go | 409 +++++++++++++++++++++++++++ 1 file changed, 409 insertions(+) create mode 100644 unstable/simplerouter/router_test.go diff --git a/unstable/simplerouter/router_test.go b/unstable/simplerouter/router_test.go new file mode 100644 index 0000000..bec2742 --- /dev/null +++ b/unstable/simplerouter/router_test.go @@ -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) +}