@@ -2,9 +2,13 @@ package store
2
2
3
3
import (
4
4
"net/http"
5
+ "net/http/httptest"
5
6
"testing"
7
+ "time"
6
8
7
9
"github.com/boltdb/bolt"
10
+ "github.com/gorilla/securecookie"
11
+ "github.com/gorilla/sessions"
8
12
)
9
13
10
14
func TestStore_Get (t * testing.T ) {
@@ -37,3 +41,227 @@ func TestStore_Get(t *testing.T) {
37
41
t .Errorf ("session.IsNew should be true (actual: %+v)" , session .IsNew )
38
42
}
39
43
}
44
+
45
+ func TestStore_New (t * testing.T ) {
46
+ db , err := bolt .Open ("./sessions.db" , 0666 )
47
+ if err != nil {
48
+ t .Error (err .Error ())
49
+ }
50
+ defer db .Close ()
51
+
52
+ str , err := New (
53
+ db ,
54
+ Config {},
55
+ []byte ("secret-key" ),
56
+ )
57
+ if err != nil {
58
+ t .Error (err .Error ())
59
+ }
60
+
61
+ req , err := http .NewRequest ("GET" , "http://localhost:3000/" , nil )
62
+ if err != nil {
63
+ t .Error (err .Error ())
64
+ }
65
+
66
+ encoded , err := securecookie .EncodeMulti ("test" , "1" , str .codecs ... )
67
+
68
+ req .AddCookie (sessions .NewCookie ("test" , encoded , & sessions.Options {
69
+ MaxAge : 1024 ,
70
+ }))
71
+
72
+ session , err := str .New (req , "test" )
73
+ if err != nil {
74
+ t .Error (err .Error ())
75
+ }
76
+
77
+ if session .IsNew != true {
78
+ t .Errorf ("session.IsNew should be true (actual: %+v)" , session .IsNew )
79
+ }
80
+ }
81
+
82
+ func TestStore_Save (t * testing.T ) {
83
+ // When session.Options.MaxAge < 0
84
+ db , err := bolt .Open ("./sessions.db" , 0666 )
85
+ if err != nil {
86
+ t .Error (err .Error ())
87
+ }
88
+ defer db .Close ()
89
+
90
+ str , err := New (
91
+ db ,
92
+ Config {},
93
+ []byte ("secret-key" ),
94
+ )
95
+ if err != nil {
96
+ t .Error (err .Error ())
97
+ }
98
+
99
+ req , err := http .NewRequest ("GET" , "http://localhost:3000/" , nil )
100
+ if err != nil {
101
+ t .Error (err .Error ())
102
+ }
103
+
104
+ session , err := str .Get (req , "test" )
105
+ if err != nil {
106
+ t .Error (err .Error ())
107
+ }
108
+
109
+ session .Options .MaxAge = - 1
110
+
111
+ w := httptest .NewRecorder ()
112
+
113
+ str .Save (req , w , session )
114
+
115
+ // When session.Options.MaxAge >= 0
116
+ session , err = str .Get (req , "test" )
117
+ if err != nil {
118
+ t .Error (err .Error ())
119
+ }
120
+
121
+ session .Options .MaxAge = 1
122
+
123
+ w = httptest .NewRecorder ()
124
+
125
+ str .Save (req , w , session )
126
+
127
+ // When session.Options.MaxAge >= 0 and
128
+ // s.save returns an error
129
+ session .Values = make (map [interface {}]interface {})
130
+ session .Values [make (chan int )] = make (chan int )
131
+ str .Save (req , w , session )
132
+
133
+ // When session.Options.MaxAge >= 0 and
134
+ // securecookie.EncodeMulti returns an error
135
+ session .Values = make (map [interface {}]interface {})
136
+ str .codecs = nil
137
+ str .Save (req , w , session )
138
+ }
139
+
140
+ func TestStore_load (t * testing.T ) {
141
+ db , err := bolt .Open ("./sessions.db" , 0666 )
142
+ if err != nil {
143
+ t .Error (err .Error ())
144
+ }
145
+ defer db .Close ()
146
+
147
+ str , err := New (
148
+ db ,
149
+ Config {},
150
+ []byte ("secret-key" ),
151
+ )
152
+ if err != nil {
153
+ t .Error (err .Error ())
154
+ }
155
+
156
+ req , err := http .NewRequest ("GET" , "http://localhost:3000/" , nil )
157
+ if err != nil {
158
+ t .Error (err .Error ())
159
+ }
160
+
161
+ session , err := str .Get (req , "test" )
162
+ if err != nil {
163
+ t .Error (err .Error ())
164
+ }
165
+
166
+ w := httptest .NewRecorder ()
167
+
168
+ str .Save (req , w , session )
169
+
170
+ exists , err := str .load (session )
171
+ if err != nil {
172
+ t .Error (err .Error ())
173
+ }
174
+
175
+ if exists != true {
176
+ t .Error ("Store.load should return true (actual: false)" )
177
+ }
178
+
179
+ // When the target session data is nil
180
+ session .ID = "x"
181
+ exists , err = str .load (session )
182
+ if err != nil {
183
+ t .Error (err .Error ())
184
+ }
185
+
186
+ if exists != false {
187
+ t .Error ("Store.load should return false (actual: true)" )
188
+ }
189
+
190
+ // When shared.Session returns an error
191
+ err = db .Update (func (tx * bolt.Tx ) error {
192
+ return tx .Bucket (str .config .DBOptions .BucketName ).Put ([]byte ("x" ), []byte ("test" ))
193
+ })
194
+ if err != nil {
195
+ t .Error (err .Error ())
196
+ }
197
+ _ , err = str .load (session )
198
+ if err == nil || err .Error () != "proto: field/encoding mismatch: wrong type for field" {
199
+ t .Error (`str.load should return an error "%s" (actual: %s)` , "proto: field/encoding mismatch: wrong type for field" , err )
200
+ }
201
+
202
+ // When the target session data is expired
203
+ session , err = str .Get (req , "test" )
204
+ if err != nil {
205
+ t .Error (err .Error ())
206
+ }
207
+ session .Options .MaxAge = 0
208
+ str .Save (req , w , session )
209
+ time .Sleep (time .Second )
210
+ _ , err = str .load (session )
211
+ if err != nil {
212
+ t .Error (err .Error ())
213
+ }
214
+ }
215
+
216
+ func TestSession_delete (t * testing.T ) {
217
+ db , err := bolt .Open ("./sessions.db" , 0666 )
218
+ if err != nil {
219
+ t .Error (err .Error ())
220
+ }
221
+ defer db .Close ()
222
+
223
+ str , err := New (
224
+ db ,
225
+ Config {},
226
+ []byte ("secret-key" ),
227
+ )
228
+ if err != nil {
229
+ t .Error (err .Error ())
230
+ }
231
+
232
+ req , err := http .NewRequest ("GET" , "http://localhost:3000/" , nil )
233
+ if err != nil {
234
+ t .Error (err .Error ())
235
+ }
236
+
237
+ session , err := str .Get (req , "test" )
238
+ if err != nil {
239
+ t .Error (err .Error ())
240
+ }
241
+
242
+ db .Close ()
243
+
244
+ err = str .delete (session )
245
+
246
+ if err .Error () != "database not open" {
247
+ t .Error (`str.delete should return an error "%s" (actual: %s)` , "database not open" , err )
248
+ }
249
+ }
250
+
251
+ func TestNew (t * testing.T ) {
252
+ // When db.Update returns an error
253
+ db , err := bolt .Open ("./sessions.db" , 0666 )
254
+ if err != nil {
255
+ t .Error (err .Error ())
256
+ }
257
+ db .Close ()
258
+
259
+ _ , err = New (
260
+ db ,
261
+ Config {},
262
+ []byte ("secret-key" ),
263
+ )
264
+ if err .Error () != "database not open" {
265
+ t .Error (`str.delete should return an error "%s" (actual: %s)` , "database not open" , err )
266
+ }
267
+ }
0 commit comments