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)

Roundup Issue Tracker: http://roundup-tracker.org/