Files
go-omni/transport/nethttp/router_test.go

58 lines
1.9 KiB
Go

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 TestRouterWorksWithoutGin(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"))
}
}