package nethttp_test import ( "encoding/json" "net/http" "net/http/httptest" "testing" omni "git.yuntuo.hk/k2safe/go-omni" netrouter "git.yuntuo.hk/k2safe/go-omni/transport/nethttp" ) func TestRouterWorks(t *testing.T) { router := netrouter.New() app := omni.NewWithRouter(router) app.GET("/users/:id", func(ctx *omni.Context) error { return ctx.OK(map[string]string{"id": ctx.Param("id")}) }) recorder := httptest.NewRecorder() request := httptest.NewRequest(http.MethodGet, "/users/42", nil) app.ServeHTTP(recorder, request) if recorder.Code != http.StatusOK { t.Fatalf("expected 200, got %d: %s", recorder.Code, recorder.Body.String()) } var body struct { Data map[string]string `json:"data"` } if err := json.Unmarshal(recorder.Body.Bytes(), &body); err != nil { t.Fatalf("decode response: %v", err) } if body.Data["id"] != "42" { t.Fatalf("unexpected route parameter: %#v", body.Data) } } func TestRouterPrefersStaticRoutesAndReturnsMethodNotAllowed(t *testing.T) { router := netrouter.New() router.Handle(http.MethodGet, "/users/:id", http.HandlerFunc(func(writer http.ResponseWriter, _ *http.Request) { writer.WriteHeader(http.StatusAccepted) })) router.Handle(http.MethodGet, "/users/me", http.HandlerFunc(func(writer http.ResponseWriter, _ *http.Request) { writer.WriteHeader(http.StatusCreated) })) static := httptest.NewRecorder() router.ServeHTTP(static, httptest.NewRequest(http.MethodGet, "/users/me", nil)) if static.Code != http.StatusCreated { t.Fatalf("static route did not win, got %d", static.Code) } method := httptest.NewRecorder() router.ServeHTTP(method, httptest.NewRequest(http.MethodPost, "/users/me", nil)) if method.Code != http.StatusMethodNotAllowed || method.Header().Get("Allow") != http.MethodGet { t.Fatalf("unexpected method response: status=%d allow=%q", method.Code, method.Header().Get("Allow")) } }