Skip to content

Commit ffe81b8

Browse files
committed
Update store/store_test.go
1 parent 20aa2a3 commit ffe81b8

File tree

3 files changed

+230
-1
lines changed

3 files changed

+230
-1
lines changed

.gitignore

+1
Original file line numberDiff line numberDiff line change
@@ -23,3 +23,4 @@ _testmain.go
2323
*.test
2424

2525
*.db
26+
*.out

store/store.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,7 @@ func (s *Store) save(session *sessions.Session) error {
120120
}
121121
data, err := proto.Marshal(shared.NewSession(buf.Bytes(), session.Options.MaxAge))
122122
if err != nil {
123-
return nil
123+
return err
124124
}
125125
err = s.db.Update(func(tx *bolt.Tx) error {
126126
return tx.Bucket(s.config.DBOptions.BucketName).Put([]byte(session.ID), data)

store/store_test.go

+228
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,13 @@ package store
22

33
import (
44
"net/http"
5+
"net/http/httptest"
56
"testing"
7+
"time"
68

79
"github.com/boltdb/bolt"
10+
"github.com/gorilla/securecookie"
11+
"github.com/gorilla/sessions"
812
)
913

1014
func TestStore_Get(t *testing.T) {
@@ -37,3 +41,227 @@ func TestStore_Get(t *testing.T) {
3741
t.Errorf("session.IsNew should be true (actual: %+v)", session.IsNew)
3842
}
3943
}
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

Comments
 (0)