Home > Blockchain >  Why does gin SetCookie add new cookies but not change the old ones?
Why does gin SetCookie add new cookies but not change the old ones?

Time:09-20

I'm trying to test the Logout handler where there is a ctx.SetCookie method:

func (a *authController) Logout(ctx *gin.Context) {
    refreshToken, err := ctx.Cookie("refresh_token")
    ...
    ctx.SetCookie("access_token", "", -1, "/", "localhost", false, true)
    ctx.SetCookie("refresh_token", "", -1, "/", "localhost", false, true)
    ctx.SetCookie("logged_in", "", -1, "/", "localhost", false, true)

    ctx.JSON(http.StatusOK, gin.H{"status": "success"})

}

code inside the test function:

recorder := httptest.NewRecorder()
ctx, _ := gin.CreateTestContext(recorder)
ctx.SetCookie("logged_in", "truee", 60*60, "/", "localhost", false, false)
req, _ := http.NewRequest("GET", "/logout", nil)
http.SetCookie(recorder, &http.Cookie{Name: "refresh_token", Value: "encodedRefreshToken", MaxAge: 60 * 60, Path: "/", Domain: "localhost", Secure: false, HttpOnly: true}})
http.SetCookie(recorder, &http.Cookie{Name: "access_token", Value: "encodedAccessToken", MaxAge: 60 * 60, Path: "/", Domain: "localhost", Secure: false, HttpOnly: true})
req.Header = http.Header{"Cookie": recorder.Result().Header["Set-Cookie"]}
ctx.Request = req
test.mock()
authController.Logout(ctx)

After the call, I'm trying to check if the cookies have been deleted:


coockies := recorder.Result().Cookies()
for _, c := range coockies {
    if c.Name == "access_token" {
        assert.Equal(t, "", c.Value)
    }
    ...
}

And I face such a problem that setCookie does not change cookies , but adds new ones . That is, after calling this method, I have two pairs of cookies with access Token, etc.

And as a result, the tests do not pass. I don't understand I'm doing something wrong and can it be solved somehow? or is that how it should be ?

CodePudding user response:

Use AddCookie to set cookie for the recorder.

I think you should test the Logout handler like this:

package ${your_package}

import (
    "encoding/json"
    "net/http"
    "net/http/httptest"
    "testing"

    "github.com/gin-gonic/gin"
    "github.com/stretchr/testify/assert"
)

func Logout(ctx *gin.Context) {
    // refreshToken, err := ctx.Cookie("refresh_token")
    ctx.SetCookie("access_token", "", -1, "/", "localhost", false, true)
    ctx.SetCookie("refresh_token", "", -1, "/", "localhost", false, true)
    ctx.SetCookie("logged_in", "", -1, "/", "localhost", false, true)

    ctx.JSON(http.StatusOK, gin.H{"status": "success"})
}

func setupRouter() *gin.Engine {
    r := gin.Default()
    r.GET("/logout", Logout)
    return r
}

func TestLogout(t *testing.T) {
    w := httptest.NewRecorder()
    r := setupRouter()
    req, err := http.NewRequest("GET", "/logout", nil)
    assert.Nil(t, err)
    req.AddCookie(&http.Cookie{Name: "refresh_token", Value: "encodedRefreshToken", MaxAge: 60 * 60, Path: "/", Domain: "localhost", Secure: false, HttpOnly: true})
    req.AddCookie(&http.Cookie{Name: "access_token", Value: "encodedAccessToken", MaxAge: 60 * 60, Path: "/", Domain: "localhost", Secure: false, HttpOnly: true})
    r.ServeHTTP(w, req)

    for _, v := range w.Result().Cookies() {
        if v.Name == "access_token" {
            assert.Equal(t, "", v.Value)
        }
    }
    assert.Equal(t, http.StatusOK, w.Code)
    respBody := &gin.H{}
    err = json.Unmarshal(w.Body.Bytes(), respBody)
    assert.Nil(t, err)
    assert.Equal(t, gin.H{"status": "success"}, *respBody)
}
=== RUN   TestLogout
[GIN-debug] [WARNING] Creating an Engine instance with the Logger and Recovery middleware already attached.

[GIN-debug] [WARNING] Running in "debug" mode. Switch to "release" mode in production.
 - using env:   export GIN_MODE=release
 - using code:  gin.SetMode(gin.ReleaseMode)

[GIN-debug] GET    /logout                   --> app.Logout (3 handlers)
[GIN] 2022/09/19 - 10:46:00 | 200 |          81µs |                 | GET      "/logout"
--- PASS: TestLogout (0.00s)
PASS

Reference: https://gin-gonic.com/docs/testing/

  •  Tags:  
  • go
  • Related