🌊
Cookieを参照した認証のテストコード(Go+Echo)
EchoでCookieを参照する機能のテストコードを書きます
やりたいこと
認証機能(Cookieの文字列をもとにDB参照する機能)のテストコードを書く
ソースコード
route.go
e := echo.New()
e.GET("/todo", func(ctx echo.Context) error {
sessionHandler := IniSessionHandler(models.NewSessionModel(models.InitDataBase()))
return sessionHandler.GetTodo(ctx)
})
func (s sessionHandler) GetTodo(c echo.Context) error {
cookie, _ := c.Cookie("chech")
var result bool = s.session.CheckSession(cookie.Value)
if !result {
return echo.NewHTTPError(http.StatusUnauthorized)
}
return c.File("static/todos.html")
}
chechという名前のCookieを取得してセッション情報を管理する特定のテーブルを参照する
テストコード
route_test.go
type sessionModelStub struct {
result bool
}
func (u *sessionModelStub) CheckSession(string) bool { return u.result }
func Test_GetTodo_200(t *testing.T) {
e := echo.New()
req := httptest.NewRequest(http.MethodGet, "/todo", nil)
req.Header.Add("Cookie", fmt.Sprintf("%s=%s", "chech", "test"))
rec := httptest.NewRecorder()
c := e.NewContext(req, rec)
session := &sessionModelStub{result: true}
h := IniSessionHandler(session)
if assert.NoError(t, h.GetTodo(c)) {
assert.Equal(t, http.StatusOK, rec.Code)
}
}
func Test_GetTodo_401(t *testing.T) {
e := echo.New()
req := httptest.NewRequest(http.MethodGet, "/todo", nil)
req.Header.Add("Cookie", fmt.Sprintf("%s=%s", "chech", "test"))
rec := httptest.NewRecorder()
c := e.NewContext(req, rec)
session := &sessionModelStub{result: false}
h := IniSessionHandler(session)
err := h.GetTodo(c)
if assert.NotNil(t, err) {
err, res := err.(*echo.HTTPError)
if res {
assert.Equal(t, http.StatusUnauthorized, err.Code)
assert.Equal(t, "Unauthorized", err.Message)
}
}
}
テストコードではDB参照をモック化してブール値(true/false)を返します
true(認証成功時)はステータスコード200を確認する
false(認証失敗時)はステータスコード401を確認する
この実装とテストコードでは認証成功時のテストがなぜか失敗します。c.Fileを利用時に考慮が足りてないのかステータスコードが404になり合致しません。別途Echoのソースコードを少しずつ読んでみる予定です。
Discussion