🌊

Cookieを参照した認証のテストコード(Go+Echo)

2023/04/23に公開

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