Skip to content

Commit 9bca6bc

Browse files
committed
test: add tests for session.go
1 parent ed66f11 commit 9bca6bc

1 file changed

Lines changed: 110 additions & 0 deletions

File tree

backend/utils/session_test.go

Lines changed: 110 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,110 @@
1+
package utils
2+
3+
import (
4+
"crypto/tls"
5+
"net/http"
6+
"net/http/httptest"
7+
"testing"
8+
9+
"github.com/gorilla/sessions"
10+
"github.com/stretchr/testify/assert"
11+
)
12+
13+
func Test_IsSecure(t *testing.T) {
14+
tests := []struct {
15+
name string
16+
setupReq func(r *http.Request)
17+
wantSecure bool
18+
}{
19+
{
20+
name: "plain HTTP — no TLS, no header",
21+
setupReq: func(r *http.Request) {},
22+
wantSecure: false,
23+
},
24+
{
25+
name: "TLS connection",
26+
setupReq: func(r *http.Request) { r.TLS = &tls.ConnectionState{} },
27+
wantSecure: true,
28+
},
29+
{
30+
name: "X-Forwarded-Proto: https",
31+
setupReq: func(r *http.Request) { r.Header.Set("X-Forwarded-Proto", "https") },
32+
wantSecure: true,
33+
},
34+
{
35+
name: "X-Forwarded-Proto: http",
36+
setupReq: func(r *http.Request) { r.Header.Set("X-Forwarded-Proto", "http") },
37+
wantSecure: false,
38+
},
39+
{
40+
name: "TLS takes precedence over contradictory header",
41+
setupReq: func(r *http.Request) {
42+
r.TLS = &tls.ConnectionState{}
43+
r.Header.Set("X-Forwarded-Proto", "http")
44+
},
45+
wantSecure: true,
46+
},
47+
}
48+
49+
for _, tt := range tests {
50+
t.Run(tt.name, func(t *testing.T) {
51+
r := httptest.NewRequest(http.MethodGet, "/", nil)
52+
tt.setupReq(r)
53+
assert.Equal(t, tt.wantSecure, IsSecure(r))
54+
})
55+
}
56+
}
57+
58+
func newTestStore() *sessions.CookieStore {
59+
return sessions.NewCookieStore([]byte("test-secret-key"))
60+
}
61+
62+
func Test_SaveSessionWithSecureCookie_SecureCookieOnHTTPS(t *testing.T) {
63+
store := newTestStore()
64+
r := httptest.NewRequest(http.MethodGet, "/", nil)
65+
r.Header.Set("X-Forwarded-Proto", "https")
66+
w := httptest.NewRecorder()
67+
68+
session, _ := store.Get(r, "session-name")
69+
assert.NoError(t, SaveSessionWithSecureCookie(session, r, w))
70+
assert.Contains(t, w.Header().Get("Set-Cookie"), "Secure")
71+
}
72+
73+
func Test_SaveSessionWithSecureCookie_NoSecureCookieOnHTTP(t *testing.T) {
74+
store := newTestStore()
75+
r := httptest.NewRequest(http.MethodGet, "/", nil)
76+
w := httptest.NewRecorder()
77+
78+
session, _ := store.Get(r, "session-name")
79+
assert.NoError(t, SaveSessionWithSecureCookie(session, r, w))
80+
assert.NotContains(t, w.Header().Get("Set-Cookie"), "Secure")
81+
}
82+
83+
func Test_SaveSessionWithSecureCookie_RestoresOriginalSecureFlag(t *testing.T) {
84+
tests := []struct {
85+
name string
86+
originalSecure bool
87+
proto string
88+
}{
89+
{"original false, HTTPS request — restored to false", false, "https"},
90+
{"original true, HTTP request — restored to true", true, ""},
91+
}
92+
93+
for _, tt := range tests {
94+
t.Run(tt.name, func(t *testing.T) {
95+
store := newTestStore()
96+
r := httptest.NewRequest(http.MethodGet, "/", nil)
97+
if tt.proto != "" {
98+
r.Header.Set("X-Forwarded-Proto", tt.proto)
99+
}
100+
w := httptest.NewRecorder()
101+
102+
session, _ := store.Get(r, "session-name")
103+
session.Options.Secure = tt.originalSecure
104+
105+
_ = SaveSessionWithSecureCookie(session, r, w)
106+
107+
assert.Equal(t, tt.originalSecure, session.Options.Secure)
108+
})
109+
}
110+
}

0 commit comments

Comments
 (0)