Mercurial > p > roundup > code
diff test/test_actions.py @ 2482:a15f91a10e45 maint-0.7
merge from HEAD
| author | Richard Jones <richard@users.sourceforge.net> |
|---|---|
| date | Mon, 21 Jun 2004 04:34:58 +0000 |
| parents | 3f89c8ffe4f1 |
| children |
line wrap: on
line diff
--- a/test/test_actions.py Thu Jun 17 10:15:49 2004 +0000 +++ b/test/test_actions.py Mon Jun 21 04:34:58 2004 +0000 @@ -1,200 +1,200 @@ -from __future__ import nested_scopes - -import unittest -from cgi import FieldStorage, MiniFieldStorage - -from roundup import hyperdb -from roundup.date import Date, Interval -from roundup.cgi.actions import * -from roundup.cgi.exceptions import Redirect, Unauthorised, SeriousError - -class MockNull: - def __init__(self, **kwargs): - for key, value in kwargs.items(): - self.__dict__[key] = value - - def __call__(self, *args, **kwargs): return MockNull() - def __getattr__(self, name): - # This allows assignments which assume all intermediate steps are Null - # objects if they don't exist yet. - # - # For example (with just 'client' defined): - # - # client.db.config.TRACKER_WEB = 'BASE/' - self.__dict__[name] = MockNull() - return getattr(self, name) - - def __getitem__(self, key): return self - def __nonzero__(self): return 0 - def __str__(self): return '' - def __repr__(self): return '<MockNull 0x%x>'%id(self) - -def true(*args, **kwargs): - return 1 - -class ActionTestCase(unittest.TestCase): - def setUp(self): - self.form = FieldStorage() - self.client = MockNull() - self.client.form = self.form - -class ShowActionTestCase(ActionTestCase): - def assertRaisesMessage(self, exception, callable, message, *args, - **kwargs): - """An extension of assertRaises, which also checks the exception - message. We need this because we rely on exception messages when - redirecting. - """ - try: - callable(*args, **kwargs) - except exception, msg: - self.assertEqual(str(msg), message) - else: - if hasattr(excClass,'__name__'): - excName = excClass.__name__ - else: - excName = str(excClass) - raise self.failureException, excName - - def testShowAction(self): - self.client.base = 'BASE/' - - action = ShowAction(self.client) - self.assertRaises(ValueError, action.handle) - - self.form.value.append(MiniFieldStorage('@type', 'issue')) - self.assertRaises(SeriousError, action.handle) - - self.form.value.append(MiniFieldStorage('@number', '1')) - self.assertRaisesMessage(Redirect, action.handle, 'BASE/issue1') - - def testShowActionNoType(self): - action = ShowAction(self.client) - self.assertRaises(ValueError, action.handle) - self.form.value.append(MiniFieldStorage('@number', '1')) - self.assertRaisesMessage(ValueError, action.handle, - 'No type specified') - -class RetireActionTestCase(ActionTestCase): - def testRetireAction(self): - self.client.db.security.hasPermission = true - self.client.ok_message = [] - RetireAction(self.client).handle() - self.assert_(len(self.client.ok_message) == 1) - - def testNoPermission(self): - self.assertRaises(Unauthorised, RetireAction(self.client).execute) - - def testDontRetireAdminOrAnonymous(self): - self.client.db.security.hasPermission=true - # look up the user class - self.client.classname = 'user' - # but always look up admin, regardless of nodeid - self.client.db.user.get = lambda a,b: 'admin' - self.assertRaises(ValueError, RetireAction(self.client).handle) - # .. or anonymous - self.client.db.user.get = lambda a,b: 'anonymous' - self.assertRaises(ValueError, RetireAction(self.client).handle) - -class SearchActionTestCase(ActionTestCase): - def setUp(self): - ActionTestCase.setUp(self) - self.action = SearchAction(self.client) - -class StandardSearchActionTestCase(SearchActionTestCase): - def testNoPermission(self): - self.assertRaises(Unauthorised, self.action.execute) - - def testQueryName(self): - self.assertEqual(self.action.getQueryName(), '') - - self.form.value.append(MiniFieldStorage('@queryname', 'foo')) - self.assertEqual(self.action.getQueryName(), 'foo') - -class FakeFilterVarsTestCase(SearchActionTestCase): - def setUp(self): - SearchActionTestCase.setUp(self) - self.client.db.classes.getprops = lambda: {'foo': hyperdb.Multilink('foo')} - - def assertFilterEquals(self, expected): - self.action.fakeFilterVars() - self.assertEqual(self.form.getvalue('@filter'), expected) - - def testEmptyMultilink(self): - self.form.value.append(MiniFieldStorage('foo', '')) - self.form.value.append(MiniFieldStorage('foo', '')) - - self.assertFilterEquals(None) - - def testNonEmptyMultilink(self): - self.form.value.append(MiniFieldStorage('foo', '')) - self.form.value.append(MiniFieldStorage('foo', '1')) - - self.assertFilterEquals('foo') - - def testEmptyKey(self): - self.form.value.append(MiniFieldStorage('foo', '')) - self.assertFilterEquals(None) - - def testStandardKey(self): - self.form.value.append(MiniFieldStorage('foo', '1')) - self.assertFilterEquals('foo') - - def testStringKey(self): - self.client.db.classes.getprops = lambda: {'foo': hyperdb.String()} - self.form.value.append(MiniFieldStorage('foo', 'hello')) - self.assertFilterEquals('foo') - - def testTokenizedStringKey(self): - self.client.db.classes.getprops = lambda: {'foo': hyperdb.String()} - self.form.value.append(MiniFieldStorage('foo', 'hello world')) - - self.assertFilterEquals('foo') - - # The single value gets replaced with the tokenized list. - self.assertEqual([x.value for x in self.form['foo']], ['hello', 'world']) - -class CollisionDetectionTestCase(ActionTestCase): - def setUp(self): - ActionTestCase.setUp(self) - self.action = EditItemAction(self.client) - self.now = Date('.') - # round off for testing - self.now.second = int(self.now.second) - - def testLastUserActivity(self): - self.assertEqual(self.action.lastUserActivity(), None) - - self.client.form.value.append(MiniFieldStorage('@lastactivity', str(self.now))) - self.assertEqual(self.action.lastUserActivity(), self.now) - - def testLastNodeActivity(self): - self.action.classname = 'issue' - self.action.nodeid = '1' - - def get(nodeid, propname): - self.assertEqual(nodeid, '1') - self.assertEqual(propname, 'activity') - return self.now - self.client.db.issue.get = get - - self.assertEqual(self.action.lastNodeActivity(), self.now) - - def testCollision(self): - self.failUnless(self.action.detectCollision(self.now, self.now + Interval("1d"))) - self.failIf(self.action.detectCollision(self.now, self.now - Interval("1d"))) - self.failIf(self.action.detectCollision(None, self.now)) - -def test_suite(): - suite = unittest.TestSuite() - suite.addTest(unittest.makeSuite(RetireActionTestCase)) - suite.addTest(unittest.makeSuite(StandardSearchActionTestCase)) - suite.addTest(unittest.makeSuite(FakeFilterVarsTestCase)) - suite.addTest(unittest.makeSuite(ShowActionTestCase)) - suite.addTest(unittest.makeSuite(CollisionDetectionTestCase)) - return suite - -if __name__ == '__main__': - runner = unittest.TextTestRunner() - unittest.main(testRunner=runner) - +from __future__ import nested_scopes + +import unittest +from cgi import FieldStorage, MiniFieldStorage + +from roundup import hyperdb +from roundup.date import Date, Interval +from roundup.cgi.actions import * +from roundup.cgi.exceptions import Redirect, Unauthorised, SeriousError + +class MockNull: + def __init__(self, **kwargs): + for key, value in kwargs.items(): + self.__dict__[key] = value + + def __call__(self, *args, **kwargs): return MockNull() + def __getattr__(self, name): + # This allows assignments which assume all intermediate steps are Null + # objects if they don't exist yet. + # + # For example (with just 'client' defined): + # + # client.db.config.TRACKER_WEB = 'BASE/' + self.__dict__[name] = MockNull() + return getattr(self, name) + + def __getitem__(self, key): return self + def __nonzero__(self): return 0 + def __str__(self): return '' + def __repr__(self): return '<MockNull 0x%x>'%id(self) + +def true(*args, **kwargs): + return 1 + +class ActionTestCase(unittest.TestCase): + def setUp(self): + self.form = FieldStorage() + self.client = MockNull() + self.client.form = self.form + +class ShowActionTestCase(ActionTestCase): + def assertRaisesMessage(self, exception, callable, message, *args, + **kwargs): + """An extension of assertRaises, which also checks the exception + message. We need this because we rely on exception messages when + redirecting. + """ + try: + callable(*args, **kwargs) + except exception, msg: + self.assertEqual(str(msg), message) + else: + if hasattr(excClass,'__name__'): + excName = excClass.__name__ + else: + excName = str(excClass) + raise self.failureException, excName + + def testShowAction(self): + self.client.base = 'BASE/' + + action = ShowAction(self.client) + self.assertRaises(ValueError, action.handle) + + self.form.value.append(MiniFieldStorage('@type', 'issue')) + self.assertRaises(SeriousError, action.handle) + + self.form.value.append(MiniFieldStorage('@number', '1')) + self.assertRaisesMessage(Redirect, action.handle, 'BASE/issue1') + + def testShowActionNoType(self): + action = ShowAction(self.client) + self.assertRaises(ValueError, action.handle) + self.form.value.append(MiniFieldStorage('@number', '1')) + self.assertRaisesMessage(ValueError, action.handle, + 'No type specified') + +class RetireActionTestCase(ActionTestCase): + def testRetireAction(self): + self.client.db.security.hasPermission = true + self.client.ok_message = [] + RetireAction(self.client).handle() + self.assert_(len(self.client.ok_message) == 1) + + def testNoPermission(self): + self.assertRaises(Unauthorised, RetireAction(self.client).execute) + + def testDontRetireAdminOrAnonymous(self): + self.client.db.security.hasPermission=true + # look up the user class + self.client.classname = 'user' + # but always look up admin, regardless of nodeid + self.client.db.user.get = lambda a,b: 'admin' + self.assertRaises(ValueError, RetireAction(self.client).handle) + # .. or anonymous + self.client.db.user.get = lambda a,b: 'anonymous' + self.assertRaises(ValueError, RetireAction(self.client).handle) + +class SearchActionTestCase(ActionTestCase): + def setUp(self): + ActionTestCase.setUp(self) + self.action = SearchAction(self.client) + +class StandardSearchActionTestCase(SearchActionTestCase): + def testNoPermission(self): + self.assertRaises(Unauthorised, self.action.execute) + + def testQueryName(self): + self.assertEqual(self.action.getQueryName(), '') + + self.form.value.append(MiniFieldStorage('@queryname', 'foo')) + self.assertEqual(self.action.getQueryName(), 'foo') + +class FakeFilterVarsTestCase(SearchActionTestCase): + def setUp(self): + SearchActionTestCase.setUp(self) + self.client.db.classes.getprops = lambda: {'foo': hyperdb.Multilink('foo')} + + def assertFilterEquals(self, expected): + self.action.fakeFilterVars() + self.assertEqual(self.form.getvalue('@filter'), expected) + + def testEmptyMultilink(self): + self.form.value.append(MiniFieldStorage('foo', '')) + self.form.value.append(MiniFieldStorage('foo', '')) + + self.assertFilterEquals(None) + + def testNonEmptyMultilink(self): + self.form.value.append(MiniFieldStorage('foo', '')) + self.form.value.append(MiniFieldStorage('foo', '1')) + + self.assertFilterEquals('foo') + + def testEmptyKey(self): + self.form.value.append(MiniFieldStorage('foo', '')) + self.assertFilterEquals(None) + + def testStandardKey(self): + self.form.value.append(MiniFieldStorage('foo', '1')) + self.assertFilterEquals('foo') + + def testStringKey(self): + self.client.db.classes.getprops = lambda: {'foo': hyperdb.String()} + self.form.value.append(MiniFieldStorage('foo', 'hello')) + self.assertFilterEquals('foo') + + def testTokenizedStringKey(self): + self.client.db.classes.getprops = lambda: {'foo': hyperdb.String()} + self.form.value.append(MiniFieldStorage('foo', 'hello world')) + + self.assertFilterEquals('foo') + + # The single value gets replaced with the tokenized list. + self.assertEqual([x.value for x in self.form['foo']], ['hello', 'world']) + +class CollisionDetectionTestCase(ActionTestCase): + def setUp(self): + ActionTestCase.setUp(self) + self.action = EditItemAction(self.client) + self.now = Date('.') + # round off for testing + self.now.second = int(self.now.second) + + def testLastUserActivity(self): + self.assertEqual(self.action.lastUserActivity(), None) + + self.client.form.value.append(MiniFieldStorage('@lastactivity', str(self.now))) + self.assertEqual(self.action.lastUserActivity(), self.now) + + def testLastNodeActivity(self): + self.action.classname = 'issue' + self.action.nodeid = '1' + + def get(nodeid, propname): + self.assertEqual(nodeid, '1') + self.assertEqual(propname, 'activity') + return self.now + self.client.db.issue.get = get + + self.assertEqual(self.action.lastNodeActivity(), self.now) + + def testCollision(self): + self.failUnless(self.action.detectCollision(self.now, self.now + Interval("1d"))) + self.failIf(self.action.detectCollision(self.now, self.now - Interval("1d"))) + self.failIf(self.action.detectCollision(None, self.now)) + +def test_suite(): + suite = unittest.TestSuite() + suite.addTest(unittest.makeSuite(RetireActionTestCase)) + suite.addTest(unittest.makeSuite(StandardSearchActionTestCase)) + suite.addTest(unittest.makeSuite(FakeFilterVarsTestCase)) + suite.addTest(unittest.makeSuite(ShowActionTestCase)) + suite.addTest(unittest.makeSuite(CollisionDetectionTestCase)) + return suite + +if __name__ == '__main__': + runner = unittest.TextTestRunner() + unittest.main(testRunner=runner) +
