]> WPIA git - motion.git/blob - tests/test_proxy.py
Merge branch 'finish_move' into 'master'
[motion.git] / tests / test_proxy.py
1 from datetime import datetime
2 from tests.test_basics import BasicTest
3 import motion
4 import postgresql
5 from motion import app
6
7
8 class ProxyManagementTests(BasicTest):
9
10     def setUp(self):
11         self.init_test()
12         global user
13         user='testuser/proxyadmin:*'
14         global userid
15         userid = 4
16         self.db_sampledata()
17
18     def tearDown(self):
19         pass
20
21     def test_see_proxy(self):
22         result = self.app.get('proxy', environ_base={'USER_ROLES': user}, follow_redirects=True)
23         testtext= 'div class="container">\n<form action="/proxy/add" method="POST">'
24         self.assertIn(str.encode(testtext), result.data)
25         testtext= 'proxy granted to:'
26         self.assertNotIn(str.encode(testtext), result.data)
27         testtext= 'holds proxy of:'
28         self.assertNotIn(str.encode(testtext), result.data)
29         testtext= '<select class="float form-control" name="voter">\n        '\
30             + '<option>User A</option>\n        <option>User B</option>\n        '\
31             + '<option>User C</option>\n        '\
32             + '<option>testuser</option>\n      '\
33             + '</select>\n'
34         self.assertIn(str.encode(testtext), result.data)
35         testtext= '<select class="float form-control" name="proxy">\n          '\
36             + '<option>User A</option>\n          '\
37             + '<option>User B</option>\n          '\
38             + '<option>User C</option>\n          '\
39             + '<option>testuser</option>\n      '\
40             + '</select>\n'
41         self.assertIn(str.encode(testtext), result.data)
42         testtext= '<table>\n      '\
43             + '<thead>\n        '\
44             + '<th>Voter</th>\n        <th>Proxy</th>\n        <th></th>\n      </thead>\n    '\
45             + '</table>\n'
46         self.assertIn(str.encode(testtext), result.data)
47         testtext= '<a class="nav-link" href="/proxy">Proxy management</a>'
48         self.assertIn(str.encode(testtext), result.data)
49
50     def test_add_proxy(self):
51         voter=''
52         proxy=''
53         records=0
54         response = self.addProxy(user, voter, proxy)
55         self.assertEqual(response.status_code, 400)
56         self.assertIn(str.encode('Error, voter equals proxy.'), response.data)
57         self.assertEqual(records, self.recordCountLog('proxygranted'))
58
59         voter='User A'
60         response = self.addProxy(user, voter, proxy)
61         self.assertEqual(response.status_code, 400)
62         self.assertIn(str.encode('Error, proxy not found.'), response.data)
63
64         voter='User Z'
65         response = self.addProxy(user, voter, proxy)
66         self.assertEqual(response.status_code, 400)
67         self.assertIn(str.encode('Error, voter not found.'), response.data)
68
69         voter=''
70         proxy='User B'
71         response = self.addProxy(user, voter, proxy)
72         self.assertEqual(response.status_code, 400)
73         self.assertIn(str.encode('Error, voter not found.'), response.data)
74
75         voter='User B'
76         proxy='User B'
77         response = self.addProxy(user, voter, proxy)
78         self.assertEqual(response.status_code, 400)
79         self.assertIn(str.encode('Error, voter equals proxy.'), response.data)
80         self.assertEqual(records, self.recordCountLog('proxygranted'))
81
82         voter='User A'
83         voterid=1
84         proxy='User B'
85         records=1
86         response = self.addProxy(user, voter, proxy)
87         self.assertEqual(response.status_code, 302)
88         result = self.app.get('proxy', environ_base={'USER_ROLES': user}, follow_redirects=True)
89         testtext= '<form action="/proxy/revoke" method="POST">'
90         self.assertIn(str.encode(testtext), result.data)
91         testtext= '<table>\n      '\
92             + '<thead>\n        '\
93             + '<th>Voter</th>\n        '\
94             + '<th>Proxy</th>\n        <th></th>\n      </thead>\n      '\
95             + '<tr>\n        <td>User A</td>\n        <td>User B</td>\n        '\
96             + '<td><button type="submit" class="btn btn-danger" name="id" value="1">Revoke</button></td>\n      '\
97             + '</tr>\n    </table>\n'
98         self.assertIn(str.encode(testtext), result.data)
99         self.assertEqual(records, self.recordCountLog('proxygranted'))
100         self.logRecordDetailsTest('proxygranted', records-1, voterid, 'proxy: 2', userid)
101
102         response = self.addProxy(user, voter, proxy)
103         self.assertEqual(response.status_code, 400)
104         self.assertIn(str.encode('Error, proxy allready given.'), response.data)
105
106         voter='User A'
107         proxy='User C'
108         response = self.addProxy(user, voter, proxy)
109         self.assertEqual(response.status_code, 400)
110         self.assertIn(str.encode('Error, proxy allready given.'), response.data)
111         self.assertEqual(records, self.recordCountLog('proxygranted'))
112
113         voter='User C'
114         voterid=3
115         proxy='User B'
116         records=2
117         response = self.addProxy(user, voter, proxy)
118         self.assertEqual(response.status_code, 302)
119         result = self.app.get('proxy', environ_base={'USER_ROLES': user}, follow_redirects=True)
120         testtext= '<table>\n      '\
121             + '<thead>\n        '\
122             + '<th>Voter</th>\n        '\
123             + '<th>Proxy</th>\n        <th></th>\n      </thead>\n      '\
124             + '<tr>\n        <td>User A</td>\n        <td>User B</td>\n        '\
125             + '<td><button type="submit" class="btn btn-danger" name="id" value="1">Revoke</button></td>\n      </tr>\n      '\
126             + '<tr>\n        <td>User C</td>\n        <td>User B</td>\n        '\
127             + '<td><button type="submit" class="btn btn-danger" name="id" value="2">Revoke</button></td>\n      '\
128             + '</tr>\n    </table>\n'
129         self.assertIn(str.encode(testtext), result.data)
130         testtext= 'proxy granted to:'
131         self.assertNotIn(str.encode(testtext), result.data)
132         testtext= 'holds proxy of:'
133         self.assertNotIn(str.encode(testtext), result.data)
134         self.assertEqual(records, self.recordCountLog('proxygranted'))
135         self.logRecordDetailsTest('proxygranted', records-1, voterid, 'proxy: 2', userid)
136
137         voter='testuser'
138         proxy='User B'
139         response = self.addProxy(user, voter, proxy)
140         self.assertEqual(response.status_code, 400)
141         self.assertIn(str.encode('Error, Max proxy for \'User B\' reached.'), response.data)
142         self.assertEqual(records, self.recordCountLog('proxygranted'))
143
144         voter='testuser'
145         voterid=4
146         proxy='User A'
147         records=3
148         response = self.addProxy(user, voter, proxy)
149         self.assertEqual(response.status_code, 302)
150         result = self.app.get('proxy', environ_base={'USER_ROLES': user}, follow_redirects=True)
151         testtext= '<table>\n      '\
152             + '<thead>\n        '\
153             + '<th>Voter</th>\n        <th>Proxy</th>\n        <th></th>\n      </thead>\n      '\
154             + '<tr>\n        <td>testuser</td>\n        <td>User A</td>\n        '\
155             + '<td><button type="submit" class="btn btn-danger" name="id" value="3">Revoke</button></td>\n      </tr>\n      '\
156             + '<tr>\n        <td>User A</td>\n        <td>User B</td>\n        '\
157             + '<td><button type="submit" class="btn btn-danger" name="id" value="1">Revoke</button></td>\n      </tr>\n      '\
158             + '<tr>\n        <td>User C</td>\n        <td>User B</td>\n        '\
159             + '<td><button type="submit" class="btn btn-danger" name="id" value="2">Revoke</button></td>\n      '\
160             + '</tr>\n    </table>\n'
161         self.assertIn(str.encode(testtext), result.data)
162         testtext= 'proxy granted to: User A\n'
163         self.assertIn(str.encode(testtext), result.data)
164         testtext= 'holds proxy of:'
165         self.assertNotIn(str.encode(testtext), result.data)
166         self.assertEqual(records, self.recordCountLog('proxygranted'))
167         self.logRecordDetailsTest('proxygranted', records-1, voterid, 'proxy: 1', userid)
168
169         voter='User B'
170         voterid=2
171         proxy='testuser'
172         records=4
173         response = self.addProxy(user, voter, proxy)
174         self.assertEqual(response.status_code, 302)
175         result = self.app.get('proxy', environ_base={'USER_ROLES': user}, follow_redirects=True)
176         testtext= '<table>\n      '\
177             + '<thead>\n        '\
178             + '<th>Voter</th>\n        <th>Proxy</th>\n        <th></th>\n      </thead>\n      '\
179             + '<tr>\n        <td>testuser</td>\n        <td>User A</td>\n        '\
180             + '<td><button type="submit" class="btn btn-danger" name="id" value="3">Revoke</button></td>\n      </tr>\n      '\
181             + '<tr>\n        <td>User A</td>\n        <td>User B</td>\n        '\
182             + '<td><button type="submit" class="btn btn-danger" name="id" value="1">Revoke</button></td>\n      </tr>\n      '\
183             + '<tr>\n        <td>User B</td>\n        <td>testuser</td>\n        '\
184             + '<td><button type="submit" class="btn btn-danger" name="id" value="4">Revoke</button></td>\n      </tr>\n      '\
185             + '<tr>\n        <td>User C</td>\n        <td>User B</td>\n        '\
186             + '<td><button type="submit" class="btn btn-danger" name="id" value="2">Revoke</button></td>\n      '\
187             + '</tr>\n    </table>\n'
188         self.assertIn(str.encode(testtext), result.data)
189         testtext= 'proxy granted to: User A\n'
190         self.assertIn(str.encode(testtext), result.data)
191         testtext= 'holds proxy of: User B\n'
192         self.assertIn(str.encode(testtext), result.data)
193         self.assertEqual(records, self.recordCountLog('proxygranted'))
194         self.logRecordDetailsTest('proxygranted', records-1, voterid, 'proxy: 4', userid)
195
196         recordsRevoked=0
197         self.assertEqual(recordsRevoked, self.recordCountLog('proxyrevoked'))
198         recordsRevoked=1
199         response = self.revokeProxy(user, userid)
200         self.assertEqual(response.status_code, 302)
201         result = self.app.get('proxy', environ_base={'USER_ROLES': user}, follow_redirects=True)
202         testtext= '<table>\n      '\
203             + '<thead>\n        '\
204             + '<th>Voter</th>\n        <th>Proxy</th>\n        <th></th>\n      </thead>\n      '\
205             + '<tr>\n        <td>testuser</td>\n        <td>User A</td>\n        '\
206             + '<td><button type="submit" class="btn btn-danger" name="id" value="3">Revoke</button></td>\n      </tr>\n      '\
207             + '<tr>\n        <td>User A</td>\n        <td>User B</td>\n        '\
208             + '<td><button type="submit" class="btn btn-danger" name="id" value="1">Revoke</button></td>\n      </tr>\n      '\
209             + '<tr>\n        <td>User C</td>\n        <td>User B</td>\n        '\
210             + '<td><button type="submit" class="btn btn-danger" name="id" value="2">Revoke</button></td>\n      '\
211             + '</tr>\n    </table>\n'
212         self.assertIn(str.encode(testtext), result.data)
213         testtext= 'proxy granted to: User A\n'
214         self.assertIn(str.encode(testtext), result.data)
215         testtext= 'holds proxy of:'
216         self.assertNotIn(str.encode(testtext), result.data)
217         self.assertEqual(recordsRevoked, self.recordCountLog('proxyrevoked'))
218         self.logRecordDetailsTest('proxyrevoked', recordsRevoked-1, userid, '', userid)
219
220         recordsRevoked=2
221         proxyid=3
222         response = self.revokeProxy(user, proxyid)
223         self.assertEqual(response.status_code, 302)
224         result = self.app.get('proxy', environ_base={'USER_ROLES': user}, follow_redirects=True)
225         testtext= '<table>\n      '\
226             + '<thead>\n        '\
227             + '<th>Voter</th>\n        <th>Proxy</th>\n        <th></th>\n      </thead>\n      '\
228             + '<tr>\n        <td>User A</td>\n        <td>User B</td>\n        '\
229             + '<td><button type="submit" class="btn btn-danger" name="id" value="1">Revoke</button></td>\n      </tr>\n      '\
230             + '<tr>\n        <td>User C</td>\n        <td>User B</td>\n        '\
231             + '<td><button type="submit" class="btn btn-danger" name="id" value="2">Revoke</button></td>\n      '\
232             + '</tr>\n    </table>\n'
233         self.assertIn(str.encode(testtext), result.data)
234         testtext= 'proxy granted to:'
235         self.assertNotIn(str.encode(testtext), result.data)
236         testtext= 'holds proxy of:'
237         self.assertNotIn(str.encode(testtext), result.data)
238         self.assertEqual(recordsRevoked, self.recordCountLog('proxyrevoked'))
239         self.logRecordDetailsTest('proxyrevoked', recordsRevoked-1, proxyid, '', userid)
240
241         recordsRevokedAll=0
242         self.assertEqual(recordsRevokedAll, self.recordCountLog('proxyrevokedall'))
243         recordsRevokedAll=1
244         result = self.app.post('proxy/revokeall', environ_base={'USER_ROLES': user}, follow_redirects=True)
245         self.assertEqual(response.status_code, 302)
246         result = self.app.get('proxy', environ_base={'USER_ROLES': user}, follow_redirects=True)
247         testtext= '<table>\n      '\
248             + '<thead>\n        '\
249             + '<th>Voter</th>\n        <th>Proxy</th>\n        <th></th>\n      </thead>\n    '\
250             + '</table>\n'
251         self.assertIn(str.encode(testtext), result.data)
252         self.assertEqual(recordsRevokedAll, self.recordCountLog('proxyrevokedall'))
253         self.logRecordDetailsTest('proxyrevokedall', recordsRevokedAll-1, userid, '', userid)
254
255 class ProxyVoteTests(BasicTest):
256
257     def setUp(self):
258         self.init_test()
259         global user
260         user='testuser/vote:* proxyadmin:*'
261         self.db_sampledata()
262
263     def tearDown(self):
264         pass
265
266     def test_proxy_vote(self):
267         voter='testuser'
268         proxy='User B'
269         proxyid=2
270         proxyuser='User B/vote:*'
271
272         response = self.addProxy(user, proxy, voter)
273         self.assertEqual(response.status_code, 302)
274
275         motion='g1.20200402.004'
276         response = self.createVote(user, motion, 'yes', proxyid)
277         self.assertEqual(response.status_code, 302)
278
279         # testuser view
280         result = self.app.get('/motion/' + motion, environ_base={'USER_ROLES': user}, follow_redirects=True)
281         # own vote without change
282         testtext= '<form action="/motion/g1.20200402.004/vote/4" method="POST">\n'\
283             + '<button type="submit" class="btn btn-primary" name="vote" value="yes" id="vote-yes">Yes</button>\n'\
284             + '<button type="submit" class="btn btn-primary" name="vote" value="no" id="vote-no">No</button>\n'\
285             + '<button type="submit" class="btn btn-primary" name="vote" value="abstain" id="vote-abstain">Abstain</button>\n</form>'
286         self.assertIn(str.encode(testtext), result.data)
287         # proxy vote with change
288         testtext= '<form action="/motion/g1.20200402.004/vote/2" method="POST">\n'\
289             + '<button type="submit" class="btn btn-success" name="vote" value="yes" id="vote-yes">Yes</button>\n'\
290             + '<button type="submit" class="btn btn-primary" name="vote" value="no" id="vote-no">No</button>\n'\
291             + '<button type="submit" class="btn btn-primary" name="vote" value="abstain" id="vote-abstain">Abstain</button>\n</form>\n'
292         self.assertIn(str.encode(testtext), result.data)
293         
294         # User B view
295         result = self.app.get('/motion/' + motion, environ_base={'USER_ROLES': proxyuser}, follow_redirects=True)
296         # own vote without change
297         testtext= '<h3>My vote</h3>\nGiven by testuser\n'\
298             + '<form action="/motion/g1.20200402.004/vote/2" method="POST">\n'\
299             + '<button type="submit" class="btn btn-success" name="vote" value="yes" id="vote-yes">Yes</button>\n'\
300             + '<button type="submit" class="btn btn-primary" name="vote" value="no" id="vote-no">No</button>\n'\
301             + '<button type="submit" class="btn btn-primary" name="vote" value="abstain" id="vote-abstain">Abstain</button>\n</form>'
302         self.assertIn(str.encode(testtext), result.data)
303         
304         # change vote
305         response = self.createVote(user, motion, 'no', proxyid)
306         self.assertEqual(response.status_code, 302)
307
308         result = self.app.get('/motion/' + motion, environ_base={'USER_ROLES': user}, follow_redirects=True)
309         testtext= '<form action="/motion/g1.20200402.004/vote/2" method="POST">\n'\
310             + '<button type="submit" class="btn btn-primary" name="vote" value="yes" id="vote-yes">Yes</button>\n'\
311             + '<button type="submit" class="btn btn-success" name="vote" value="no" id="vote-no">No</button>\n'\
312             + '<button type="submit" class="btn btn-primary" name="vote" value="abstain" id="vote-abstain">Abstain</button>\n</form>\n'
313         self.assertIn(str.encode(testtext), result.data)
314
315     def test_proxy_vote_no_proxy(self):
316         voter='testuser'
317         proxy='User B'
318         # wrong proxy id
319         proxyid=3
320
321         response = self.addProxy(user, proxy, voter)
322         self.assertEqual(response.status_code, 302)
323
324         motion='g1.20200402.004'
325         response = self.createVote(user, motion, 'yes', proxyid)
326         self.assertEqual(response.status_code, 400)
327         self.assertIn(str.encode('Error, proxy not found'), response.data)
328         
329         # non existing id
330         proxyid=10000
331
332         motion='g1.20200402.004'
333         response = self.createVote(user, motion, 'yes', proxyid)
334         self.assertEqual(response.status_code, 400)
335         self.assertIn(str.encode('Error, proxy not found'), response.data)
336
337     def test_proxy_vote_no_voter(self):
338         voter='User A'
339         proxy='User B'
340         proxyid=2
341
342         response = self.addProxy(user, proxy, voter)
343         self.assertEqual(response.status_code, 302)
344
345         user1='testuser1/'
346         motion='g1.20200402.004'
347         response = self.createVote(user1, motion, 'yes', proxyid)
348         self.assertEqual(response.status_code, 403)
349         self.assertIn(str.encode('Forbidden'), response.data)