58 lines
1.9 KiB
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 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"))
|
|
}
|
|
}
|