annotate test/test_actions.py @ 3696:790363e96852

Sorting/grouping by multiple properties. - Implement sorting/grouping by multiple properties for the web interface. I'm now using @sort0/@sortdir0,@sort1/@sortdir1,... and @group0/@groupdir0,... when generating URLs from a search template. These are converted to a list internally. When saving URLs (e.g. when storing queries) I'm using @sort=prop1,prop2,... and @group=... with optional '-' prepended to individual props. This means saved URLs are backward compatible with existing trackers (and yes, this was a design goal). I need the clumsy version with @sort0,@sort1 etc, because I'm currently using several selectors and checkboxes (as the classic template does, too). I don't think there is a way around that in HTML? - Updated (hopefully all) documentation to reflect the new URL format and the consequences in the web-interface. - I've set the number of sort/group properties in the classic template to two -- this can easily be reverted by changing n_sort to 1. Richard, would you look over these changes? I've set a tag before and (will set) after commit, so that it would be easy to merge out. Don't be too scared about the size of the change, most is documentation, the guts are in cgi/templating.py and small changes in the classic template.
author Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
date Wed, 30 Aug 2006 20:28:26 +0000
parents 53987aa153d2
children 0dd05c9e5fff
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
2515
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
1 from __future__ import nested_scopes
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
2
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
3 import unittest
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
4 from cgi import FieldStorage, MiniFieldStorage
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
5
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
6 from roundup import hyperdb
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
7 from roundup.date import Date, Interval
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
8 from roundup.cgi.actions import *
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
9 from roundup.cgi.exceptions import Redirect, Unauthorised, SeriousError
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
10
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
11 from mocknull import MockNull
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
12
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
13 def true(*args, **kwargs):
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
14 return 1
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
15
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
16 class ActionTestCase(unittest.TestCase):
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
17 def setUp(self):
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
18 self.form = FieldStorage()
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
19 self.client = MockNull()
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
20 self.client.form = self.form
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
21 class TemplatingUtils:
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
22 pass
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
23 self.client.instance.interfaces.TemplatingUtils = TemplatingUtils
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
24
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
25 class ShowActionTestCase(ActionTestCase):
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
26 def assertRaisesMessage(self, exception, callable, message, *args,
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
27 **kwargs):
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
28 """An extension of assertRaises, which also checks the exception
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
29 message. We need this because we rely on exception messages when
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
30 redirecting.
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
31 """
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
32 try:
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
33 callable(*args, **kwargs)
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
34 except exception, msg:
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
35 self.assertEqual(str(msg), message)
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
36 else:
2930
4b5d7b4bc089 applied patch [SF#1067690];
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2515
diff changeset
37 if hasattr(exception, '__name__'):
4b5d7b4bc089 applied patch [SF#1067690];
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2515
diff changeset
38 excName = exception.__name__
2515
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
39 else:
2930
4b5d7b4bc089 applied patch [SF#1067690];
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2515
diff changeset
40 excName = str(exception)
2515
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
41 raise self.failureException, excName
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
42
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
43 def testShowAction(self):
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
44 self.client.base = 'BASE/'
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
45
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
46 action = ShowAction(self.client)
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
47 self.assertRaises(ValueError, action.handle)
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
48
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
49 self.form.value.append(MiniFieldStorage('@type', 'issue'))
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
50 self.assertRaises(SeriousError, action.handle)
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
51
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
52 self.form.value.append(MiniFieldStorage('@number', '1'))
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
53 self.assertRaisesMessage(Redirect, action.handle, 'BASE/issue1')
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
54
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
55 def testShowActionNoType(self):
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
56 action = ShowAction(self.client)
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
57 self.assertRaises(ValueError, action.handle)
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
58 self.form.value.append(MiniFieldStorage('@number', '1'))
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
59 self.assertRaisesMessage(ValueError, action.handle,
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
60 'No type specified')
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
61
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
62 class RetireActionTestCase(ActionTestCase):
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
63 def testRetireAction(self):
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
64 self.client.db.security.hasPermission = true
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
65 self.client.ok_message = []
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
66 RetireAction(self.client).handle()
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
67 self.assert_(len(self.client.ok_message) == 1)
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
68
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
69 def testNoPermission(self):
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
70 self.assertRaises(Unauthorised, RetireAction(self.client).execute)
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
71
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
72 def testDontRetireAdminOrAnonymous(self):
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
73 self.client.db.security.hasPermission=true
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
74 # look up the user class
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
75 self.client.classname = 'user'
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
76 # but always look up admin, regardless of nodeid
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
77 self.client.db.user.get = lambda a,b: 'admin'
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
78 self.assertRaises(ValueError, RetireAction(self.client).handle)
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
79 # .. or anonymous
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
80 self.client.db.user.get = lambda a,b: 'anonymous'
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
81 self.assertRaises(ValueError, RetireAction(self.client).handle)
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
82
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
83 class SearchActionTestCase(ActionTestCase):
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
84 def setUp(self):
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
85 ActionTestCase.setUp(self)
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
86 self.action = SearchAction(self.client)
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
87
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
88 class StandardSearchActionTestCase(SearchActionTestCase):
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
89 def testNoPermission(self):
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
90 self.assertRaises(Unauthorised, self.action.execute)
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
91
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
92 def testQueryName(self):
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
93 self.assertEqual(self.action.getQueryName(), '')
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
94
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
95 self.form.value.append(MiniFieldStorage('@queryname', 'foo'))
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
96 self.assertEqual(self.action.getQueryName(), 'foo')
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
97
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
98 class FakeFilterVarsTestCase(SearchActionTestCase):
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
99 def setUp(self):
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
100 SearchActionTestCase.setUp(self)
3635
53987aa153d2 Transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3188
diff changeset
101 self.client.db.classes.get_transitive_prop = lambda x: \
53987aa153d2 Transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3188
diff changeset
102 hyperdb.Multilink('foo')
2515
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
103
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
104 def assertFilterEquals(self, expected):
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
105 self.action.fakeFilterVars()
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
106 self.assertEqual(self.form.getvalue('@filter'), expected)
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
107
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
108 def testEmptyMultilink(self):
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
109 self.form.value.append(MiniFieldStorage('foo', ''))
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
110 self.form.value.append(MiniFieldStorage('foo', ''))
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
111
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
112 self.assertFilterEquals(None)
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
113
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
114 def testNonEmptyMultilink(self):
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
115 self.form.value.append(MiniFieldStorage('foo', ''))
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
116 self.form.value.append(MiniFieldStorage('foo', '1'))
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
117
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
118 self.assertFilterEquals('foo')
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
119
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
120 def testEmptyKey(self):
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
121 self.form.value.append(MiniFieldStorage('foo', ''))
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
122 self.assertFilterEquals(None)
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
123
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
124 def testStandardKey(self):
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
125 self.form.value.append(MiniFieldStorage('foo', '1'))
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
126 self.assertFilterEquals('foo')
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
127
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
128 def testStringKey(self):
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
129 self.client.db.classes.getprops = lambda: {'foo': hyperdb.String()}
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
130 self.form.value.append(MiniFieldStorage('foo', 'hello'))
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
131 self.assertFilterEquals('foo')
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
132
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
133 def testTokenizedStringKey(self):
3635
53987aa153d2 Transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3188
diff changeset
134 self.client.db.classes.get_transitive_prop = lambda x: hyperdb.String()
2515
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
135 self.form.value.append(MiniFieldStorage('foo', 'hello world'))
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
136
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
137 self.assertFilterEquals('foo')
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
138
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
139 # The single value gets replaced with the tokenized list.
2930
4b5d7b4bc089 applied patch [SF#1067690];
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2515
diff changeset
140 self.assertEqual([x.value for x in self.form['foo']],
4b5d7b4bc089 applied patch [SF#1067690];
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2515
diff changeset
141 ['hello', 'world'])
2515
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
142
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
143 class CollisionDetectionTestCase(ActionTestCase):
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
144 def setUp(self):
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
145 ActionTestCase.setUp(self)
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
146 self.action = EditItemAction(self.client)
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
147 self.now = Date('.')
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
148 # round off for testing
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
149 self.now.second = int(self.now.second)
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
150
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
151 def testLastUserActivity(self):
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
152 self.assertEqual(self.action.lastUserActivity(), None)
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
153
2930
4b5d7b4bc089 applied patch [SF#1067690];
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2515
diff changeset
154 self.client.form.value.append(
4b5d7b4bc089 applied patch [SF#1067690];
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2515
diff changeset
155 MiniFieldStorage('@lastactivity', str(self.now)))
2515
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
156 self.assertEqual(self.action.lastUserActivity(), self.now)
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
157
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
158 def testLastNodeActivity(self):
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
159 self.action.classname = 'issue'
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
160 self.action.nodeid = '1'
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
161
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
162 def get(nodeid, propname):
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
163 self.assertEqual(nodeid, '1')
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
164 self.assertEqual(propname, 'activity')
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
165 return self.now
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
166 self.client.db.issue.get = get
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
167
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
168 self.assertEqual(self.action.lastNodeActivity(), self.now)
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
169
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
170 def testCollision(self):
3188
7faae85e1e33 merge from branch
Richard Jones <richard@users.sourceforge.net>
parents: 3018
diff changeset
171 # fake up an actual change
7faae85e1e33 merge from branch
Richard Jones <richard@users.sourceforge.net>
parents: 3018
diff changeset
172 self.action.classname = 'test'
7faae85e1e33 merge from branch
Richard Jones <richard@users.sourceforge.net>
parents: 3018
diff changeset
173 self.action.nodeid = '1'
7faae85e1e33 merge from branch
Richard Jones <richard@users.sourceforge.net>
parents: 3018
diff changeset
174 self.client.parsePropsFromForm = lambda: ({('test','1'):{1:1}}, [])
7faae85e1e33 merge from branch
Richard Jones <richard@users.sourceforge.net>
parents: 3018
diff changeset
175 self.failUnless(self.action.detectCollision(self.now,
7faae85e1e33 merge from branch
Richard Jones <richard@users.sourceforge.net>
parents: 3018
diff changeset
176 self.now + Interval("1d")))
7faae85e1e33 merge from branch
Richard Jones <richard@users.sourceforge.net>
parents: 3018
diff changeset
177 self.failIf(self.action.detectCollision(self.now,
7faae85e1e33 merge from branch
Richard Jones <richard@users.sourceforge.net>
parents: 3018
diff changeset
178 self.now - Interval("1d")))
2515
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
179 self.failIf(self.action.detectCollision(None, self.now))
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
180
2930
4b5d7b4bc089 applied patch [SF#1067690];
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2515
diff changeset
181 class LoginTestCase(ActionTestCase):
4b5d7b4bc089 applied patch [SF#1067690];
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2515
diff changeset
182 def setUp(self):
4b5d7b4bc089 applied patch [SF#1067690];
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2515
diff changeset
183 ActionTestCase.setUp(self)
4b5d7b4bc089 applied patch [SF#1067690];
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2515
diff changeset
184 self.client.error_message = []
4b5d7b4bc089 applied patch [SF#1067690];
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2515
diff changeset
185
4b5d7b4bc089 applied patch [SF#1067690];
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2515
diff changeset
186 # set the db password to 'right'
4b5d7b4bc089 applied patch [SF#1067690];
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2515
diff changeset
187 self.client.db.user.get = lambda a,b: 'right'
4b5d7b4bc089 applied patch [SF#1067690];
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2515
diff changeset
188
4b5d7b4bc089 applied patch [SF#1067690];
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2515
diff changeset
189 # unless explicitly overridden, we should never get here
4b5d7b4bc089 applied patch [SF#1067690];
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2515
diff changeset
190 self.client.opendb = lambda a: self.fail(
4b5d7b4bc089 applied patch [SF#1067690];
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2515
diff changeset
191 "Logged in, but we shouldn't be.")
4b5d7b4bc089 applied patch [SF#1067690];
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2515
diff changeset
192
4b5d7b4bc089 applied patch [SF#1067690];
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2515
diff changeset
193 def assertLoginLeavesMessages(self, messages, username=None, password=None):
4b5d7b4bc089 applied patch [SF#1067690];
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2515
diff changeset
194 if username is not None:
4b5d7b4bc089 applied patch [SF#1067690];
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2515
diff changeset
195 self.form.value.append(MiniFieldStorage('__login_name', username))
4b5d7b4bc089 applied patch [SF#1067690];
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2515
diff changeset
196 if password is not None:
4b5d7b4bc089 applied patch [SF#1067690];
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2515
diff changeset
197 self.form.value.append(
4b5d7b4bc089 applied patch [SF#1067690];
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2515
diff changeset
198 MiniFieldStorage('__login_password', password))
4b5d7b4bc089 applied patch [SF#1067690];
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2515
diff changeset
199
4b5d7b4bc089 applied patch [SF#1067690];
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2515
diff changeset
200 LoginAction(self.client).handle()
4b5d7b4bc089 applied patch [SF#1067690];
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2515
diff changeset
201 self.assertEqual(self.client.error_message, messages)
4b5d7b4bc089 applied patch [SF#1067690];
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2515
diff changeset
202
4b5d7b4bc089 applied patch [SF#1067690];
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2515
diff changeset
203 def testNoUsername(self):
4b5d7b4bc089 applied patch [SF#1067690];
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2515
diff changeset
204 self.assertLoginLeavesMessages(['Username required'])
4b5d7b4bc089 applied patch [SF#1067690];
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2515
diff changeset
205
4b5d7b4bc089 applied patch [SF#1067690];
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2515
diff changeset
206 def testInvalidUsername(self):
4b5d7b4bc089 applied patch [SF#1067690];
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2515
diff changeset
207 def raiseKeyError(a):
4b5d7b4bc089 applied patch [SF#1067690];
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2515
diff changeset
208 raise KeyError
4b5d7b4bc089 applied patch [SF#1067690];
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2515
diff changeset
209 self.client.db.user.lookup = raiseKeyError
4b5d7b4bc089 applied patch [SF#1067690];
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2515
diff changeset
210 self.assertLoginLeavesMessages(['Invalid login'], 'foo')
4b5d7b4bc089 applied patch [SF#1067690];
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2515
diff changeset
211
4b5d7b4bc089 applied patch [SF#1067690];
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2515
diff changeset
212 def testInvalidPassword(self):
4b5d7b4bc089 applied patch [SF#1067690];
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2515
diff changeset
213 self.assertLoginLeavesMessages(['Invalid login'], 'foo', 'wrong')
4b5d7b4bc089 applied patch [SF#1067690];
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2515
diff changeset
214
4b5d7b4bc089 applied patch [SF#1067690];
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2515
diff changeset
215 def testNoWebAccess(self):
4b5d7b4bc089 applied patch [SF#1067690];
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2515
diff changeset
216 self.assertLoginLeavesMessages(['You do not have permission to login'],
4b5d7b4bc089 applied patch [SF#1067690];
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2515
diff changeset
217 'foo', 'right')
4b5d7b4bc089 applied patch [SF#1067690];
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2515
diff changeset
218
4b5d7b4bc089 applied patch [SF#1067690];
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2515
diff changeset
219 def testCorrectLogin(self):
3018
e665582ec099 Fix failing test: mock lambda now also takes keyword arguments.
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 2930
diff changeset
220 self.client.db.security.hasPermission = lambda *args, **kwargs: True
2930
4b5d7b4bc089 applied patch [SF#1067690];
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2515
diff changeset
221
4b5d7b4bc089 applied patch [SF#1067690];
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2515
diff changeset
222 def opendb(username):
4b5d7b4bc089 applied patch [SF#1067690];
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2515
diff changeset
223 self.assertEqual(username, 'foo')
4b5d7b4bc089 applied patch [SF#1067690];
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2515
diff changeset
224 self.client.opendb = opendb
4b5d7b4bc089 applied patch [SF#1067690];
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2515
diff changeset
225
4b5d7b4bc089 applied patch [SF#1067690];
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2515
diff changeset
226 self.assertLoginLeavesMessages([], 'foo', 'right')
4b5d7b4bc089 applied patch [SF#1067690];
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2515
diff changeset
227
2515
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
228 def test_suite():
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
229 suite = unittest.TestSuite()
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
230 suite.addTest(unittest.makeSuite(RetireActionTestCase))
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
231 suite.addTest(unittest.makeSuite(StandardSearchActionTestCase))
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
232 suite.addTest(unittest.makeSuite(FakeFilterVarsTestCase))
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
233 suite.addTest(unittest.makeSuite(ShowActionTestCase))
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
234 suite.addTest(unittest.makeSuite(CollisionDetectionTestCase))
2930
4b5d7b4bc089 applied patch [SF#1067690];
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2515
diff changeset
235 suite.addTest(unittest.makeSuite(LoginTestCase))
2515
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
236 return suite
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
237
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
238 if __name__ == '__main__':
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
239 runner = unittest.TextTestRunner()
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
240 unittest.main(testRunner=runner)
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
241
2930
4b5d7b4bc089 applied patch [SF#1067690];
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2515
diff changeset
242 # vim: set et sts=4 sw=4 :

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