Skip to content

Commit 12402f4

Browse files
committed
Add unit tests
1 parent a65c5f3 commit 12402f4

3 files changed

Lines changed: 247 additions & 0 deletions

File tree

requirements/dev.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,3 +2,4 @@
22
flake8
33
flake8-import-order
44
coverage
5+
mock

tests/unit/__init__.py

Whitespace-only changes.

tests/unit/test_flask_phpbb3.py

Lines changed: 246 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,246 @@
1+
from __future__ import absolute_import
2+
3+
import hashlib
4+
import unittest
5+
6+
import flask_phpbb3
7+
8+
import mock
9+
10+
11+
class TestSession(unittest.TestCase):
12+
def setUp(self):
13+
# type: () -> None
14+
self.session = flask_phpbb3.PhpBB3Session()
15+
16+
17+
class TestSessionMutability(TestSession):
18+
def test_main(self):
19+
# type: () -> None
20+
self.assertFalse(self.session.modified)
21+
22+
self.session['a_key'] = 'some_value'
23+
self.assertTrue(self.session.modified)
24+
25+
def test_double_set(self):
26+
# type: () -> None
27+
self.assertFalse(self.session.modified)
28+
29+
self.session['a_key'] = 'some_value'
30+
31+
self.session['a_key'] = 'some_value'
32+
self.assertTrue(self.session.modified)
33+
34+
def test_same_value(self):
35+
# type: () -> None
36+
self.assertFalse(self.session.modified)
37+
38+
self.session['a_key'] = None # type: ignore
39+
self.assertFalse(self.session.modified)
40+
41+
def test_deletion(self):
42+
# type: () -> None
43+
self.session['a_key'] = 'some_value'
44+
self.session.modified = False
45+
46+
self.assertFalse(self.session.modified)
47+
48+
del self.session['a_key']
49+
self.assertTrue(self.session.modified)
50+
51+
def test_pop(self):
52+
# type: () -> None
53+
self.session['a_key'] = 'some_value'
54+
self.session.modified = False
55+
self.assertFalse(self.session.modified)
56+
57+
actual_result = self.session.pop('a_key')
58+
self.assertEqual(actual_result, 'some_value')
59+
self.assertTrue(self.session.modified)
60+
61+
def test_read_only(self):
62+
# type: () -> None
63+
self.session._read_only_properties.add('a_key')
64+
self.assertFalse(self.session.modified)
65+
66+
self.session['a_key'] = 'some_value'
67+
self.assertFalse(self.session.modified)
68+
69+
def test_clear(self):
70+
# type: () -> None
71+
self.assertFalse(self.session.modified)
72+
73+
self.session.clear()
74+
self.assertTrue(self.session.modified)
75+
76+
77+
class TestSessionHasPrivileges(TestSession):
78+
@mock.patch('flask_phpbb3.PhpBB3Session.has_privilege')
79+
def test_combinations(self, has_privilege_mock):
80+
# type: (mock.Mock) -> None
81+
privileges = ('m_edit', 'm_delete', 'm_view')
82+
has_privilege_mock.return_value = False
83+
84+
actual_result = self.session.has_privileges(*privileges)
85+
self.assertFalse(actual_result)
86+
87+
has_privilege_mock.side_effect = [False, False, True]
88+
actual_result = self.session.has_privileges(*privileges)
89+
self.assertTrue(actual_result)
90+
91+
has_privilege_mock.side_effect = [True, False, False]
92+
actual_result = self.session.has_privileges(*privileges)
93+
self.assertTrue(actual_result)
94+
95+
has_privilege_mock.side_effect = [True, True, True]
96+
actual_result = self.session.has_privileges(*privileges)
97+
self.assertTrue(actual_result)
98+
99+
@mock.patch('flask_phpbb3.PhpBB3Session.has_privilege', return_value=False)
100+
def test_per_forum(self, has_privilege_mock):
101+
# type: (mock.Mock) -> None
102+
privileges = ('m_edit', 'm_delete', 'm_view')
103+
104+
self.session.has_privileges(*privileges)
105+
has_privilege_mock.assert_has_calls([
106+
mock.call('m_edit'),
107+
mock.call('m_delete'),
108+
mock.call('m_view'),
109+
], any_order=True)
110+
111+
has_privilege_mock.reset_mock()
112+
self.session.has_privileges(*privileges, forum_id=2)
113+
has_privilege_mock.assert_has_calls([
114+
mock.call('m_edit', forum_id=2),
115+
mock.call('m_delete', forum_id=2),
116+
mock.call('m_view', forum_id=2),
117+
], any_order=True)
118+
119+
120+
@mock.patch('flask_phpbb3.PhpBB3Session._load_acl')
121+
class TestSessionHasPrivilege(TestSession):
122+
def setUp(self):
123+
# type: () -> None
124+
super(TestSessionHasPrivilege, self).setUp()
125+
self.session._acl = {
126+
'0': ['0'] * 31,
127+
'5': ['0'] * 31,
128+
}
129+
self.session._acl['0'][0] = '1'
130+
self.session._acl['0'][3] = '1'
131+
self.session._acl['5'][3] = '1'
132+
self.session._acl['0'] = ''.join(self.session._acl['0'])
133+
self.session._acl['5'] = ''.join(self.session._acl['5'])
134+
135+
self.session._acl_options = {
136+
'local': {
137+
'm_edit': 0,
138+
'm_view': 1,
139+
'm_review': 3,
140+
'm_strange': 50,
141+
},
142+
'global': {
143+
'm_edit': 0,
144+
'm_view': 1,
145+
'm_delete': 3,
146+
'm_strange': 50,
147+
},
148+
}
149+
150+
def test_existing(self, _):
151+
# type: (mock.Mock) -> None
152+
actual_result = self.session.has_privilege('m_edit')
153+
self.assertTrue(actual_result)
154+
155+
actual_result = self.session.has_privilege('m_view')
156+
self.assertFalse(actual_result)
157+
158+
def test_global(self, _):
159+
# type: (mock.Mock) -> None
160+
# m_review is not global, and is false (even tho on global the index
161+
# is set to true)
162+
actual_result = self.session.has_privilege('m_review')
163+
self.assertFalse(actual_result)
164+
165+
# m_delete is global, and is True
166+
# Do note, both privileges have same index, just on different plains
167+
actual_result = self.session.has_privilege('m_delete')
168+
self.assertTrue(actual_result)
169+
170+
def test_local(self, _):
171+
# type: (mock.Mock) -> None
172+
# Now, this is True since we are on local level
173+
actual_result = self.session.has_privilege('m_review', forum_id=5)
174+
self.assertTrue(actual_result)
175+
176+
# True, because globals are always set
177+
actual_result = self.session.has_privilege('m_delete', forum_id=5)
178+
self.assertTrue(actual_result)
179+
180+
actual_result = self.session.has_privilege('m_edit', forum_id=5)
181+
self.assertTrue(actual_result)
182+
183+
actual_result = self.session.has_privilege('m_view', forum_id=5)
184+
self.assertFalse(actual_result)
185+
186+
def test_negated(self, _):
187+
# type: (mock.Mock) -> None
188+
actual_result = self.session.has_privilege('!m_review', forum_id=5)
189+
self.assertFalse(actual_result)
190+
191+
actual_result = self.session.has_privilege('!m_review')
192+
self.assertTrue(actual_result)
193+
194+
actual_result = self.session.has_privilege('!m_edit')
195+
self.assertFalse(actual_result)
196+
197+
actual_result = self.session.has_privilege('!m_edit', forum_id=5)
198+
self.assertFalse(actual_result)
199+
200+
def test_out_of_bound(self, _):
201+
# type: (mock.Mock) -> None
202+
actual_result = self.session.has_privilege('m_strange')
203+
self.assertFalse(actual_result)
204+
205+
actual_result = self.session.has_privilege('m_strange', forum_id=5)
206+
self.assertFalse(actual_result)
207+
208+
def test_unknown(self, _):
209+
# type: (mock.Mock) -> None
210+
actual_result = self.session.has_privilege('m_unknown')
211+
self.assertFalse(actual_result)
212+
213+
actual_result = self.session.has_privilege('m_unknown', forum_id=5)
214+
self.assertFalse(actual_result)
215+
216+
actual_result = self.session.has_privilege('m_unknown', forum_id=2)
217+
self.assertFalse(actual_result)
218+
219+
220+
class TestSessionUser(TestSession):
221+
def test_authenticated(self):
222+
# type: () -> None
223+
self.session['user_id'] = '1'
224+
self.assertFalse(self.session.is_authenticated)
225+
226+
self.session['user_id'] = '2'
227+
self.assertTrue(self.session.is_authenticated)
228+
229+
del self.session['user_id']
230+
self.assertFalse(self.session.is_authenticated)
231+
232+
self.session['user_id'] = '-1'
233+
self.assertFalse(self.session.is_authenticated)
234+
235+
def test_get_link_hash(self):
236+
# type: () -> None
237+
some_link = '/my/link'
238+
self.session['user_form_salt'] = 'some_salt'
239+
240+
self.session['user_id'] = '1'
241+
self.assertEqual(self.session.get_link_hash(some_link), '')
242+
243+
self.session['user_id'] = '3'
244+
salted_link = self.session['user_form_salt'] + some_link
245+
expected_value = hashlib.sha1(salted_link).hexdigest()[:8]
246+
self.assertEqual(self.session.get_link_hash(some_link), expected_value)

0 commit comments

Comments
 (0)