From a372feb94ba1dfe119f2b350b77302a243ab17f2 Mon Sep 17 00:00:00 2001 From: mo khan Date: Wed, 30 Apr 2025 17:01:41 -0600 Subject: fix: adjust cookie expiration calculation --- pkg/web/cookie/option.go | 3 ++- pkg/web/cookie/option_test.go | 53 +++++++++++++++++++++++++++++++++++++++++++ pkg/web/cookie/test_option.go | 52 ------------------------------------------ 3 files changed, 55 insertions(+), 53 deletions(-) create mode 100644 pkg/web/cookie/option_test.go delete mode 100644 pkg/web/cookie/test_option.go diff --git a/pkg/web/cookie/option.go b/pkg/web/cookie/option.go index 3f2cc93..58a2e93 100644 --- a/pkg/web/cookie/option.go +++ b/pkg/web/cookie/option.go @@ -50,7 +50,8 @@ func WithExpiration(expires time.Time) x.Option[*http.Cookie] { if expires.Before(time.Now()) { c.MaxAge = -1 } else { - c.MaxAge = int(time.Until(expires).Seconds()) + duration := time.Until(expires).Round(time.Second) + c.MaxAge = int(duration.Seconds()) } }) } diff --git a/pkg/web/cookie/option_test.go b/pkg/web/cookie/option_test.go new file mode 100644 index 0000000..97913ba --- /dev/null +++ b/pkg/web/cookie/option_test.go @@ -0,0 +1,53 @@ +package cookie + +import ( + "net/http" + "testing" + "time" + + "github.com/stretchr/testify/assert" +) + +func TestOption(t *testing.T) { + t.Run("WithPath", func(t *testing.T) { + assert.Equal(t, "/blah", New("name", "value", WithPath("/blah")).Path) + }) + + t.Run("WithHttpOnly", func(t *testing.T) { + assert.False(t, New("x", "v", WithHttpOnly(false)).HttpOnly) + assert.True(t, New("x", "v", WithHttpOnly(true)).HttpOnly) + }) + + t.Run("WithSecure", func(t *testing.T) { + assert.False(t, New("x", "v", WithSecure(false)).Secure) + assert.True(t, New("x", "v", WithSecure(true)).Secure) + }) + + t.Run("WithDomain", func(t *testing.T) { + assert.Equal(t, "example.com", New("x", "v", WithDomain("example.com")).Domain) + }) + + t.Run("WithSameSite", func(t *testing.T) { + assert.Equal(t, http.SameSiteLaxMode, New("x", "v", WithSameSite(http.SameSiteLaxMode)).SameSite) + assert.Equal(t, http.SameSiteStrictMode, New("x", "v", WithSameSite(http.SameSiteStrictMode)).SameSite) + assert.Equal(t, http.SameSiteNoneMode, New("x", "v", WithSameSite(http.SameSiteNoneMode)).SameSite) + }) + + t.Run("WithExpiration", func(t *testing.T) { + now := time.Now() + + t.Run("with future time", func(t *testing.T) { + expires := now.Add(1 * time.Second) + cookie := New("x", "v", WithExpiration(expires)) + assert.Equal(t, expires, cookie.Expires) + assert.Equal(t, 1, cookie.MaxAge) + }) + + t.Run("with past time", func(t *testing.T) { + expires := now.Add(-1 * time.Second) + cookie := New("x", "v", WithExpiration(expires)) + assert.Equal(t, expires, cookie.Expires) + assert.Equal(t, -1, cookie.MaxAge) + }) + }) +} diff --git a/pkg/web/cookie/test_option.go b/pkg/web/cookie/test_option.go deleted file mode 100644 index caf1497..0000000 --- a/pkg/web/cookie/test_option.go +++ /dev/null @@ -1,52 +0,0 @@ -package cookie - -import ( - "net/http" - "testing" - "time" - - "github.com/stretchr/testify/assert" -) - -func TestOption(t *testing.T) { - t.Run("WithPath", func(t *testing.T) { - assert.Equal(t, "/blah", New("name", "value", WithPath("/blah")).Path) - }) - - t.Run("WithHttpOnly", func(t *testing.T) { - assert.False(t, New("x", "v", WithHttpOnly(false)).HttpOnly) - assert.True(t, New("x", "v", WithHttpOnly(true)).HttpOnly) - }) - - t.Run("WithSecure", func(t *testing.T) { - assert.False(t, New("x", "v", WithSecure(false)).Secure) - assert.True(t, New("x", "v", WithSecure(true)).Secure) - }) - - t.Run("WithDomain", func(t *testing.T) { - assert.Equal(t, "example.com", New("x", "v", WithDomain("example.com")).Domain) - }) - - t.Run("WithSameSite", func(t *testing.T) { - assert.Equal(t, http.SameSiteLaxMode, New("x", "v", WithSameSite(http.SameSiteLaxMode)).SameSite) - assert.Equal(t, http.SameSiteStrictMode, New("x", "v", WithSameSite(http.SameSiteStrictMode)).SameSite) - assert.Equal(t, http.SameSiteNoneMode, New("x", "v", WithSameSite(http.SameSiteNoneMode)).SameSite) - }) - - t.Run("WithExpiration", func(t *testing.T) { - now := time.Now() - expires := now.Add(1 * time.Second) - - t.Run("with future time", func(t *testing.T) { - cookie := New("x", "v", WithExpiration(now.Add(1*time.Second))) - assert.Equal(t, expires, cookie.Expires) - assert.Equal(t, time.Until(expires).Seconds(), cookie.MaxAge) - }) - - t.Run("with past time", func(t *testing.T) { - cookie := New("x", "v", WithExpiration(now.Add(-1*time.Second))) - assert.Equal(t, expires, cookie.Expires) - assert.Equal(t, -1, cookie.MaxAge) - }) - }) -} -- cgit v1.2.3