1
2
3
4
5 package sessions
6
7 import (
8 "bytes"
9 "encoding/gob"
10 "net/http"
11 "net/http/httptest"
12 "testing"
13 )
14
15
16 func NewRecorder() *httptest.ResponseRecorder {
17 return &httptest.ResponseRecorder{
18 HeaderMap: make(http.Header),
19 Body: new(bytes.Buffer),
20 }
21 }
22
23
24
25 type FlashMessage struct {
26 Type int
27 Message string
28 }
29
30 func TestFlashes(t *testing.T) {
31 var req *http.Request
32 var rsp *httptest.ResponseRecorder
33 var hdr http.Header
34 var err error
35 var ok bool
36 var cookies []string
37 var session *Session
38 var flashes []interface{}
39
40 store := NewCookieStore([]byte("secret-key"))
41
42
43
44 req, _ = http.NewRequest("GET", "http://localhost:8080/", nil)
45 rsp = NewRecorder()
46
47 if session, err = store.Get(req, "session-key"); err != nil {
48 t.Fatalf("Error getting session: %v", err)
49 }
50
51 flashes = session.Flashes()
52 if len(flashes) != 0 {
53 t.Errorf("Expected empty flashes; Got %v", flashes)
54 }
55
56 session.AddFlash("foo")
57 session.AddFlash("bar")
58
59 session.AddFlash("baz", "custom_key")
60
61 if err = Save(req, rsp); err != nil {
62 t.Fatalf("Error saving session: %v", err)
63 }
64 hdr = rsp.Header()
65 cookies, ok = hdr["Set-Cookie"]
66 if !ok || len(cookies) != 1 {
67 t.Fatal("No cookies. Header:", hdr)
68 }
69
70 if _, err = store.Get(req, "session:key"); err.Error() != "sessions: invalid character in cookie name: session:key" {
71 t.Fatalf("Expected error due to invalid cookie name")
72 }
73
74
75
76 req, _ = http.NewRequest("GET", "http://localhost:8080/", nil)
77 req.Header.Add("Cookie", cookies[0])
78 rsp = NewRecorder()
79
80 if session, err = store.Get(req, "session-key"); err != nil {
81 t.Fatalf("Error getting session: %v", err)
82 }
83
84 flashes = session.Flashes()
85 if len(flashes) != 2 {
86 t.Fatalf("Expected flashes; Got %v", flashes)
87 }
88 if flashes[0] != "foo" || flashes[1] != "bar" {
89 t.Errorf("Expected foo,bar; Got %v", flashes)
90 }
91 flashes = session.Flashes()
92 if len(flashes) != 0 {
93 t.Errorf("Expected dumped flashes; Got %v", flashes)
94 }
95
96 flashes = session.Flashes("custom_key")
97 if len(flashes) != 1 {
98 t.Errorf("Expected flashes; Got %v", flashes)
99 } else if flashes[0] != "baz" {
100 t.Errorf("Expected baz; Got %v", flashes)
101 }
102 flashes = session.Flashes("custom_key")
103 if len(flashes) != 0 {
104 t.Errorf("Expected dumped flashes; Got %v", flashes)
105 }
106
107
108
109
110 req, _ = http.NewRequest("GET", "http://localhost:8080/", nil)
111 rsp = NewRecorder()
112
113 if session, err = store.Get(req, "session-key"); err != nil {
114 t.Fatalf("Error getting session: %v", err)
115 }
116
117 flashes = session.Flashes()
118 if len(flashes) != 0 {
119 t.Errorf("Expected empty flashes; Got %v", flashes)
120 }
121
122 session.AddFlash(&FlashMessage{42, "foo"})
123
124 if err = Save(req, rsp); err != nil {
125 t.Fatalf("Error saving session: %v", err)
126 }
127 hdr = rsp.Header()
128 cookies, ok = hdr["Set-Cookie"]
129 if !ok || len(cookies) != 1 {
130 t.Fatal("No cookies. Header:", hdr)
131 }
132
133
134
135
136 req, _ = http.NewRequest("GET", "http://localhost:8080/", nil)
137 req.Header.Add("Cookie", cookies[0])
138 rsp = NewRecorder()
139
140 if session, err = store.Get(req, "session-key"); err != nil {
141 t.Fatalf("Error getting session: %v", err)
142 }
143
144 flashes = session.Flashes()
145 if len(flashes) != 1 {
146 t.Fatalf("Expected flashes; Got %v", flashes)
147 }
148 custom := flashes[0].(FlashMessage)
149 if custom.Type != 42 || custom.Message != "foo" {
150 t.Errorf("Expected %#v, got %#v", FlashMessage{42, "foo"}, custom)
151 }
152
153
154
155
156 req, _ = http.NewRequest("GET", "http://localhost:8080/", nil)
157
158
159 if session, err = store.Get(req, "session-key"); err != nil {
160 t.Fatalf("Error getting session: %v", err)
161 }
162
163
164 session.Values["test"] = "test-value"
165
166
167 req = req.WithContext(req.Context())
168
169
170 if session, err = store.Get(req, "session-key"); err != nil {
171 t.Fatalf("Error getting session: %v", err)
172 }
173
174
175 if session.Values["test"] == nil {
176 t.Fatalf("Session test value is lost in the request context!")
177 }
178
179
180 if session.Values["test"] != "test-value" {
181 t.Fatalf("Session test value is changed in the request context!")
182 }
183 }
184
185 func TestCookieStoreMapPanic(t *testing.T) {
186 defer func() {
187 err := recover()
188 if err != nil {
189 t.Fatal(err)
190 }
191 }()
192
193 store := NewCookieStore([]byte("aaa0defe5d2839cbc46fc4f080cd7adc"))
194 req, err := http.NewRequest("GET", "http://www.example.com", nil)
195 if err != nil {
196 t.Fatal("failed to create request", err)
197 }
198 w := httptest.NewRecorder()
199
200 session := NewSession(store, "hello")
201
202 session.Values["data"] = "hello-world"
203
204 err = session.Save(req, w)
205 if err != nil {
206 t.Fatal("failed to save session", err)
207 }
208 }
209
210 func init() {
211 gob.Register(FlashMessage{})
212 }
213
View as plain text