1 package sessions
2
3 import (
4 "github.com/gin-gonic/gin"
5 "net/http"
6 "net/http/httptest"
7 "strings"
8 "testing"
9 )
10
11 type storeFactory func(*testing.T) Store
12
13 const sessionName = "mysession"
14
15 const ok = "ok"
16
17 func sessionGetSet(t *testing.T, newStore storeFactory) {
18 r := gin.Default()
19 r.Use(Sessions(sessionName, newStore(t)))
20
21 r.GET("/set", func(c *gin.Context) {
22 session := Default(c)
23 session.Set("key", ok)
24 session.Save()
25 c.String(200, ok)
26 })
27
28 r.GET("/get", func(c *gin.Context) {
29 session := Default(c)
30 if session.Get("key") != ok {
31 t.Error("Session writing failed")
32 }
33 session.Save()
34 c.String(200, ok)
35 })
36
37 res1 := httptest.NewRecorder()
38 req1, _ := http.NewRequest("GET", "/set", nil)
39 r.ServeHTTP(res1, req1)
40
41 res2 := httptest.NewRecorder()
42 req2, _ := http.NewRequest("GET", "/get", nil)
43 req2.Header.Set("Cookie", res1.Header().Get("Set-Cookie"))
44 r.ServeHTTP(res2, req2)
45 }
46
47 func sessionDeleteKey(t *testing.T, newStore storeFactory) {
48 r := gin.Default()
49 r.Use(Sessions(sessionName, newStore(t)))
50
51 r.GET("/set", func(c *gin.Context) {
52 session := Default(c)
53 session.Set("key", ok)
54 session.Save()
55 c.String(200, ok)
56 })
57
58 r.GET("/delete", func(c *gin.Context) {
59 session := Default(c)
60 session.Delete("key")
61 session.Save()
62 c.String(200, ok)
63 })
64
65 r.GET("/get", func(c *gin.Context) {
66 session := Default(c)
67 if session.Get("key") != nil {
68 t.Error("Session deleting failed")
69 }
70 session.Save()
71 c.String(200, ok)
72 })
73
74 res1 := httptest.NewRecorder()
75 req1, _ := http.NewRequest("GET", "/set", nil)
76 r.ServeHTTP(res1, req1)
77
78 res2 := httptest.NewRecorder()
79 req2, _ := http.NewRequest("GET", "/delete", nil)
80 req2.Header.Set("Cookie", res1.Header().Get("Set-Cookie"))
81 r.ServeHTTP(res2, req2)
82
83 res3 := httptest.NewRecorder()
84 req3, _ := http.NewRequest("GET", "/get", nil)
85 req3.Header.Set("Cookie", res2.Header().Get("Set-Cookie"))
86 r.ServeHTTP(res3, req3)
87 }
88
89 func sessionFlashes(t *testing.T, newStore storeFactory) {
90 r := gin.Default()
91 store := newStore(t)
92 store.Options(Options{
93 Domain: "localhost",
94 })
95 r.Use(Sessions(sessionName, store))
96
97 r.GET("/set", func(c *gin.Context) {
98 session := Default(c)
99 session.AddFlash(ok)
100 session.Save()
101 c.String(200, ok)
102 })
103
104 r.GET("/flash", func(c *gin.Context) {
105 session := Default(c)
106 l := len(session.Flashes())
107 if l != 1 {
108 t.Error("Flashes count does not equal 1. Equals ", l)
109 }
110 session.Save()
111 c.String(200, ok)
112 })
113
114 r.GET("/check", func(c *gin.Context) {
115 session := Default(c)
116 l := len(session.Flashes())
117 if l != 0 {
118 t.Error("flashes count is not 0 after reading. Equals ", l)
119 }
120 session.Save()
121 c.String(200, ok)
122 })
123
124 res1 := httptest.NewRecorder()
125 req1, _ := http.NewRequest("GET", "/set", nil)
126 r.ServeHTTP(res1, req1)
127
128 res2 := httptest.NewRecorder()
129 req2, _ := http.NewRequest("GET", "/flash", nil)
130 req2.Header.Set("Cookie", res1.Header().Get("Set-Cookie"))
131 r.ServeHTTP(res2, req2)
132
133 res3 := httptest.NewRecorder()
134 req3, _ := http.NewRequest("GET", "/check", nil)
135 req3.Header.Set("Cookie", res2.Header().Get("Set-Cookie"))
136 r.ServeHTTP(res3, req3)
137 }
138
139 func sessionClear(t *testing.T, newStore storeFactory) {
140 data := map[string]string{
141 "key": "val",
142 "foo": "bar",
143 }
144 r := gin.Default()
145 store := newStore(t)
146 r.Use(Sessions(sessionName, store))
147
148 r.GET("/set", func(c *gin.Context) {
149 session := Default(c)
150 for k, v := range data {
151 session.Set(k, v)
152 }
153 session.Clear()
154 session.Save()
155 c.String(200, ok)
156 })
157
158 r.GET("/check", func(c *gin.Context) {
159 session := Default(c)
160 for k, v := range data {
161 if session.Get(k) == v {
162 t.Fatal("Session clear failed")
163 }
164 }
165 session.Save()
166 c.String(200, ok)
167 })
168
169 res1 := httptest.NewRecorder()
170 req1, _ := http.NewRequest("GET", "/set", nil)
171 r.ServeHTTP(res1, req1)
172
173 res2 := httptest.NewRecorder()
174 req2, _ := http.NewRequest("GET", "/check", nil)
175 req2.Header.Set("Cookie", res1.Header().Get("Set-Cookie"))
176 r.ServeHTTP(res2, req2)
177 }
178
179 func sessionOptions(t *testing.T, newStore storeFactory) {
180 r := gin.Default()
181 store := newStore(t)
182 store.Options(Options{
183 Domain: "localhost",
184 })
185 r.Use(Sessions(sessionName, store))
186
187 r.GET("/domain", func(c *gin.Context) {
188 session := Default(c)
189 session.Set("key", ok)
190 session.Options(Options{
191 Path: "/foo/bar/bat",
192 })
193 session.Save()
194 c.String(200, ok)
195 })
196 r.GET("/path", func(c *gin.Context) {
197 session := Default(c)
198 session.Set("key", ok)
199 session.Save()
200 c.String(200, ok)
201 })
202 res1 := httptest.NewRecorder()
203 req1, _ := http.NewRequest("GET", "/domain", nil)
204 r.ServeHTTP(res1, req1)
205
206 res2 := httptest.NewRecorder()
207 req2, _ := http.NewRequest("GET", "/path", nil)
208 r.ServeHTTP(res2, req2)
209
210 s := strings.Split(res1.Header().Get("Set-Cookie"), ";")
211 if s[1] != " Path=/foo/bar/bat" {
212 t.Error("Error writing path with options:", s[1])
213 }
214
215 s = strings.Split(res2.Header().Get("Set-Cookie"), ";")
216 if s[1] != " Domain=localhost" {
217 t.Error("Error writing domain with options:", s[1])
218 }
219 }
220
View as plain text