1 from datetime import datetime
2 from tests.test_basics import BasicTest
8 class ProxyManagementTests(BasicTest):
13 user='testuser/proxyadmin:*'
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 '\
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 '\
41 self.assertIn(str.encode(testtext), result.data)
42 testtext= '<table>\n '\
44 + '<th>Voter</th>\n <th>Proxy</th>\n <th></th>\n </thead>\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)
50 def test_add_proxy(self):
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'))
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)
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)
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)
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'))
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 '\
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)
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)
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'))
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 '\
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)
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'))
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 '\
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)
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 '\
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)
197 self.assertEqual(recordsRevoked, self.recordCountLog('proxyrevoked'))
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 '\
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)
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 '\
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)
242 self.assertEqual(recordsRevokedAll, self.recordCountLog('proxyrevokedall'))
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 '\
249 + '<th>Voter</th>\n <th>Proxy</th>\n <th></th>\n </thead>\n '\
251 self.assertIn(str.encode(testtext), result.data)
252 self.assertEqual(recordsRevokedAll, self.recordCountLog('proxyrevokedall'))
253 self.logRecordDetailsTest('proxyrevokedall', recordsRevokedAll-1, userid, '', userid)
255 class ProxyVoteTests(BasicTest):
260 user='testuser/vote:* proxyadmin:*'
266 def test_proxy_vote(self):
270 proxyuser='User B/vote:*'
272 response = self.addProxy(user, proxy, voter)
273 self.assertEqual(response.status_code, 302)
275 motion='g1.20200402.004'
276 response = self.createVote(user, motion, 'yes', proxyid)
277 self.assertEqual(response.status_code, 302)
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)
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)
305 response = self.createVote(user, motion, 'no', proxyid)
306 self.assertEqual(response.status_code, 302)
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)
315 def test_proxy_vote_no_proxy(self):
321 response = self.addProxy(user, proxy, voter)
322 self.assertEqual(response.status_code, 302)
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)
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)
337 def test_proxy_vote_no_voter(self):
342 response = self.addProxy(user, proxy, voter)
343 self.assertEqual(response.status_code, 302)
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)