Skip to content

Commit 577f756

Browse files
author
Justus Pendleton
committed
more small userauditor changes and a unittest
- changes the "roles" loop per alex's suggestion - figured out (I think) why vim wasn't obeying the modeline and corrected it - removed trailing whitespace per alex - synchronized classic/minimal templates (boy I wish CVS allowed symlinks) - added unit tests for userauditor.py: checks timezone, email, and role handling
1 parent 9726925 commit 577f756

File tree

3 files changed

+98
-14
lines changed

3 files changed

+98
-14
lines changed

templates/classic/detectors/userauditor.py

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -18,21 +18,20 @@
1818
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
1919
# SOFTWARE.
2020
#
21-
#$Id: userauditor.py,v 1.4 2007-08-30 00:31:15 jpend Exp $
21+
#$Id: userauditor.py,v 1.5 2007-08-31 15:57:47 jpend Exp $
2222

2323
def audit_user_fields(db, cl, nodeid, newvalues):
2424
''' Make sure user properties are valid.
2525
2626
- email address has no spaces in it
2727
- roles specified exist
28+
- timezone is valid
2829
'''
2930
if newvalues.has_key('address') and ' ' in newvalues['address']:
3031
raise ValueError, 'Email address must not contain spaces'
3132

32-
if newvalues.has_key('roles') and newvalues['roles']:
33-
roles = [x.lower().strip() for x in newvalues['roles'].split(',')]
34-
for rolename in roles:
35-
if not db.security.role.has_key(rolename):
33+
for rolename in newvalues.get('roles', '').split(','):
34+
if rolename and not db.security.role.has_key(rolename.lower().strip()):
3635
raise ValueError, 'Role "%s" does not exist'%rolename
3736

3837
if newvalues.has_key('timezone'):
@@ -53,5 +52,6 @@ def audit_user_fields(db, cl, nodeid, newvalues):
5352
def init(db):
5453
# fire before changes are made
5554
db.user.audit('set', audit_user_fields)
56-
db.user.audit('create', audit_user_fields)
57-
# vim: set filetype=python ts=4 sw=4 et si
55+
db.user.audit('create', audit_user_fields)
56+
57+
# vim: filetype=python ts=4 sw=4 et si

templates/minimal/detectors/userauditor.py

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -18,26 +18,25 @@
1818
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
1919
# SOFTWARE.
2020
#
21-
#$Id: userauditor.py,v 1.3 2007-08-30 00:31:16 jpend Exp $
21+
#$Id: userauditor.py,v 1.4 2007-08-31 15:57:47 jpend Exp $
2222

2323
def audit_user_fields(db, cl, nodeid, newvalues):
2424
''' Make sure user properties are valid.
2525
2626
- email address has no spaces in it
2727
- roles specified exist
28+
- timezone is valid
2829
'''
2930
if newvalues.has_key('address') and ' ' in newvalues['address']:
3031
raise ValueError, 'Email address must not contain spaces'
3132

32-
if newvalues.has_key('roles') and newvalues['roles']:
33-
roles = [x.lower().strip() for x in newvalues['roles'].split(',')]
34-
for rolename in roles:
35-
if not db.security.role.has_key(rolename):
33+
for rolename in newvalues.get('roles', '').split(','):
34+
if rolename and not db.security.role.has_key(rolename.lower().strip()):
3635
raise ValueError, 'Role "%s" does not exist'%rolename
3736

3837
if newvalues.has_key('timezone'):
3938
# validate the timezone by attempting to use it
40-
# before we store it to the db
39+
# before we store it to the db.
4140
import roundup.date
4241
import datetime
4342
try:
@@ -55,4 +54,4 @@ def init(db):
5554
db.user.audit('set', audit_user_fields)
5655
db.user.audit('create', audit_user_fields)
5756

58-
# vim: set filetype=python ts=4 sw=4 et si
57+
# vim: filetype=python ts=4 sw=4 et si

test/test_userauditor.py

Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
# $Id: test_userauditor.py,v 1.1 2007-08-31 15:57:47 jpend Exp $
2+
3+
import os, unittest, shutil
4+
from db_test_base import setupTracker
5+
6+
class UserAuditorTest(unittest.TestCase):
7+
def setUp(self):
8+
self.dirname = '_test_user_auditor'
9+
self.instance = setupTracker(self.dirname)
10+
self.db = self.instance.open('admin')
11+
12+
try:
13+
import pytz
14+
self.pytz = True
15+
except ImportError:
16+
self.pytz = False
17+
18+
self.db.user.create(username='kyle', address='[email protected]',
19+
realname='Kyle Broflovski', roles='User')
20+
21+
def tearDown(self):
22+
self.db.close()
23+
try:
24+
shutil.rmtree(self.dirname)
25+
except OSError, error:
26+
if error.errno not in (errno.ENOENT, errno.ESRCH): raise
27+
28+
def testBadTimezones(self):
29+
self.assertRaises(ValueError, self.db.user.create, username='eric', timezone='24')
30+
31+
userid = self.db.user.lookup('kyle')
32+
33+
self.assertRaises(ValueError, self.db.user.set, userid, timezone='3000')
34+
self.assertRaises(ValueError, self.db.user.set, userid, timezone='24')
35+
self.assertRaises(ValueError, self.db.user.set, userid, timezone='-24')
36+
self.assertRaises(ValueError, self.db.user.set, userid, timezone='-3000')
37+
38+
if self.pytz:
39+
self.assertRaises(ValueError, self.db.user.set, userid, timezone='MiddleOf/Nowhere')
40+
41+
def testGoodTimezones(self):
42+
self.db.user.create(username='test_user01', timezone='12')
43+
44+
if self.pytz:
45+
self.db.user.create(username='test_user02', timezone='MST')
46+
47+
userid = self.db.user.lookup('kyle')
48+
49+
# TODO: roundup should accept non-integer offsets since those are valid
50+
# this is the offset for Tehran, Iran
51+
#self.db.user.set(userid, timezone='3.5')
52+
53+
self.db.user.set(userid, timezone='-23')
54+
self.db.user.set(userid, timezone='23')
55+
self.db.user.set(userid, timezone='0')
56+
57+
if self.pytz:
58+
self.db.user.set(userid, timezone='US/Eastern')
59+
60+
def testBadEmailAddresses(self):
61+
userid = self.db.user.lookup('kyle')
62+
self.assertRaises(ValueError, self.db.user.set, userid, address='kyle @ example.com')
63+
64+
def testBadRoles(self):
65+
userid = self.db.user.lookup('kyle')
66+
self.assertRaises(ValueError, self.db.user.set, userid, roles='BadRole')
67+
self.assertRaises(ValueError, self.db.user.set, userid, roles='User,BadRole')
68+
69+
def testGoodRoles(self):
70+
# make sure we handle commas in weird places
71+
self.db.user.set(userid, roles='User,')
72+
self.db.user.set(userid, roles=',User')
73+
# make sure we strip whitespace
74+
self.db.user.set(userid, roles=' User ')
75+
76+
def test_suite():
77+
suite = unittest.TestSuite()
78+
suite.addTest(unittest.makeSuite(UserAuditorTest))
79+
return suite
80+
81+
if __name__ == '__main__':
82+
runner = unittest.TextTestRunner()
83+
unittest.main(testRunner=runner)
84+
85+
# vim: filetype=python sts=4 sw=4 et si

0 commit comments

Comments
 (0)