Skip to content

Commit de639d4

Browse files
samugibungle
authored andcommitted
tests(*): instance methods and cookie_attributes
1 parent fba61ea commit de639d4

File tree

1 file changed

+203
-10
lines changed

1 file changed

+203
-10
lines changed

spec/03-session_spec.lua

+203-10
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,18 @@ local pcall = pcall
88
local it = it
99

1010

11-
local function extract_session_cookie(cookie_name, cookies)
12-
local session_cookie = ngx.re.match(cookies, cookie_name .. "=([\\w-]+);")
11+
local function extract_cookie(cookie_name, cookies)
12+
local session_cookie
13+
if type(cookies) == "table" then
14+
for _, v in ipairs(cookies) do
15+
session_cookie = ngx.re.match(v, cookie_name .. "=([\\w-]+);")
16+
if session_cookie then
17+
return session_cookie[1]
18+
end
19+
end
20+
return ""
21+
end
22+
session_cookie = ngx.re.match(cookies, cookie_name .. "=([\\w-]+);")
1323
return session_cookie and session_cookie[1] or ""
1424
end
1525

@@ -18,11 +28,14 @@ describe("Session", function()
1828
local configuration = {}
1929

2030
describe("instance methods behave as expected", function()
21-
local cookie_name = "session_cookie"
22-
local test_key = "test_key"
23-
local data = "test_data"
24-
local test_subject = "test_subject"
25-
local test_audience = "test_audience"
31+
local cookie_name = "session_cookie"
32+
local remember_cookie_name = "remember_cookie"
33+
local test_key = "test_key"
34+
local data = "test_data"
35+
local test_subject = "test_subject"
36+
local test_audience = "test_audience"
37+
local lout_subject = "lout_subject"
38+
local lout_audience = "lout_audience"
2639

2740
local function test_session_set_get(s)
2841
assert.is_nil(
@@ -52,7 +65,7 @@ describe("Session", function()
5265
assert.is_not_nil(s.meta.data_size)
5366
assert(s.meta.data_size > 0)
5467

55-
local session_cookie = extract_session_cookie(cookie_name, cookies["Set-Cookie"])
68+
local session_cookie = extract_cookie(cookie_name, cookies["Set-Cookie"])
5669
return session_cookie
5770
end
5871

@@ -76,6 +89,17 @@ describe("Session", function()
7689
assert.equals(data, s:get(test_key))
7790
end
7891

92+
local function test_session_get_property(s)
93+
assert.equals(43, #s:get_property("id"))
94+
assert.equals(32, #s:get_property("nonce"))
95+
assert.equals(test_audience, s:get_property("audience"))
96+
assert.equals(test_subject, s:get_property("subject"))
97+
assert.match.is_number(s:get_property("timeout"))
98+
assert.match.is_number(s:get_property("idling-timeout"))
99+
assert.match.is_number(s:get_property("rolling-timeout"))
100+
assert.match.is_number(s:get_property("absolute-timeout"))
101+
end
102+
79103
local function test_session_touch(s)
80104
local ok, err = s:touch()
81105
assert.is_true(ok)
@@ -97,7 +121,7 @@ describe("Session", function()
97121
assert.is_false(ok)
98122
assert.matches("unable to get session data", err)
99123

100-
local session_cookie = extract_session_cookie(cookie_name, cookies["Set-Cookie"]) -- empty
124+
local session_cookie = extract_cookie(cookie_name, cookies["Set-Cookie"]) -- empty
101125

102126
session.__set_ngx_var({
103127
["cookie_" .. cookie_name] = session_cookie
@@ -120,13 +144,15 @@ describe("Session", function()
120144
test_session_set_get(s)
121145
session_cookie = test_session_save(s, cookies)
122146
test_session_close_open(s, session_cookie)
147+
test_session_get_property(s)
123148
test_session_touch(s)
124149
test_session_destroy_open(s)
125150
end
126151

127152
before_each(function()
128153
configuration = {
129-
cookie_name = cookie_name
154+
cookie_name = cookie_name,
155+
remember_cookie_name = remember_cookie_name
130156
}
131157
end)
132158

@@ -158,6 +184,164 @@ describe("Session", function()
158184

159185
assert.equals(configuration.ikm, s.meta.ikm)
160186
end)
187+
188+
it("logout individual audience and subject", function()
189+
local cookies = {}
190+
session.__set_ngx_header(cookies)
191+
session.init(configuration)
192+
193+
configuration.audience = test_audience
194+
configuration.subject = test_subject
195+
local s1 = session.new(configuration)
196+
assert.is_not_nil(s1)
197+
test_session_save(s1, cookies)
198+
local session_cookie = extract_cookie(cookie_name, cookies["Set-Cookie"])
199+
session.__set_ngx_var({
200+
["cookie_" .. cookie_name] = session_cookie
201+
})
202+
assert.is_not_nil(session_cookie)
203+
assert.is_not_equal("", session_cookie)
204+
assert.match(s1:get_audience(), configuration.audience)
205+
206+
configuration.audience = lout_audience
207+
configuration.subject = lout_subject
208+
local s2 = session.open(configuration)
209+
assert.is_not_nil(s2)
210+
test_session_save(s2, cookies)
211+
session_cookie = extract_cookie(cookie_name, cookies["Set-Cookie"])
212+
session.__set_ngx_var({
213+
["cookie_" .. cookie_name] = session_cookie
214+
})
215+
assert.is_not_nil(session_cookie)
216+
assert.is_not_equal("", session_cookie)
217+
assert.equals(configuration.audience, s2:get_audience())
218+
219+
s2:logout()
220+
assert.equals(s1.state, "open")
221+
assert.equals(s2.state, "closed")
222+
session_cookie = extract_cookie(cookie_name, cookies["Set-Cookie"])
223+
session.__set_ngx_var({
224+
["cookie_" .. cookie_name] = session_cookie
225+
})
226+
assert.is_not_nil(session_cookie)
227+
assert.is_not_equal("", session_cookie)
228+
229+
s1:logout()
230+
assert.equals(s1.state, "closed")
231+
session_cookie = extract_cookie(cookie_name, cookies["Set-Cookie"])
232+
assert.is_not_nil(session_cookie)
233+
assert.equals("", session_cookie)
234+
end)
235+
236+
it("set_remember=true produces remember cookie, get_remember returns expected values", function()
237+
local cookies = {}
238+
session.__set_ngx_header(cookies)
239+
session.init(configuration)
240+
241+
local s = session.new()
242+
assert.is_not_nil(s)
243+
assert.is_false(s:get_remember())
244+
s:save()
245+
assert.equals(s.state, "open")
246+
local session_cookie = extract_cookie(cookie_name, cookies["Set-Cookie"])
247+
local remember_cookie = extract_cookie(remember_cookie_name, cookies["Set-Cookie"])
248+
assert.is_not_nil(remember_cookie)
249+
assert.equals("", remember_cookie)
250+
251+
session.__set_ngx_var({
252+
["cookie_" .. cookie_name] = session_cookie,
253+
["cookie_" .. remember_cookie_name] = remember_cookie,
254+
})
255+
s:set_remember(true)
256+
assert.is_true(s:get_remember())
257+
s:save()
258+
assert.equals(s.state, "open")
259+
remember_cookie = extract_cookie(remember_cookie_name, cookies["Set-Cookie"])
260+
assert.is_not_nil(remember_cookie)
261+
assert.is_not_equal(remember_cookie, "")
262+
end)
263+
264+
describe("with custom cookie attribute", function()
265+
it("Domain", function()
266+
configuration.cookie_domain = "example.org"
267+
session.init(configuration)
268+
269+
local s = session.new()
270+
assert.is_not_nil(s)
271+
test_session(s)
272+
assert.matches("Domain=example.org", s.cookie_flags)
273+
end)
274+
275+
it("Path", function()
276+
configuration.cookie_path = "/test"
277+
session.init(configuration)
278+
279+
local s = session.new()
280+
assert.is_not_nil(s)
281+
test_session(s)
282+
assert.matches("Path=/test", s.cookie_flags)
283+
end)
284+
285+
it("SameSite", function()
286+
configuration.cookie_same_site = "Default"
287+
session.init(configuration)
288+
289+
local s = session.new()
290+
assert.is_not_nil(s)
291+
test_session(s)
292+
assert.matches("SameSite=Default", s.cookie_flags)
293+
end)
294+
295+
it("HttpOnly", function()
296+
configuration.cookie_http_only = false
297+
session.init(configuration)
298+
299+
local s = session.new()
300+
assert.is_not_nil(s)
301+
test_session(s)
302+
assert.does_not.match("HttpOnly", s.cookie_flags)
303+
end)
304+
305+
it("Secure", function()
306+
configuration.cookie_secure = true
307+
session.init(configuration)
308+
309+
local s = session.new()
310+
assert.is_not_nil(s)
311+
test_session(s)
312+
assert.matches("Secure", s.cookie_flags)
313+
end)
314+
315+
it("Priority", function()
316+
configuration.cookie_priority = "High"
317+
session.init(configuration)
318+
319+
local s = session.new()
320+
assert.is_not_nil(s)
321+
test_session(s)
322+
assert.matches("Priority=High", s.cookie_flags)
323+
end)
324+
325+
it("Partitioned", function()
326+
configuration.cookie_partitioned = true
327+
session.init(configuration)
328+
329+
local s = session.new()
330+
assert.is_not_nil(s)
331+
test_session(s)
332+
assert.matches("Partitioned", s.cookie_flags)
333+
end)
334+
335+
it("SameParty", function()
336+
configuration.cookie_same_party = true
337+
session.init(configuration)
338+
339+
local s = session.new()
340+
assert.is_not_nil(s)
341+
test_session(s)
342+
assert.matches("SameParty", s.cookie_flags)
343+
end)
344+
end)
161345
end)
162346

163347
describe("Fields validation", function()
@@ -207,6 +391,15 @@ describe("Session", function()
207391
assert.is_false(ok)
208392
assert.matches("invalid ikm size", err)
209393
end)
394+
395+
it("SameParty and SameSite=strict fails to instantiate session", function()
396+
configuration.cookie_same_party = true
397+
configuration.cookie_same_site = "Strict"
398+
399+
local ok, err = pcall(session.new, configuration)
400+
assert.is_false(ok)
401+
assert.matches("SameParty session cookies cannot use SameSite=Strict", err)
402+
end)
210403
end)
211404
end)
212405
end)

0 commit comments

Comments
 (0)