Coverage for tests/test_param_redirect.py: 98%
65 statements
« prev ^ index » next coverage.py v7.9.1, created at 2025-06-27 22:07 +0000
« prev ^ index » next coverage.py v7.9.1, created at 2025-06-27 22:07 +0000
1import unittest
2from unittest.mock import MagicMock
3import json
4from datetime import datetime, timedelta
6from webapp.helpers import param_redirect_capture, param_redirect_exec
9class MockCookies:
10 def __init__(self, cookie={}):
11 self.cookie = cookie
13 def set_cookie(self, name, data, expires, secure=False, httponly=True):
14 self.cookie[name] = {
15 "data": data,
16 "expires": expires,
17 "secure": secure,
18 "httponly": httponly,
19 }
21 def get(self, name):
22 return self.cookie[name]
25class MockRequest:
26 def __init__(self, path, args, cookies: MockCookies):
27 self.path = path
28 self.args = args
29 self.cookies = cookies if cookies else MockCookies()
32class TestParamRedirect(unittest.TestCase):
33 def setUp(self):
34 self.cookies = MockCookies()
36 def test_param_redirect_capture_matches(self):
37 """
38 Test param capture works when the signature is exactly the same
39 """
40 req = MockRequest(
41 path="/accept-invite",
42 args={"package": "test", "token": "test"},
43 cookies=self.cookies,
44 )
46 resp = req.cookies
48 param_redirect_capture(req, resp)
50 self.assertEqual(
51 self.cookies.get("param_redirect")["data"],
52 json.dumps(
53 {
54 "endpoint": "/accept-invite",
55 "params": {"package": "test", "token": "test"},
56 }
57 ),
58 )
60 self.assertLess(
61 self.cookies.get("param_redirect")["expires"],
62 datetime.now() + timedelta(days=10),
63 )
65 def test_param_redirect_capture_matches_order(self):
66 """
67 Test param capture works when args are in a different order
68 """
69 req = MockRequest(
70 path="/accept-invite",
71 args={"token": "test", "package": "test"},
72 cookies=self.cookies,
73 )
75 resp = req.cookies
77 param_redirect_capture(req, resp)
79 self.assertEqual(
80 self.cookies.get("param_redirect")["data"],
81 json.dumps(
82 {
83 "endpoint": "/accept-invite",
84 "params": {"package": "test", "token": "test"},
85 }
86 ),
87 )
89 self.assertLess(
90 self.cookies.get("param_redirect")["expires"],
91 datetime.now() + timedelta(days=10),
92 )
94 def test_param_redirect_capture_matches_args(self):
95 """
96 Test param capture works when there are more arguments defined
97 """
98 req = MockRequest(
99 path="/accept-invite",
100 args={"package": "test", "token": "test", "test": "test"},
101 cookies=self.cookies,
102 )
104 resp = req.cookies
106 param_redirect_capture(req, resp)
108 self.assertEqual(
109 self.cookies.get("param_redirect")["data"],
110 json.dumps(
111 {
112 "endpoint": "/accept-invite",
113 "params": {"package": "test", "token": "test"},
114 }
115 ),
116 )
118 self.assertLess(
119 self.cookies.get("param_redirect")["expires"],
120 datetime.now() + timedelta(days=10),
121 )
123 def test_param_redirect_capture_does_not_match(self):
124 """
125 Test param capture doesn't capture a signature that doesn't match
126 """
127 req = MockRequest(
128 path="/accept-invite/test",
129 args={"package": "test", "token": "test"},
130 cookies=self.cookies,
131 )
133 resp = req.cookies
135 param_redirect_capture(req, resp)
137 self.assertNotIn("param_redirect", self.cookies.cookie)
139 def test_param_redirect_exec(self):
140 """
141 Tests successfuly retrieval of cookie and redirect
142 """
143 req = MockRequest(
144 path="/accept-invite",
145 args={"package": "test", "token": "test"},
146 cookies=MockCookies(
147 {
148 "param_redirect": json.dumps(
149 {
150 "endpoint": "/accept-invite",
151 "params": {"package": "test", "token": "test"},
152 }
153 )
154 }
155 ),
156 )
157 make_response = MagicMock()
158 redirect = MagicMock()
159 param_redirect_exec(
160 req=req, make_response=make_response, redirect=redirect
161 )
163 redirect.assert_called_with("/accept-invite?package=test&token=test")
165 def test_param_redirect_exec_no_match_path(self):
166 """
167 Tests successful continuation if the path doesn't match.
168 """
169 req = MockRequest(
170 path="/accept-invite/test",
171 args={"package": "test", "token": "test"},
172 cookies=MockCookies(
173 {
174 "param_redirect": json.dumps(
175 {
176 "endpoint": "/accept-invite",
177 "params": {"package": "test", "token": "test"},
178 }
179 )
180 }
181 ),
182 )
183 make_response = MagicMock()
184 redirect = MagicMock()
185 resp = param_redirect_exec(
186 req=req, make_response=make_response, redirect=redirect
187 )
189 self.assertIsNone(resp)
191 redirect.assert_not_called()
193 def test_param_redirect_exec_no_cookie(self):
194 """
195 Tests successful continuation if there is no cookie.
196 """
197 req = MockRequest(
198 path="/accept-invite",
199 args={"package": "test", "token": "test"},
200 cookies=MockCookies({"param_redirect": None}),
201 )
202 make_response = MagicMock()
203 redirect = MagicMock()
204 resp = param_redirect_exec(
205 req=req, make_response=make_response, redirect=redirect
206 )
208 self.assertIsNone(resp)
210 redirect.assert_not_called()
213if __name__ == "__main__":
214 unittest.main()