Mercurial > p > roundup > code
comparison test/test_actions.py @ 2004:1782fe36e7b8
Move out parts of client.py to new modules:
* actions.py - the xxxAction and xxxPermission functions refactored
into Action classes
* exceptions.py - all exceptions
* form_parser.py - parsePropsFromForm & extractFormList in a FormParser class
Also added some new tests for the Actions.
| author | Johannes Gijsbers <jlgijsbers@users.sourceforge.net> |
|---|---|
| date | Wed, 11 Feb 2004 21:34:31 +0000 |
| parents | |
| children | 366d3bbce982 |
comparison
equal
deleted
inserted
replaced
| 2003:a291bf753037 | 2004:1782fe36e7b8 |
|---|---|
| 1 import unittest | |
| 2 from cgi import FieldStorage, MiniFieldStorage | |
| 3 | |
| 4 from roundup import hyperdb | |
| 5 from roundup.cgi.actions import * | |
| 6 from roundup.cgi.exceptions import Redirect, Unauthorised | |
| 7 | |
| 8 class MockNull: | |
| 9 def __init__(self, **kwargs): | |
| 10 for key, value in kwargs.items(): | |
| 11 setattr(self, key, value) | |
| 12 | |
| 13 def __call__(self, *args, **kwargs): return MockNull() | |
| 14 def __getattr__(self, name): | |
| 15 # This allows assignments which assume all intermediate steps are Null | |
| 16 # objects if they don't exist yet. | |
| 17 # | |
| 18 # For example (with just 'client' defined): | |
| 19 # | |
| 20 # client.db.config.TRACKER_WEB = 'BASE/' | |
| 21 setattr(self, name, MockNull()) | |
| 22 return getattr(self, name) | |
| 23 | |
| 24 def __getitem__(self, key): return self | |
| 25 def __nonzero__(self): return 0 | |
| 26 def __str__(self): return '' | |
| 27 | |
| 28 def true(*args, **kwargs): | |
| 29 return 1 | |
| 30 | |
| 31 class ActionTestCase(unittest.TestCase): | |
| 32 def setUp(self): | |
| 33 self.form = FieldStorage() | |
| 34 self.client = MockNull() | |
| 35 self.client.form = self.form | |
| 36 | |
| 37 class ShowActionTestCase(ActionTestCase): | |
| 38 def assertRaisesMessage(self, exception, callable, message, *args, **kwargs): | |
| 39 try: | |
| 40 callable(*args, **kwargs) | |
| 41 except exception, msg: | |
| 42 self.assertEqual(str(msg), message) | |
| 43 else: | |
| 44 if hasattr(excClass,'__name__'): excName = excClass.__name__ | |
| 45 else: excName = str(excClass) | |
| 46 raise self.failureException, excName | |
| 47 | |
| 48 def testShowAction(self): | |
| 49 self.client.db.config.TRACKER_WEB = 'BASE/' | |
| 50 | |
| 51 action = ShowAction(self.client) | |
| 52 self.assertRaises(ValueError, action.handle) | |
| 53 | |
| 54 self.form.value.append(MiniFieldStorage('@type', 'issue')) | |
| 55 self.assertRaisesMessage(Redirect, action.handle, 'BASE/issue') | |
| 56 | |
| 57 self.form.value.append(MiniFieldStorage('@number', '1')) | |
| 58 self.assertRaisesMessage(Redirect, action.handle, 'BASE/issue1') | |
| 59 | |
| 60 class RetireActionTestCase(ActionTestCase): | |
| 61 def testRetireAction(self): | |
| 62 self.client.db.security.hasPermission = true | |
| 63 self.client.ok_message = [] | |
| 64 RetireAction(self.client).handle() | |
| 65 self.assert_(len(self.client.ok_message) == 1) | |
| 66 | |
| 67 def testNoPermission(self): | |
| 68 self.assertRaises(Unauthorised, RetireAction(self.client).handle) | |
| 69 | |
| 70 def testDontRetireAdminOrAnonymous(self): | |
| 71 self.client.db.security.hasPermission=true | |
| 72 self.client.classname = 'user' | |
| 73 self.client.db.user.get = lambda a,b: 'admin' | |
| 74 self.assertRaises(ValueError, RetireAction(self.client).handle) | |
| 75 | |
| 76 class SearchActionTestCase(ActionTestCase): | |
| 77 def setUp(self): | |
| 78 ActionTestCase.setUp(self) | |
| 79 self.action = SearchAction(self.client) | |
| 80 | |
| 81 class StandardSearchActionTestCase(SearchActionTestCase): | |
| 82 def testNoPermission(self): | |
| 83 self.assertRaises(Unauthorised, self.action.handle) | |
| 84 | |
| 85 def testQueryName(self): | |
| 86 self.assertEqual(self.action.getQueryName(), '') | |
| 87 | |
| 88 self.form.value.append(MiniFieldStorage('@queryname', 'foo')) | |
| 89 self.assertEqual(self.action.getQueryName(), 'foo') | |
| 90 | |
| 91 class FakeFilterVarsTestCase(SearchActionTestCase): | |
| 92 def setUp(self): | |
| 93 SearchActionTestCase.setUp(self) | |
| 94 self.client.db.classes.getprops = lambda: {'foo': hyperdb.Multilink('foo')} | |
| 95 | |
| 96 def assertFilterEquals(self, expected): | |
| 97 self.action.fakeFilterVars() | |
| 98 self.assertEqual(self.form.getvalue('@filter'), expected) | |
| 99 | |
| 100 def testEmptyMultilink(self): | |
| 101 self.form.value.append(MiniFieldStorage('foo', '')) | |
| 102 self.form.value.append(MiniFieldStorage('foo', '')) | |
| 103 | |
| 104 self.assertFilterEquals(None) | |
| 105 | |
| 106 def testNonEmptyMultilink(self): | |
| 107 self.form.value.append(MiniFieldStorage('foo', '')) | |
| 108 self.form.value.append(MiniFieldStorage('foo', '1')) | |
| 109 | |
| 110 self.assertFilterEquals('foo') | |
| 111 | |
| 112 def testEmptyKey(self): | |
| 113 self.form.value.append(MiniFieldStorage('foo', '')) | |
| 114 self.assertFilterEquals(None) | |
| 115 | |
| 116 def testStandardKey(self): | |
| 117 self.form.value.append(MiniFieldStorage('foo', '1')) | |
| 118 self.assertFilterEquals('foo') | |
| 119 | |
| 120 def testStringKey(self): | |
| 121 self.client.db.classes.getprops = lambda: {'foo': hyperdb.String()} | |
| 122 self.form.value.append(MiniFieldStorage('foo', 'hello')) | |
| 123 self.assertFilterEquals('foo') | |
| 124 | |
| 125 def testTokenizedStringKey(self): | |
| 126 self.client.db.classes.getprops = lambda: {'foo': hyperdb.String()} | |
| 127 self.form.value.append(MiniFieldStorage('foo', 'hello world')) | |
| 128 | |
| 129 self.assertFilterEquals('foo') | |
| 130 | |
| 131 # The single value gets replaced with the tokenized list. | |
| 132 self.assertEqual([x.value for x in self.form['foo']], ['hello', 'world']) | |
| 133 | |
| 134 def test_suite(): | |
| 135 suite = unittest.TestSuite() | |
| 136 suite.addTest(unittest.makeSuite(RetireActionTestCase)) | |
| 137 suite.addTest(unittest.makeSuite(StandardSearchActionTestCase)) | |
| 138 suite.addTest(unittest.makeSuite(FakeFilterVarsTestCase)) | |
| 139 suite.addTest(unittest.makeSuite(ShowActionTestCase)) | |
| 140 return suite | |
| 141 | |
| 142 if __name__ == '__main__': | |
| 143 runner = unittest.TextTestRunner() | |
| 144 unittest.main(testRunner=runner) |
