Mercurial > p > roundup > code
annotate test/test_actions.py @ 5726:e199d0ae4a25
issue2551033: prevent reverse engineering hidden data by using etags
as an oracle to identify when the right data has been
guessed. Identified by Joseph Myers who also suggested remediation
methods. Implemented John Rouillard.
| author | John Rouillard <rouilj@ieee.org> |
|---|---|
| date | Thu, 23 May 2019 18:56:57 -0400 |
| parents | 842252c3ee22 |
| children | 8dbe307bdb57 |
| rev | line source |
|---|---|
|
5376
64b05e24dbd8
Python 3 preparation: convert print to a function.
Joseph Myers <jsm@polyomino.org.uk>
parents:
5248
diff
changeset
|
1 from __future__ import print_function |
|
2515
f8dafdd91bf5
remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2514
diff
changeset
|
2 import unittest |
|
f8dafdd91bf5
remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2514
diff
changeset
|
3 from cgi import FieldStorage, MiniFieldStorage |
|
f8dafdd91bf5
remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2514
diff
changeset
|
4 |
|
f8dafdd91bf5
remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2514
diff
changeset
|
5 from roundup import hyperdb |
|
f8dafdd91bf5
remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2514
diff
changeset
|
6 from roundup.date import Date, Interval |
|
f8dafdd91bf5
remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2514
diff
changeset
|
7 from roundup.cgi.actions import * |
|
4880
ca692423e401
Different approach to fix XSS in issue2550817
Ralf Schlatterbeck <rsc@runtux.com>
parents:
4742
diff
changeset
|
8 from roundup.cgi.client import add_message |
|
5097
156cbc1d182c
Validate values for Integer and Numeric type filter parameters rather than
John Rouillard <rouilj@ieee.org>
parents:
5037
diff
changeset
|
9 from roundup.cgi.exceptions import Redirect, Unauthorised, SeriousError, FormError |
|
5717
cad18de2b988
issue2550949: Rate limit password guesses/login attempts.
John Rouillard <rouilj@ieee.org>
parents:
5649
diff
changeset
|
10 from roundup.exceptions import Reject |
|
2515
f8dafdd91bf5
remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2514
diff
changeset
|
11 |
|
5505
2ce41b8dffaf
compared sorted lists as order can be random
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5503
diff
changeset
|
12 from roundup.anypy.cmp_ import NoneAndDictComparable |
|
5717
cad18de2b988
issue2550949: Rate limit password guesses/login attempts.
John Rouillard <rouilj@ieee.org>
parents:
5649
diff
changeset
|
13 from time import sleep |
|
cad18de2b988
issue2550949: Rate limit password guesses/login attempts.
John Rouillard <rouilj@ieee.org>
parents:
5649
diff
changeset
|
14 from datetime import datetime |
|
5505
2ce41b8dffaf
compared sorted lists as order can be random
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5503
diff
changeset
|
15 |
|
5388
d26921b851c3
Python 3 preparation: make relative imports explicit.
Joseph Myers <jsm@polyomino.org.uk>
parents:
5378
diff
changeset
|
16 from .mocknull import MockNull |
|
2515
f8dafdd91bf5
remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2514
diff
changeset
|
17 |
|
f8dafdd91bf5
remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2514
diff
changeset
|
18 def true(*args, **kwargs): |
|
f8dafdd91bf5
remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2514
diff
changeset
|
19 return 1 |
|
f8dafdd91bf5
remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2514
diff
changeset
|
20 |
|
f8dafdd91bf5
remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2514
diff
changeset
|
21 class ActionTestCase(unittest.TestCase): |
|
f8dafdd91bf5
remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2514
diff
changeset
|
22 def setUp(self): |
|
5034
4ad465b09cbe
Update test/test_actions.py to work with py.test
John Kristensen <john@jerrykan.com>
parents:
4992
diff
changeset
|
23 self.form = FieldStorage(environ={'QUERY_STRING': ''}) |
|
2515
f8dafdd91bf5
remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2514
diff
changeset
|
24 self.client = MockNull() |
|
5717
cad18de2b988
issue2550949: Rate limit password guesses/login attempts.
John Rouillard <rouilj@ieee.org>
parents:
5649
diff
changeset
|
25 self.client.db.Otk = MockNull() |
|
cad18de2b988
issue2550949: Rate limit password guesses/login attempts.
John Rouillard <rouilj@ieee.org>
parents:
5649
diff
changeset
|
26 self.client.db.Otk.data = {} |
|
cad18de2b988
issue2550949: Rate limit password guesses/login attempts.
John Rouillard <rouilj@ieee.org>
parents:
5649
diff
changeset
|
27 self.client.db.Otk.getall = self.data_get |
|
cad18de2b988
issue2550949: Rate limit password guesses/login attempts.
John Rouillard <rouilj@ieee.org>
parents:
5649
diff
changeset
|
28 self.client.db.Otk.set = self.data_set |
|
5718
842252c3ee22
Change access to config from dict to property. This makes doing the
John Rouillard <rouilj@ieee.org>
parents:
5717
diff
changeset
|
29 self.client.db.config.WEB_LOGIN_ATTEMPTS_MIN = 20 |
|
4880
ca692423e401
Different approach to fix XSS in issue2550817
Ralf Schlatterbeck <rsc@runtux.com>
parents:
4742
diff
changeset
|
30 self.client._ok_message = [] |
|
ca692423e401
Different approach to fix XSS in issue2550817
Ralf Schlatterbeck <rsc@runtux.com>
parents:
4742
diff
changeset
|
31 self.client._error_message = [] |
|
ca692423e401
Different approach to fix XSS in issue2550817
Ralf Schlatterbeck <rsc@runtux.com>
parents:
4742
diff
changeset
|
32 self.client.add_error_message = lambda x : add_message( |
|
ca692423e401
Different approach to fix XSS in issue2550817
Ralf Schlatterbeck <rsc@runtux.com>
parents:
4742
diff
changeset
|
33 self.client._error_message, x) |
|
ca692423e401
Different approach to fix XSS in issue2550817
Ralf Schlatterbeck <rsc@runtux.com>
parents:
4742
diff
changeset
|
34 self.client.add_ok_message = lambda x : add_message( |
|
ca692423e401
Different approach to fix XSS in issue2550817
Ralf Schlatterbeck <rsc@runtux.com>
parents:
4742
diff
changeset
|
35 self.client._ok_message, x) |
|
2515
f8dafdd91bf5
remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2514
diff
changeset
|
36 self.client.form = self.form |
|
5164
114d9628fd77
Fixed a couple of failing tests for *LoginRedirect in test_actions.py after url validation. Also raise ValueError from examine_url if base url is None.
John Rouillard <rouilj@ieee.org>
parents:
5121
diff
changeset
|
37 self.client.base = "http://whoami.com/path/" |
|
2515
f8dafdd91bf5
remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2514
diff
changeset
|
38 class TemplatingUtils: |
|
f8dafdd91bf5
remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2514
diff
changeset
|
39 pass |
|
f8dafdd91bf5
remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2514
diff
changeset
|
40 self.client.instance.interfaces.TemplatingUtils = TemplatingUtils |
|
f8dafdd91bf5
remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2514
diff
changeset
|
41 |
|
5717
cad18de2b988
issue2550949: Rate limit password guesses/login attempts.
John Rouillard <rouilj@ieee.org>
parents:
5649
diff
changeset
|
42 def data_get(self, key): |
|
cad18de2b988
issue2550949: Rate limit password guesses/login attempts.
John Rouillard <rouilj@ieee.org>
parents:
5649
diff
changeset
|
43 return self.client.db.Otk.data[key] |
|
cad18de2b988
issue2550949: Rate limit password guesses/login attempts.
John Rouillard <rouilj@ieee.org>
parents:
5649
diff
changeset
|
44 |
|
cad18de2b988
issue2550949: Rate limit password guesses/login attempts.
John Rouillard <rouilj@ieee.org>
parents:
5649
diff
changeset
|
45 def data_set(self, key, **value): |
|
cad18de2b988
issue2550949: Rate limit password guesses/login attempts.
John Rouillard <rouilj@ieee.org>
parents:
5649
diff
changeset
|
46 self.client.db.Otk.data[key] = value |
|
cad18de2b988
issue2550949: Rate limit password guesses/login attempts.
John Rouillard <rouilj@ieee.org>
parents:
5649
diff
changeset
|
47 |
|
2515
f8dafdd91bf5
remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2514
diff
changeset
|
48 class ShowActionTestCase(ActionTestCase): |
|
f8dafdd91bf5
remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2514
diff
changeset
|
49 def assertRaisesMessage(self, exception, callable, message, *args, |
|
f8dafdd91bf5
remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2514
diff
changeset
|
50 **kwargs): |
|
f8dafdd91bf5
remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2514
diff
changeset
|
51 """An extension of assertRaises, which also checks the exception |
|
f8dafdd91bf5
remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2514
diff
changeset
|
52 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
|
53 redirecting. |
|
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 try: |
|
f8dafdd91bf5
remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2514
diff
changeset
|
56 callable(*args, **kwargs) |
|
5248
198b6e810c67
Use Python-3-compatible 'as' syntax for except statements
Eric S. Raymond <esr@thyrsus.com>
parents:
5164
diff
changeset
|
57 except exception as msg: |
|
2515
f8dafdd91bf5
remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2514
diff
changeset
|
58 self.assertEqual(str(msg), message) |
|
f8dafdd91bf5
remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2514
diff
changeset
|
59 else: |
|
2930
4b5d7b4bc089
applied patch [SF#1067690];
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2515
diff
changeset
|
60 if hasattr(exception, '__name__'): |
|
4b5d7b4bc089
applied patch [SF#1067690];
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2515
diff
changeset
|
61 excName = exception.__name__ |
|
2515
f8dafdd91bf5
remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2514
diff
changeset
|
62 else: |
|
2930
4b5d7b4bc089
applied patch [SF#1067690];
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2515
diff
changeset
|
63 excName = str(exception) |
|
5378
35ea9b1efc14
Python 3 preparation: "raise" syntax.
Joseph Myers <jsm@polyomino.org.uk>
parents:
5376
diff
changeset
|
64 raise self.failureException(excName) |
|
2515
f8dafdd91bf5
remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2514
diff
changeset
|
65 |
|
f8dafdd91bf5
remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2514
diff
changeset
|
66 def testShowAction(self): |
|
f8dafdd91bf5
remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2514
diff
changeset
|
67 self.client.base = 'BASE/' |
|
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 action = ShowAction(self.client) |
|
f8dafdd91bf5
remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2514
diff
changeset
|
70 self.assertRaises(ValueError, action.handle) |
|
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 self.form.value.append(MiniFieldStorage('@type', 'issue')) |
|
f8dafdd91bf5
remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2514
diff
changeset
|
73 self.assertRaises(SeriousError, action.handle) |
|
f8dafdd91bf5
remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2514
diff
changeset
|
74 |
|
f8dafdd91bf5
remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2514
diff
changeset
|
75 self.form.value.append(MiniFieldStorage('@number', '1')) |
|
f8dafdd91bf5
remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2514
diff
changeset
|
76 self.assertRaisesMessage(Redirect, action.handle, 'BASE/issue1') |
|
f8dafdd91bf5
remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2514
diff
changeset
|
77 |
|
f8dafdd91bf5
remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2514
diff
changeset
|
78 def testShowActionNoType(self): |
|
f8dafdd91bf5
remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2514
diff
changeset
|
79 action = ShowAction(self.client) |
|
f8dafdd91bf5
remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2514
diff
changeset
|
80 self.assertRaises(ValueError, action.handle) |
|
f8dafdd91bf5
remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2514
diff
changeset
|
81 self.form.value.append(MiniFieldStorage('@number', '1')) |
|
f8dafdd91bf5
remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2514
diff
changeset
|
82 self.assertRaisesMessage(ValueError, action.handle, |
|
f8dafdd91bf5
remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2514
diff
changeset
|
83 'No type specified') |
|
f8dafdd91bf5
remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2514
diff
changeset
|
84 |
|
f8dafdd91bf5
remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2514
diff
changeset
|
85 class RetireActionTestCase(ActionTestCase): |
|
f8dafdd91bf5
remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2514
diff
changeset
|
86 def testRetireAction(self): |
|
f8dafdd91bf5
remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2514
diff
changeset
|
87 self.client.db.security.hasPermission = true |
|
4880
ca692423e401
Different approach to fix XSS in issue2550817
Ralf Schlatterbeck <rsc@runtux.com>
parents:
4742
diff
changeset
|
88 self.client._ok_message = [] |
|
2515
f8dafdd91bf5
remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2514
diff
changeset
|
89 RetireAction(self.client).handle() |
|
5649
f8893e1cde0d
assert_ is depricated. Replacing with assertTrue to reduce logs in travisci.
John Rouillard <rouilj@ieee.org>
parents:
5505
diff
changeset
|
90 self.assertTrue(len(self.client._ok_message) == 1) |
|
2515
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 testNoPermission(self): |
|
f8dafdd91bf5
remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2514
diff
changeset
|
93 self.assertRaises(Unauthorised, RetireAction(self.client).execute) |
|
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 def testDontRetireAdminOrAnonymous(self): |
|
f8dafdd91bf5
remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2514
diff
changeset
|
96 self.client.db.security.hasPermission=true |
|
f8dafdd91bf5
remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2514
diff
changeset
|
97 # look up the user class |
|
f8dafdd91bf5
remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2514
diff
changeset
|
98 self.client.classname = 'user' |
|
f8dafdd91bf5
remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2514
diff
changeset
|
99 # but always look up admin, regardless of nodeid |
|
f8dafdd91bf5
remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2514
diff
changeset
|
100 self.client.db.user.get = lambda a,b: 'admin' |
|
f8dafdd91bf5
remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2514
diff
changeset
|
101 self.assertRaises(ValueError, RetireAction(self.client).handle) |
|
f8dafdd91bf5
remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2514
diff
changeset
|
102 # .. or anonymous |
|
f8dafdd91bf5
remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2514
diff
changeset
|
103 self.client.db.user.get = lambda a,b: 'anonymous' |
|
f8dafdd91bf5
remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2514
diff
changeset
|
104 self.assertRaises(ValueError, RetireAction(self.client).handle) |
|
f8dafdd91bf5
remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2514
diff
changeset
|
105 |
|
5119
748ba87e1aca
Added a new cgi action restore. The opposite of (and a clone of) the existing retire action.
John Rouillard <rouilj@ieee.org>
parents:
5097
diff
changeset
|
106 class RestoreActionTestCase(ActionTestCase): |
|
748ba87e1aca
Added a new cgi action restore. The opposite of (and a clone of) the existing retire action.
John Rouillard <rouilj@ieee.org>
parents:
5097
diff
changeset
|
107 # This is a copy of the RetireActionTestCase. But what do these |
|
748ba87e1aca
Added a new cgi action restore. The opposite of (and a clone of) the existing retire action.
John Rouillard <rouilj@ieee.org>
parents:
5097
diff
changeset
|
108 # actually test? I see no actual db or retire call or |
|
748ba87e1aca
Added a new cgi action restore. The opposite of (and a clone of) the existing retire action.
John Rouillard <rouilj@ieee.org>
parents:
5097
diff
changeset
|
109 # class id. Testing db level restore is covered in the |
|
748ba87e1aca
Added a new cgi action restore. The opposite of (and a clone of) the existing retire action.
John Rouillard <rouilj@ieee.org>
parents:
5097
diff
changeset
|
110 # db_test_base as part of retire. |
|
748ba87e1aca
Added a new cgi action restore. The opposite of (and a clone of) the existing retire action.
John Rouillard <rouilj@ieee.org>
parents:
5097
diff
changeset
|
111 def testRestoreAction(self): |
|
748ba87e1aca
Added a new cgi action restore. The opposite of (and a clone of) the existing retire action.
John Rouillard <rouilj@ieee.org>
parents:
5097
diff
changeset
|
112 self.client.db.security.hasPermission = true |
|
748ba87e1aca
Added a new cgi action restore. The opposite of (and a clone of) the existing retire action.
John Rouillard <rouilj@ieee.org>
parents:
5097
diff
changeset
|
113 self.client._ok_message = [] |
|
748ba87e1aca
Added a new cgi action restore. The opposite of (and a clone of) the existing retire action.
John Rouillard <rouilj@ieee.org>
parents:
5097
diff
changeset
|
114 RestoreAction(self.client).handle() |
|
5649
f8893e1cde0d
assert_ is depricated. Replacing with assertTrue to reduce logs in travisci.
John Rouillard <rouilj@ieee.org>
parents:
5505
diff
changeset
|
115 self.assertTrue(len(self.client._ok_message) == 1) |
|
5119
748ba87e1aca
Added a new cgi action restore. The opposite of (and a clone of) the existing retire action.
John Rouillard <rouilj@ieee.org>
parents:
5097
diff
changeset
|
116 |
|
748ba87e1aca
Added a new cgi action restore. The opposite of (and a clone of) the existing retire action.
John Rouillard <rouilj@ieee.org>
parents:
5097
diff
changeset
|
117 def testNoPermission(self): |
|
748ba87e1aca
Added a new cgi action restore. The opposite of (and a clone of) the existing retire action.
John Rouillard <rouilj@ieee.org>
parents:
5097
diff
changeset
|
118 self.assertRaises(Unauthorised, RestoreAction(self.client).execute) |
|
748ba87e1aca
Added a new cgi action restore. The opposite of (and a clone of) the existing retire action.
John Rouillard <rouilj@ieee.org>
parents:
5097
diff
changeset
|
119 |
|
2515
f8dafdd91bf5
remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2514
diff
changeset
|
120 class SearchActionTestCase(ActionTestCase): |
|
f8dafdd91bf5
remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2514
diff
changeset
|
121 def setUp(self): |
|
f8dafdd91bf5
remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2514
diff
changeset
|
122 ActionTestCase.setUp(self) |
|
f8dafdd91bf5
remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2514
diff
changeset
|
123 self.action = SearchAction(self.client) |
|
f8dafdd91bf5
remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2514
diff
changeset
|
124 |
|
f8dafdd91bf5
remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2514
diff
changeset
|
125 class StandardSearchActionTestCase(SearchActionTestCase): |
|
f8dafdd91bf5
remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2514
diff
changeset
|
126 def testNoPermission(self): |
|
f8dafdd91bf5
remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2514
diff
changeset
|
127 self.assertRaises(Unauthorised, self.action.execute) |
|
f8dafdd91bf5
remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2514
diff
changeset
|
128 |
|
f8dafdd91bf5
remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2514
diff
changeset
|
129 def testQueryName(self): |
|
f8dafdd91bf5
remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2514
diff
changeset
|
130 self.assertEqual(self.action.getQueryName(), '') |
|
f8dafdd91bf5
remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2514
diff
changeset
|
131 |
|
f8dafdd91bf5
remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2514
diff
changeset
|
132 self.form.value.append(MiniFieldStorage('@queryname', 'foo')) |
|
f8dafdd91bf5
remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2514
diff
changeset
|
133 self.assertEqual(self.action.getQueryName(), 'foo') |
|
f8dafdd91bf5
remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2514
diff
changeset
|
134 |
|
f8dafdd91bf5
remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2514
diff
changeset
|
135 class FakeFilterVarsTestCase(SearchActionTestCase): |
|
f8dafdd91bf5
remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2514
diff
changeset
|
136 def setUp(self): |
|
f8dafdd91bf5
remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2514
diff
changeset
|
137 SearchActionTestCase.setUp(self) |
|
3635
53987aa153d2
Transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3188
diff
changeset
|
138 self.client.db.classes.get_transitive_prop = lambda x: \ |
|
53987aa153d2
Transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3188
diff
changeset
|
139 hyperdb.Multilink('foo') |
|
2515
f8dafdd91bf5
remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2514
diff
changeset
|
140 |
|
f8dafdd91bf5
remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2514
diff
changeset
|
141 def assertFilterEquals(self, expected): |
|
f8dafdd91bf5
remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2514
diff
changeset
|
142 self.action.fakeFilterVars() |
|
f8dafdd91bf5
remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2514
diff
changeset
|
143 self.assertEqual(self.form.getvalue('@filter'), expected) |
|
f8dafdd91bf5
remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2514
diff
changeset
|
144 |
|
f8dafdd91bf5
remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2514
diff
changeset
|
145 def testEmptyMultilink(self): |
|
f8dafdd91bf5
remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2514
diff
changeset
|
146 self.form.value.append(MiniFieldStorage('foo', '')) |
|
f8dafdd91bf5
remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2514
diff
changeset
|
147 self.form.value.append(MiniFieldStorage('foo', '')) |
|
f8dafdd91bf5
remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2514
diff
changeset
|
148 |
|
f8dafdd91bf5
remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2514
diff
changeset
|
149 self.assertFilterEquals(None) |
|
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 testNonEmptyMultilink(self): |
|
f8dafdd91bf5
remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2514
diff
changeset
|
152 self.form.value.append(MiniFieldStorage('foo', '')) |
|
f8dafdd91bf5
remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2514
diff
changeset
|
153 self.form.value.append(MiniFieldStorage('foo', '1')) |
|
f8dafdd91bf5
remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2514
diff
changeset
|
154 |
|
f8dafdd91bf5
remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2514
diff
changeset
|
155 self.assertFilterEquals('foo') |
|
f8dafdd91bf5
remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2514
diff
changeset
|
156 |
|
f8dafdd91bf5
remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2514
diff
changeset
|
157 def testEmptyKey(self): |
|
f8dafdd91bf5
remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2514
diff
changeset
|
158 self.form.value.append(MiniFieldStorage('foo', '')) |
|
f8dafdd91bf5
remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2514
diff
changeset
|
159 self.assertFilterEquals(None) |
|
f8dafdd91bf5
remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2514
diff
changeset
|
160 |
|
f8dafdd91bf5
remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2514
diff
changeset
|
161 def testStandardKey(self): |
|
f8dafdd91bf5
remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2514
diff
changeset
|
162 self.form.value.append(MiniFieldStorage('foo', '1')) |
|
f8dafdd91bf5
remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2514
diff
changeset
|
163 self.assertFilterEquals('foo') |
|
f8dafdd91bf5
remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2514
diff
changeset
|
164 |
|
f8dafdd91bf5
remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2514
diff
changeset
|
165 def testStringKey(self): |
|
f8dafdd91bf5
remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2514
diff
changeset
|
166 self.client.db.classes.getprops = lambda: {'foo': hyperdb.String()} |
|
f8dafdd91bf5
remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2514
diff
changeset
|
167 self.form.value.append(MiniFieldStorage('foo', 'hello')) |
|
f8dafdd91bf5
remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2514
diff
changeset
|
168 self.assertFilterEquals('foo') |
|
f8dafdd91bf5
remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2514
diff
changeset
|
169 |
|
5097
156cbc1d182c
Validate values for Integer and Numeric type filter parameters rather than
John Rouillard <rouilj@ieee.org>
parents:
5037
diff
changeset
|
170 def testNumKey(self): # testing patch: http://hg.python.org/tracker/roundup/rev/98508a47c126 |
|
156cbc1d182c
Validate values for Integer and Numeric type filter parameters rather than
John Rouillard <rouilj@ieee.org>
parents:
5037
diff
changeset
|
171 for val in [ "-1000a", "test", "o0.9999", "o0", "1.00/10" ]: |
|
5376
64b05e24dbd8
Python 3 preparation: convert print to a function.
Joseph Myers <jsm@polyomino.org.uk>
parents:
5248
diff
changeset
|
172 print("testing ", val) |
|
5097
156cbc1d182c
Validate values for Integer and Numeric type filter parameters rather than
John Rouillard <rouilj@ieee.org>
parents:
5037
diff
changeset
|
173 self.client.db.classes.get_transitive_prop = lambda x: hyperdb.Number() |
|
156cbc1d182c
Validate values for Integer and Numeric type filter parameters rather than
John Rouillard <rouilj@ieee.org>
parents:
5037
diff
changeset
|
174 self.form.value.append(MiniFieldStorage('foo', val)) # invalid numbers |
|
156cbc1d182c
Validate values for Integer and Numeric type filter parameters rather than
John Rouillard <rouilj@ieee.org>
parents:
5037
diff
changeset
|
175 self.assertRaises(FormError, self.action.fakeFilterVars) |
|
156cbc1d182c
Validate values for Integer and Numeric type filter parameters rather than
John Rouillard <rouilj@ieee.org>
parents:
5037
diff
changeset
|
176 del self.form.value[:] |
|
156cbc1d182c
Validate values for Integer and Numeric type filter parameters rather than
John Rouillard <rouilj@ieee.org>
parents:
5037
diff
changeset
|
177 |
|
156cbc1d182c
Validate values for Integer and Numeric type filter parameters rather than
John Rouillard <rouilj@ieee.org>
parents:
5037
diff
changeset
|
178 for val in [ "-1000.7738", "-556", "-0.9999", "-.456", "-5E-5", "0.00", "0", |
|
156cbc1d182c
Validate values for Integer and Numeric type filter parameters rather than
John Rouillard <rouilj@ieee.org>
parents:
5037
diff
changeset
|
179 "1.00", "0556", "7.56E2", "1000.7738"]: |
|
156cbc1d182c
Validate values for Integer and Numeric type filter parameters rather than
John Rouillard <rouilj@ieee.org>
parents:
5037
diff
changeset
|
180 self.form.value.append(MiniFieldStorage('foo', val)) |
|
156cbc1d182c
Validate values for Integer and Numeric type filter parameters rather than
John Rouillard <rouilj@ieee.org>
parents:
5037
diff
changeset
|
181 self.action.fakeFilterVars() # this should run and return. No errors, nothing to check. |
|
156cbc1d182c
Validate values for Integer and Numeric type filter parameters rather than
John Rouillard <rouilj@ieee.org>
parents:
5037
diff
changeset
|
182 del self.form.value[:] |
|
156cbc1d182c
Validate values for Integer and Numeric type filter parameters rather than
John Rouillard <rouilj@ieee.org>
parents:
5037
diff
changeset
|
183 |
|
156cbc1d182c
Validate values for Integer and Numeric type filter parameters rather than
John Rouillard <rouilj@ieee.org>
parents:
5037
diff
changeset
|
184 def testIntKey(self): # testing patch: http://hg.python.org/tracker/roundup/rev/98508a47c126 |
|
156cbc1d182c
Validate values for Integer and Numeric type filter parameters rather than
John Rouillard <rouilj@ieee.org>
parents:
5037
diff
changeset
|
185 for val in [ "-1000a", "test", "-5E-5", "0.9999", "0.0", "1.000", "0456", "1E4" ]: |
|
5376
64b05e24dbd8
Python 3 preparation: convert print to a function.
Joseph Myers <jsm@polyomino.org.uk>
parents:
5248
diff
changeset
|
186 print("testing ", val) |
|
5097
156cbc1d182c
Validate values for Integer and Numeric type filter parameters rather than
John Rouillard <rouilj@ieee.org>
parents:
5037
diff
changeset
|
187 self.client.db.classes.get_transitive_prop = lambda x: hyperdb.Integer() |
|
156cbc1d182c
Validate values for Integer and Numeric type filter parameters rather than
John Rouillard <rouilj@ieee.org>
parents:
5037
diff
changeset
|
188 self.form.value.append(MiniFieldStorage('foo', val)) |
|
156cbc1d182c
Validate values for Integer and Numeric type filter parameters rather than
John Rouillard <rouilj@ieee.org>
parents:
5037
diff
changeset
|
189 self.assertRaises(FormError, self.action.fakeFilterVars) |
|
156cbc1d182c
Validate values for Integer and Numeric type filter parameters rather than
John Rouillard <rouilj@ieee.org>
parents:
5037
diff
changeset
|
190 del self.form.value[:] |
|
156cbc1d182c
Validate values for Integer and Numeric type filter parameters rather than
John Rouillard <rouilj@ieee.org>
parents:
5037
diff
changeset
|
191 |
|
156cbc1d182c
Validate values for Integer and Numeric type filter parameters rather than
John Rouillard <rouilj@ieee.org>
parents:
5037
diff
changeset
|
192 for val in [ "-1000", "-512", "0", "1", "100", "248" ]: # no scientific notation apparently |
|
156cbc1d182c
Validate values for Integer and Numeric type filter parameters rather than
John Rouillard <rouilj@ieee.org>
parents:
5037
diff
changeset
|
193 self.client.db.classes.get_transitive_prop = lambda x: hyperdb.Integer() |
|
156cbc1d182c
Validate values for Integer and Numeric type filter parameters rather than
John Rouillard <rouilj@ieee.org>
parents:
5037
diff
changeset
|
194 self.form.value.append(MiniFieldStorage('foo', val)) |
|
156cbc1d182c
Validate values for Integer and Numeric type filter parameters rather than
John Rouillard <rouilj@ieee.org>
parents:
5037
diff
changeset
|
195 self.action.fakeFilterVars() # this should run and return. No errors, nothing to check. |
|
156cbc1d182c
Validate values for Integer and Numeric type filter parameters rather than
John Rouillard <rouilj@ieee.org>
parents:
5037
diff
changeset
|
196 del self.form.value[:] |
|
156cbc1d182c
Validate values for Integer and Numeric type filter parameters rather than
John Rouillard <rouilj@ieee.org>
parents:
5037
diff
changeset
|
197 |
|
2515
f8dafdd91bf5
remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2514
diff
changeset
|
198 def testTokenizedStringKey(self): |
|
3635
53987aa153d2
Transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3188
diff
changeset
|
199 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
|
200 self.form.value.append(MiniFieldStorage('foo', 'hello world')) |
|
f8dafdd91bf5
remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2514
diff
changeset
|
201 |
|
f8dafdd91bf5
remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2514
diff
changeset
|
202 self.assertFilterEquals('foo') |
|
f8dafdd91bf5
remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2514
diff
changeset
|
203 |
|
f8dafdd91bf5
remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2514
diff
changeset
|
204 # 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
|
205 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
|
206 ['hello', 'world']) |
|
2515
f8dafdd91bf5
remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2514
diff
changeset
|
207 |
|
f8dafdd91bf5
remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2514
diff
changeset
|
208 class CollisionDetectionTestCase(ActionTestCase): |
|
f8dafdd91bf5
remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2514
diff
changeset
|
209 def setUp(self): |
|
f8dafdd91bf5
remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2514
diff
changeset
|
210 ActionTestCase.setUp(self) |
|
f8dafdd91bf5
remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2514
diff
changeset
|
211 self.action = EditItemAction(self.client) |
|
f8dafdd91bf5
remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2514
diff
changeset
|
212 self.now = Date('.') |
|
f8dafdd91bf5
remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2514
diff
changeset
|
213 # round off for testing |
|
f8dafdd91bf5
remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2514
diff
changeset
|
214 self.now.second = int(self.now.second) |
|
f8dafdd91bf5
remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2514
diff
changeset
|
215 |
|
f8dafdd91bf5
remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2514
diff
changeset
|
216 def testLastUserActivity(self): |
|
f8dafdd91bf5
remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2514
diff
changeset
|
217 self.assertEqual(self.action.lastUserActivity(), None) |
|
f8dafdd91bf5
remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2514
diff
changeset
|
218 |
|
2930
4b5d7b4bc089
applied patch [SF#1067690];
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2515
diff
changeset
|
219 self.client.form.value.append( |
|
4b5d7b4bc089
applied patch [SF#1067690];
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2515
diff
changeset
|
220 MiniFieldStorage('@lastactivity', str(self.now))) |
|
2515
f8dafdd91bf5
remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2514
diff
changeset
|
221 self.assertEqual(self.action.lastUserActivity(), self.now) |
|
f8dafdd91bf5
remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2514
diff
changeset
|
222 |
|
f8dafdd91bf5
remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2514
diff
changeset
|
223 def testLastNodeActivity(self): |
|
f8dafdd91bf5
remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2514
diff
changeset
|
224 self.action.classname = 'issue' |
|
f8dafdd91bf5
remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2514
diff
changeset
|
225 self.action.nodeid = '1' |
|
f8dafdd91bf5
remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2514
diff
changeset
|
226 |
|
f8dafdd91bf5
remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2514
diff
changeset
|
227 def get(nodeid, propname): |
|
f8dafdd91bf5
remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2514
diff
changeset
|
228 self.assertEqual(nodeid, '1') |
|
f8dafdd91bf5
remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2514
diff
changeset
|
229 self.assertEqual(propname, 'activity') |
|
f8dafdd91bf5
remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2514
diff
changeset
|
230 return self.now |
|
f8dafdd91bf5
remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2514
diff
changeset
|
231 self.client.db.issue.get = get |
|
f8dafdd91bf5
remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2514
diff
changeset
|
232 |
|
f8dafdd91bf5
remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2514
diff
changeset
|
233 self.assertEqual(self.action.lastNodeActivity(), self.now) |
|
f8dafdd91bf5
remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2514
diff
changeset
|
234 |
|
f8dafdd91bf5
remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2514
diff
changeset
|
235 def testCollision(self): |
|
3188
7faae85e1e33
merge from branch
Richard Jones <richard@users.sourceforge.net>
parents:
3018
diff
changeset
|
236 # fake up an actual change |
|
7faae85e1e33
merge from branch
Richard Jones <richard@users.sourceforge.net>
parents:
3018
diff
changeset
|
237 self.action.classname = 'test' |
|
7faae85e1e33
merge from branch
Richard Jones <richard@users.sourceforge.net>
parents:
3018
diff
changeset
|
238 self.action.nodeid = '1' |
|
7faae85e1e33
merge from branch
Richard Jones <richard@users.sourceforge.net>
parents:
3018
diff
changeset
|
239 self.client.parsePropsFromForm = lambda: ({('test','1'):{1:1}}, []) |
|
7faae85e1e33
merge from branch
Richard Jones <richard@users.sourceforge.net>
parents:
3018
diff
changeset
|
240 self.failUnless(self.action.detectCollision(self.now, |
|
7faae85e1e33
merge from branch
Richard Jones <richard@users.sourceforge.net>
parents:
3018
diff
changeset
|
241 self.now + Interval("1d"))) |
|
7faae85e1e33
merge from branch
Richard Jones <richard@users.sourceforge.net>
parents:
3018
diff
changeset
|
242 self.failIf(self.action.detectCollision(self.now, |
|
7faae85e1e33
merge from branch
Richard Jones <richard@users.sourceforge.net>
parents:
3018
diff
changeset
|
243 self.now - Interval("1d"))) |
|
2515
f8dafdd91bf5
remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2514
diff
changeset
|
244 self.failIf(self.action.detectCollision(None, self.now)) |
|
f8dafdd91bf5
remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2514
diff
changeset
|
245 |
|
2930
4b5d7b4bc089
applied patch [SF#1067690];
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2515
diff
changeset
|
246 class LoginTestCase(ActionTestCase): |
|
4b5d7b4bc089
applied patch [SF#1067690];
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2515
diff
changeset
|
247 def setUp(self): |
|
4b5d7b4bc089
applied patch [SF#1067690];
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2515
diff
changeset
|
248 ActionTestCase.setUp(self) |
|
4880
ca692423e401
Different approach to fix XSS in issue2550817
Ralf Schlatterbeck <rsc@runtux.com>
parents:
4742
diff
changeset
|
249 self.client._error_message = [] |
|
2930
4b5d7b4bc089
applied patch [SF#1067690];
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2515
diff
changeset
|
250 |
|
4b5d7b4bc089
applied patch [SF#1067690];
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2515
diff
changeset
|
251 # set the db password to 'right' |
|
4b5d7b4bc089
applied patch [SF#1067690];
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2515
diff
changeset
|
252 self.client.db.user.get = lambda a,b: 'right' |
|
4b5d7b4bc089
applied patch [SF#1067690];
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2515
diff
changeset
|
253 |
|
4b5d7b4bc089
applied patch [SF#1067690];
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2515
diff
changeset
|
254 # unless explicitly overridden, we should never get here |
|
4b5d7b4bc089
applied patch [SF#1067690];
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2515
diff
changeset
|
255 self.client.opendb = lambda a: self.fail( |
|
4b5d7b4bc089
applied patch [SF#1067690];
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2515
diff
changeset
|
256 "Logged in, but we shouldn't be.") |
|
4b5d7b4bc089
applied patch [SF#1067690];
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2515
diff
changeset
|
257 |
|
5121
894aa07be6cb
issue2550785: Using login from search (or logout) fails. when
John Rouillard <rouilj@ieee.org>
parents:
5119
diff
changeset
|
258 def assertRaisesMessage(self, exception, callable, message, *args, |
|
894aa07be6cb
issue2550785: Using login from search (or logout) fails. when
John Rouillard <rouilj@ieee.org>
parents:
5119
diff
changeset
|
259 **kwargs): |
|
894aa07be6cb
issue2550785: Using login from search (or logout) fails. when
John Rouillard <rouilj@ieee.org>
parents:
5119
diff
changeset
|
260 """An extension of assertRaises, which also checks the exception |
|
894aa07be6cb
issue2550785: Using login from search (or logout) fails. when
John Rouillard <rouilj@ieee.org>
parents:
5119
diff
changeset
|
261 message. We need this because we rely on exception messages when |
|
894aa07be6cb
issue2550785: Using login from search (or logout) fails. when
John Rouillard <rouilj@ieee.org>
parents:
5119
diff
changeset
|
262 redirecting. |
|
894aa07be6cb
issue2550785: Using login from search (or logout) fails. when
John Rouillard <rouilj@ieee.org>
parents:
5119
diff
changeset
|
263 """ |
|
894aa07be6cb
issue2550785: Using login from search (or logout) fails. when
John Rouillard <rouilj@ieee.org>
parents:
5119
diff
changeset
|
264 try: |
|
894aa07be6cb
issue2550785: Using login from search (or logout) fails. when
John Rouillard <rouilj@ieee.org>
parents:
5119
diff
changeset
|
265 callable(*args, **kwargs) |
|
5248
198b6e810c67
Use Python-3-compatible 'as' syntax for except statements
Eric S. Raymond <esr@thyrsus.com>
parents:
5164
diff
changeset
|
266 except exception as msg: |
|
5121
894aa07be6cb
issue2550785: Using login from search (or logout) fails. when
John Rouillard <rouilj@ieee.org>
parents:
5119
diff
changeset
|
267 self.assertEqual(str(msg), message) |
|
894aa07be6cb
issue2550785: Using login from search (or logout) fails. when
John Rouillard <rouilj@ieee.org>
parents:
5119
diff
changeset
|
268 else: |
|
894aa07be6cb
issue2550785: Using login from search (or logout) fails. when
John Rouillard <rouilj@ieee.org>
parents:
5119
diff
changeset
|
269 if hasattr(exception, '__name__'): |
|
894aa07be6cb
issue2550785: Using login from search (or logout) fails. when
John Rouillard <rouilj@ieee.org>
parents:
5119
diff
changeset
|
270 excName = exception.__name__ |
|
894aa07be6cb
issue2550785: Using login from search (or logout) fails. when
John Rouillard <rouilj@ieee.org>
parents:
5119
diff
changeset
|
271 else: |
|
894aa07be6cb
issue2550785: Using login from search (or logout) fails. when
John Rouillard <rouilj@ieee.org>
parents:
5119
diff
changeset
|
272 excName = str(exception) |
|
5378
35ea9b1efc14
Python 3 preparation: "raise" syntax.
Joseph Myers <jsm@polyomino.org.uk>
parents:
5376
diff
changeset
|
273 raise self.failureException(excName) |
|
5121
894aa07be6cb
issue2550785: Using login from search (or logout) fails. when
John Rouillard <rouilj@ieee.org>
parents:
5119
diff
changeset
|
274 |
|
2930
4b5d7b4bc089
applied patch [SF#1067690];
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2515
diff
changeset
|
275 def assertLoginLeavesMessages(self, messages, username=None, password=None): |
|
4b5d7b4bc089
applied patch [SF#1067690];
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2515
diff
changeset
|
276 if username is not None: |
|
4b5d7b4bc089
applied patch [SF#1067690];
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2515
diff
changeset
|
277 self.form.value.append(MiniFieldStorage('__login_name', username)) |
|
4b5d7b4bc089
applied patch [SF#1067690];
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2515
diff
changeset
|
278 if password is not None: |
|
4b5d7b4bc089
applied patch [SF#1067690];
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2515
diff
changeset
|
279 self.form.value.append( |
|
4b5d7b4bc089
applied patch [SF#1067690];
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2515
diff
changeset
|
280 MiniFieldStorage('__login_password', password)) |
|
4b5d7b4bc089
applied patch [SF#1067690];
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2515
diff
changeset
|
281 |
|
4b5d7b4bc089
applied patch [SF#1067690];
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2515
diff
changeset
|
282 LoginAction(self.client).handle() |
|
4880
ca692423e401
Different approach to fix XSS in issue2550817
Ralf Schlatterbeck <rsc@runtux.com>
parents:
4742
diff
changeset
|
283 self.assertEqual(self.client._error_message, messages) |
|
2930
4b5d7b4bc089
applied patch [SF#1067690];
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2515
diff
changeset
|
284 |
|
5121
894aa07be6cb
issue2550785: Using login from search (or logout) fails. when
John Rouillard <rouilj@ieee.org>
parents:
5119
diff
changeset
|
285 def assertLoginRaisesRedirect(self, message, username=None, password=None, came_from=None): |
|
894aa07be6cb
issue2550785: Using login from search (or logout) fails. when
John Rouillard <rouilj@ieee.org>
parents:
5119
diff
changeset
|
286 if username is not None: |
|
894aa07be6cb
issue2550785: Using login from search (or logout) fails. when
John Rouillard <rouilj@ieee.org>
parents:
5119
diff
changeset
|
287 self.form.value.append(MiniFieldStorage('__login_name', username)) |
|
894aa07be6cb
issue2550785: Using login from search (or logout) fails. when
John Rouillard <rouilj@ieee.org>
parents:
5119
diff
changeset
|
288 if password is not None: |
|
894aa07be6cb
issue2550785: Using login from search (or logout) fails. when
John Rouillard <rouilj@ieee.org>
parents:
5119
diff
changeset
|
289 self.form.value.append( |
|
894aa07be6cb
issue2550785: Using login from search (or logout) fails. when
John Rouillard <rouilj@ieee.org>
parents:
5119
diff
changeset
|
290 MiniFieldStorage('__login_password', password)) |
|
894aa07be6cb
issue2550785: Using login from search (or logout) fails. when
John Rouillard <rouilj@ieee.org>
parents:
5119
diff
changeset
|
291 if came_from is not None: |
|
894aa07be6cb
issue2550785: Using login from search (or logout) fails. when
John Rouillard <rouilj@ieee.org>
parents:
5119
diff
changeset
|
292 self.form.value.append( |
|
894aa07be6cb
issue2550785: Using login from search (or logout) fails. when
John Rouillard <rouilj@ieee.org>
parents:
5119
diff
changeset
|
293 MiniFieldStorage('__came_from', came_from)) |
|
894aa07be6cb
issue2550785: Using login from search (or logout) fails. when
John Rouillard <rouilj@ieee.org>
parents:
5119
diff
changeset
|
294 |
|
894aa07be6cb
issue2550785: Using login from search (or logout) fails. when
John Rouillard <rouilj@ieee.org>
parents:
5119
diff
changeset
|
295 self.assertRaisesMessage(Redirect, LoginAction(self.client).handle, message) |
|
894aa07be6cb
issue2550785: Using login from search (or logout) fails. when
John Rouillard <rouilj@ieee.org>
parents:
5119
diff
changeset
|
296 |
|
2930
4b5d7b4bc089
applied patch [SF#1067690];
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2515
diff
changeset
|
297 def testNoUsername(self): |
|
4b5d7b4bc089
applied patch [SF#1067690];
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2515
diff
changeset
|
298 self.assertLoginLeavesMessages(['Username required']) |
|
4b5d7b4bc089
applied patch [SF#1067690];
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2515
diff
changeset
|
299 |
|
4b5d7b4bc089
applied patch [SF#1067690];
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2515
diff
changeset
|
300 def testInvalidUsername(self): |
|
4b5d7b4bc089
applied patch [SF#1067690];
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2515
diff
changeset
|
301 def raiseKeyError(a): |
|
4b5d7b4bc089
applied patch [SF#1067690];
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2515
diff
changeset
|
302 raise KeyError |
|
4b5d7b4bc089
applied patch [SF#1067690];
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2515
diff
changeset
|
303 self.client.db.user.lookup = raiseKeyError |
|
4b5d7b4bc089
applied patch [SF#1067690];
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2515
diff
changeset
|
304 self.assertLoginLeavesMessages(['Invalid login'], 'foo') |
|
4b5d7b4bc089
applied patch [SF#1067690];
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2515
diff
changeset
|
305 |
|
4b5d7b4bc089
applied patch [SF#1067690];
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2515
diff
changeset
|
306 def testInvalidPassword(self): |
|
4b5d7b4bc089
applied patch [SF#1067690];
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2515
diff
changeset
|
307 self.assertLoginLeavesMessages(['Invalid login'], 'foo', 'wrong') |
|
4b5d7b4bc089
applied patch [SF#1067690];
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2515
diff
changeset
|
308 |
|
4b5d7b4bc089
applied patch [SF#1067690];
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2515
diff
changeset
|
309 def testNoWebAccess(self): |
|
4b5d7b4bc089
applied patch [SF#1067690];
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2515
diff
changeset
|
310 self.assertLoginLeavesMessages(['You do not have permission to login'], |
|
4b5d7b4bc089
applied patch [SF#1067690];
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2515
diff
changeset
|
311 'foo', 'right') |
|
4b5d7b4bc089
applied patch [SF#1067690];
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2515
diff
changeset
|
312 |
|
4b5d7b4bc089
applied patch [SF#1067690];
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2515
diff
changeset
|
313 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
|
314 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
|
315 |
|
4b5d7b4bc089
applied patch [SF#1067690];
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2515
diff
changeset
|
316 def opendb(username): |
|
4b5d7b4bc089
applied patch [SF#1067690];
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2515
diff
changeset
|
317 self.assertEqual(username, 'foo') |
|
4b5d7b4bc089
applied patch [SF#1067690];
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2515
diff
changeset
|
318 self.client.opendb = opendb |
|
4b5d7b4bc089
applied patch [SF#1067690];
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2515
diff
changeset
|
319 |
|
4b5d7b4bc089
applied patch [SF#1067690];
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2515
diff
changeset
|
320 self.assertLoginLeavesMessages([], 'foo', 'right') |
|
4b5d7b4bc089
applied patch [SF#1067690];
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2515
diff
changeset
|
321 |
|
5121
894aa07be6cb
issue2550785: Using login from search (or logout) fails. when
John Rouillard <rouilj@ieee.org>
parents:
5119
diff
changeset
|
322 def testCorrectLoginRedirect(self): |
|
894aa07be6cb
issue2550785: Using login from search (or logout) fails. when
John Rouillard <rouilj@ieee.org>
parents:
5119
diff
changeset
|
323 self.client.db.security.hasPermission = lambda *args, **kwargs: True |
|
894aa07be6cb
issue2550785: Using login from search (or logout) fails. when
John Rouillard <rouilj@ieee.org>
parents:
5119
diff
changeset
|
324 def opendb(username): |
|
894aa07be6cb
issue2550785: Using login from search (or logout) fails. when
John Rouillard <rouilj@ieee.org>
parents:
5119
diff
changeset
|
325 self.assertEqual(username, 'foo') |
|
894aa07be6cb
issue2550785: Using login from search (or logout) fails. when
John Rouillard <rouilj@ieee.org>
parents:
5119
diff
changeset
|
326 self.client.opendb = opendb |
|
894aa07be6cb
issue2550785: Using login from search (or logout) fails. when
John Rouillard <rouilj@ieee.org>
parents:
5119
diff
changeset
|
327 |
|
894aa07be6cb
issue2550785: Using login from search (or logout) fails. when
John Rouillard <rouilj@ieee.org>
parents:
5119
diff
changeset
|
328 # basic test with query |
|
894aa07be6cb
issue2550785: Using login from search (or logout) fails. when
John Rouillard <rouilj@ieee.org>
parents:
5119
diff
changeset
|
329 self.assertLoginRaisesRedirect("http://whoami.com/path/issue?%40action=search", |
|
894aa07be6cb
issue2550785: Using login from search (or logout) fails. when
John Rouillard <rouilj@ieee.org>
parents:
5119
diff
changeset
|
330 'foo', 'right', "http://whoami.com/path/issue?@action=search") |
|
894aa07be6cb
issue2550785: Using login from search (or logout) fails. when
John Rouillard <rouilj@ieee.org>
parents:
5119
diff
changeset
|
331 |
|
894aa07be6cb
issue2550785: Using login from search (or logout) fails. when
John Rouillard <rouilj@ieee.org>
parents:
5119
diff
changeset
|
332 # test that old messages are removed |
|
894aa07be6cb
issue2550785: Using login from search (or logout) fails. when
John Rouillard <rouilj@ieee.org>
parents:
5119
diff
changeset
|
333 self.form.value[:] = [] # clear out last test's setup values |
|
894aa07be6cb
issue2550785: Using login from search (or logout) fails. when
John Rouillard <rouilj@ieee.org>
parents:
5119
diff
changeset
|
334 self.assertLoginRaisesRedirect("http://whoami.com/path/issue?%40action=search", |
|
894aa07be6cb
issue2550785: Using login from search (or logout) fails. when
John Rouillard <rouilj@ieee.org>
parents:
5119
diff
changeset
|
335 'foo', 'right', "http://whoami.com/path/issue?@action=search&@ok_messagehurrah+we+win&@error_message=blam") |
|
894aa07be6cb
issue2550785: Using login from search (or logout) fails. when
John Rouillard <rouilj@ieee.org>
parents:
5119
diff
changeset
|
336 |
|
894aa07be6cb
issue2550785: Using login from search (or logout) fails. when
John Rouillard <rouilj@ieee.org>
parents:
5119
diff
changeset
|
337 # test when there is no query |
|
894aa07be6cb
issue2550785: Using login from search (or logout) fails. when
John Rouillard <rouilj@ieee.org>
parents:
5119
diff
changeset
|
338 self.form.value[:] = [] # clear out last test's setup values |
|
894aa07be6cb
issue2550785: Using login from search (or logout) fails. when
John Rouillard <rouilj@ieee.org>
parents:
5119
diff
changeset
|
339 self.assertLoginRaisesRedirect("http://whoami.com/path/issue255", |
|
894aa07be6cb
issue2550785: Using login from search (or logout) fails. when
John Rouillard <rouilj@ieee.org>
parents:
5119
diff
changeset
|
340 'foo', 'right', "http://whoami.com/path/issue255") |
|
894aa07be6cb
issue2550785: Using login from search (or logout) fails. when
John Rouillard <rouilj@ieee.org>
parents:
5119
diff
changeset
|
341 |
|
894aa07be6cb
issue2550785: Using login from search (or logout) fails. when
John Rouillard <rouilj@ieee.org>
parents:
5119
diff
changeset
|
342 # test if we are logged out; should kill the @action=logout |
|
894aa07be6cb
issue2550785: Using login from search (or logout) fails. when
John Rouillard <rouilj@ieee.org>
parents:
5119
diff
changeset
|
343 self.form.value[:] = [] # clear out last test's setup values |
|
5503
4f6e1ce89557
always encode query parameters in sorted order
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5388
diff
changeset
|
344 self.assertLoginRaisesRedirect("http://whoami.com/path/issue39?%40pagesize=50&%40startwith=0", |
|
5164
114d9628fd77
Fixed a couple of failing tests for *LoginRedirect in test_actions.py after url validation. Also raise ValueError from examine_url if base url is None.
John Rouillard <rouilj@ieee.org>
parents:
5121
diff
changeset
|
345 'foo', 'right', "http://whoami.com/path/issue39?@action=logout&@pagesize=50&@startwith=0") |
|
5121
894aa07be6cb
issue2550785: Using login from search (or logout) fails. when
John Rouillard <rouilj@ieee.org>
parents:
5119
diff
changeset
|
346 |
|
894aa07be6cb
issue2550785: Using login from search (or logout) fails. when
John Rouillard <rouilj@ieee.org>
parents:
5119
diff
changeset
|
347 def testInvalidLoginRedirect(self): |
|
894aa07be6cb
issue2550785: Using login from search (or logout) fails. when
John Rouillard <rouilj@ieee.org>
parents:
5119
diff
changeset
|
348 self.client.db.security.hasPermission = lambda *args, **kwargs: True |
|
894aa07be6cb
issue2550785: Using login from search (or logout) fails. when
John Rouillard <rouilj@ieee.org>
parents:
5119
diff
changeset
|
349 |
|
894aa07be6cb
issue2550785: Using login from search (or logout) fails. when
John Rouillard <rouilj@ieee.org>
parents:
5119
diff
changeset
|
350 def opendb(username): |
|
894aa07be6cb
issue2550785: Using login from search (or logout) fails. when
John Rouillard <rouilj@ieee.org>
parents:
5119
diff
changeset
|
351 self.assertEqual(username, 'foo') |
|
894aa07be6cb
issue2550785: Using login from search (or logout) fails. when
John Rouillard <rouilj@ieee.org>
parents:
5119
diff
changeset
|
352 self.client.opendb = opendb |
|
894aa07be6cb
issue2550785: Using login from search (or logout) fails. when
John Rouillard <rouilj@ieee.org>
parents:
5119
diff
changeset
|
353 |
|
894aa07be6cb
issue2550785: Using login from search (or logout) fails. when
John Rouillard <rouilj@ieee.org>
parents:
5119
diff
changeset
|
354 # basic test with query |
|
5503
4f6e1ce89557
always encode query parameters in sorted order
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5388
diff
changeset
|
355 self.assertLoginRaisesRedirect("http://whoami.com/path/issue?%40action=search&%40error_message=Invalid+login", |
|
5121
894aa07be6cb
issue2550785: Using login from search (or logout) fails. when
John Rouillard <rouilj@ieee.org>
parents:
5119
diff
changeset
|
356 'foo', 'wrong', "http://whoami.com/path/issue?@action=search") |
|
894aa07be6cb
issue2550785: Using login from search (or logout) fails. when
John Rouillard <rouilj@ieee.org>
parents:
5119
diff
changeset
|
357 |
|
894aa07be6cb
issue2550785: Using login from search (or logout) fails. when
John Rouillard <rouilj@ieee.org>
parents:
5119
diff
changeset
|
358 # test that old messages are removed |
|
894aa07be6cb
issue2550785: Using login from search (or logout) fails. when
John Rouillard <rouilj@ieee.org>
parents:
5119
diff
changeset
|
359 self.form.value[:] = [] # clear out last test's setup values |
|
5503
4f6e1ce89557
always encode query parameters in sorted order
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5388
diff
changeset
|
360 self.assertLoginRaisesRedirect("http://whoami.com/path/issue?%40action=search&%40error_message=Invalid+login", |
|
5121
894aa07be6cb
issue2550785: Using login from search (or logout) fails. when
John Rouillard <rouilj@ieee.org>
parents:
5119
diff
changeset
|
361 'foo', 'wrong', "http://whoami.com/path/issue?@action=search&@ok_messagehurrah+we+win&@error_message=blam") |
|
894aa07be6cb
issue2550785: Using login from search (or logout) fails. when
John Rouillard <rouilj@ieee.org>
parents:
5119
diff
changeset
|
362 |
|
894aa07be6cb
issue2550785: Using login from search (or logout) fails. when
John Rouillard <rouilj@ieee.org>
parents:
5119
diff
changeset
|
363 # test when there is no __came_from specified |
|
894aa07be6cb
issue2550785: Using login from search (or logout) fails. when
John Rouillard <rouilj@ieee.org>
parents:
5119
diff
changeset
|
364 self.form.value[:] = [] # clear out last test's setup values |
|
894aa07be6cb
issue2550785: Using login from search (or logout) fails. when
John Rouillard <rouilj@ieee.org>
parents:
5119
diff
changeset
|
365 # I am not sure why this produces three copies of the same error. |
|
894aa07be6cb
issue2550785: Using login from search (or logout) fails. when
John Rouillard <rouilj@ieee.org>
parents:
5119
diff
changeset
|
366 # only one copy of the error is displayed to the user in the web interface. |
|
894aa07be6cb
issue2550785: Using login from search (or logout) fails. when
John Rouillard <rouilj@ieee.org>
parents:
5119
diff
changeset
|
367 self.assertLoginLeavesMessages(['Invalid login', 'Invalid login', 'Invalid login'], 'foo', 'wrong') |
|
894aa07be6cb
issue2550785: Using login from search (or logout) fails. when
John Rouillard <rouilj@ieee.org>
parents:
5119
diff
changeset
|
368 |
|
894aa07be6cb
issue2550785: Using login from search (or logout) fails. when
John Rouillard <rouilj@ieee.org>
parents:
5119
diff
changeset
|
369 # test when there is no query |
|
894aa07be6cb
issue2550785: Using login from search (or logout) fails. when
John Rouillard <rouilj@ieee.org>
parents:
5119
diff
changeset
|
370 self.form.value[:] = [] # clear out last test's setup values |
|
894aa07be6cb
issue2550785: Using login from search (or logout) fails. when
John Rouillard <rouilj@ieee.org>
parents:
5119
diff
changeset
|
371 self.assertLoginRaisesRedirect("http://whoami.com/path/issue255?%40error_message=Invalid+login", |
|
894aa07be6cb
issue2550785: Using login from search (or logout) fails. when
John Rouillard <rouilj@ieee.org>
parents:
5119
diff
changeset
|
372 'foo', 'wrong', "http://whoami.com/path/issue255") |
|
894aa07be6cb
issue2550785: Using login from search (or logout) fails. when
John Rouillard <rouilj@ieee.org>
parents:
5119
diff
changeset
|
373 |
|
5717
cad18de2b988
issue2550949: Rate limit password guesses/login attempts.
John Rouillard <rouilj@ieee.org>
parents:
5649
diff
changeset
|
374 def testLoginRateLimit(self): |
|
cad18de2b988
issue2550949: Rate limit password guesses/login attempts.
John Rouillard <rouilj@ieee.org>
parents:
5649
diff
changeset
|
375 ''' Set number of logins in setup to 20 per minute. Three second |
|
cad18de2b988
issue2550949: Rate limit password guesses/login attempts.
John Rouillard <rouilj@ieee.org>
parents:
5649
diff
changeset
|
376 delay between login attempts doesn't trip rate limit. |
|
cad18de2b988
issue2550949: Rate limit password guesses/login attempts.
John Rouillard <rouilj@ieee.org>
parents:
5649
diff
changeset
|
377 Default limit is 3/min, but that means we sleep for 20 |
|
cad18de2b988
issue2550949: Rate limit password guesses/login attempts.
John Rouillard <rouilj@ieee.org>
parents:
5649
diff
changeset
|
378 seconds so I override the default limit to speed this up. |
|
cad18de2b988
issue2550949: Rate limit password guesses/login attempts.
John Rouillard <rouilj@ieee.org>
parents:
5649
diff
changeset
|
379 ''' |
|
cad18de2b988
issue2550949: Rate limit password guesses/login attempts.
John Rouillard <rouilj@ieee.org>
parents:
5649
diff
changeset
|
380 # Do the first login setting an invalid login name |
|
cad18de2b988
issue2550949: Rate limit password guesses/login attempts.
John Rouillard <rouilj@ieee.org>
parents:
5649
diff
changeset
|
381 self.assertLoginLeavesMessages(['Invalid login'], 'nouser') |
|
cad18de2b988
issue2550949: Rate limit password guesses/login attempts.
John Rouillard <rouilj@ieee.org>
parents:
5649
diff
changeset
|
382 # use up the rest of the 20 login attempts |
|
cad18de2b988
issue2550949: Rate limit password guesses/login attempts.
John Rouillard <rouilj@ieee.org>
parents:
5649
diff
changeset
|
383 for i in range(19): |
|
cad18de2b988
issue2550949: Rate limit password guesses/login attempts.
John Rouillard <rouilj@ieee.org>
parents:
5649
diff
changeset
|
384 self.client._error_message = [] |
|
cad18de2b988
issue2550949: Rate limit password guesses/login attempts.
John Rouillard <rouilj@ieee.org>
parents:
5649
diff
changeset
|
385 self.assertLoginLeavesMessages(['Invalid login']) |
|
cad18de2b988
issue2550949: Rate limit password guesses/login attempts.
John Rouillard <rouilj@ieee.org>
parents:
5649
diff
changeset
|
386 |
|
cad18de2b988
issue2550949: Rate limit password guesses/login attempts.
John Rouillard <rouilj@ieee.org>
parents:
5649
diff
changeset
|
387 self.assertRaisesMessage(Reject, LoginAction(self.client).handle, |
|
cad18de2b988
issue2550949: Rate limit password guesses/login attempts.
John Rouillard <rouilj@ieee.org>
parents:
5649
diff
changeset
|
388 'Logins occurring too fast. Please wait: 3 seconds.') |
|
cad18de2b988
issue2550949: Rate limit password guesses/login attempts.
John Rouillard <rouilj@ieee.org>
parents:
5649
diff
changeset
|
389 |
|
cad18de2b988
issue2550949: Rate limit password guesses/login attempts.
John Rouillard <rouilj@ieee.org>
parents:
5649
diff
changeset
|
390 sleep(3) # sleep as requested so we can do another login |
|
cad18de2b988
issue2550949: Rate limit password guesses/login attempts.
John Rouillard <rouilj@ieee.org>
parents:
5649
diff
changeset
|
391 self.client._error_message = [] |
|
cad18de2b988
issue2550949: Rate limit password guesses/login attempts.
John Rouillard <rouilj@ieee.org>
parents:
5649
diff
changeset
|
392 self.assertLoginLeavesMessages(['Invalid login']) # this is expected |
|
cad18de2b988
issue2550949: Rate limit password guesses/login attempts.
John Rouillard <rouilj@ieee.org>
parents:
5649
diff
changeset
|
393 |
|
cad18de2b988
issue2550949: Rate limit password guesses/login attempts.
John Rouillard <rouilj@ieee.org>
parents:
5649
diff
changeset
|
394 # and make sure we need to wait another three seconds |
|
cad18de2b988
issue2550949: Rate limit password guesses/login attempts.
John Rouillard <rouilj@ieee.org>
parents:
5649
diff
changeset
|
395 self.assertRaisesMessage(Reject, LoginAction(self.client).handle, |
|
cad18de2b988
issue2550949: Rate limit password guesses/login attempts.
John Rouillard <rouilj@ieee.org>
parents:
5649
diff
changeset
|
396 'Logins occurring too fast. Please wait: 3 seconds.') |
|
cad18de2b988
issue2550949: Rate limit password guesses/login attempts.
John Rouillard <rouilj@ieee.org>
parents:
5649
diff
changeset
|
397 |
|
3852
0dd05c9e5fff
New test for linking of non-existing and existing properties via a form.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3635
diff
changeset
|
398 class EditItemActionTestCase(ActionTestCase): |
|
0dd05c9e5fff
New test for linking of non-existing and existing properties via a form.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3635
diff
changeset
|
399 def setUp(self): |
|
0dd05c9e5fff
New test for linking of non-existing and existing properties via a form.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3635
diff
changeset
|
400 ActionTestCase.setUp(self) |
|
0dd05c9e5fff
New test for linking of non-existing and existing properties via a form.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3635
diff
changeset
|
401 self.result = [] |
|
4992
b562df8a5056
Fix form-parsing for multilinks
Ralf Schlatterbeck <rsc@runtux.com>
parents:
4880
diff
changeset
|
402 self.new_id = 16 |
|
3852
0dd05c9e5fff
New test for linking of non-existing and existing properties via a form.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3635
diff
changeset
|
403 class AppendResult: |
|
0dd05c9e5fff
New test for linking of non-existing and existing properties via a form.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3635
diff
changeset
|
404 def __init__(inner_self, name): |
|
0dd05c9e5fff
New test for linking of non-existing and existing properties via a form.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3635
diff
changeset
|
405 inner_self.name = name |
|
0dd05c9e5fff
New test for linking of non-existing and existing properties via a form.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3635
diff
changeset
|
406 def __call__(inner_self, *args, **kw): |
|
0dd05c9e5fff
New test for linking of non-existing and existing properties via a form.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3635
diff
changeset
|
407 self.result.append((inner_self.name, args, kw)) |
|
0dd05c9e5fff
New test for linking of non-existing and existing properties via a form.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3635
diff
changeset
|
408 if inner_self.name == 'set': |
|
0dd05c9e5fff
New test for linking of non-existing and existing properties via a form.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3635
diff
changeset
|
409 return kw |
|
4992
b562df8a5056
Fix form-parsing for multilinks
Ralf Schlatterbeck <rsc@runtux.com>
parents:
4880
diff
changeset
|
410 self.new_id+=1 |
|
b562df8a5056
Fix form-parsing for multilinks
Ralf Schlatterbeck <rsc@runtux.com>
parents:
4880
diff
changeset
|
411 return str(self.new_id) |
|
3852
0dd05c9e5fff
New test for linking of non-existing and existing properties via a form.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3635
diff
changeset
|
412 |
|
0dd05c9e5fff
New test for linking of non-existing and existing properties via a form.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3635
diff
changeset
|
413 self.client.db.security.hasPermission = true |
|
0dd05c9e5fff
New test for linking of non-existing and existing properties via a form.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3635
diff
changeset
|
414 self.client.classname = 'issue' |
|
0dd05c9e5fff
New test for linking of non-existing and existing properties via a form.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3635
diff
changeset
|
415 self.client.base = 'http://tracker/' |
|
0dd05c9e5fff
New test for linking of non-existing and existing properties via a form.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3635
diff
changeset
|
416 self.client.nodeid = '4711' |
|
0dd05c9e5fff
New test for linking of non-existing and existing properties via a form.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3635
diff
changeset
|
417 self.client.template = 'item' |
|
0dd05c9e5fff
New test for linking of non-existing and existing properties via a form.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3635
diff
changeset
|
418 self.client.db.classes.create = AppendResult('create') |
|
0dd05c9e5fff
New test for linking of non-existing and existing properties via a form.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3635
diff
changeset
|
419 self.client.db.classes.set = AppendResult('set') |
|
0dd05c9e5fff
New test for linking of non-existing and existing properties via a form.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3635
diff
changeset
|
420 self.client.db.classes.getprops = lambda: \ |
|
3855
de4c2e538e06
Bug-Fix: File attachments from the web-interface didn't work.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3852
diff
changeset
|
421 ({'messages':hyperdb.Multilink('msg') |
|
de4c2e538e06
Bug-Fix: File attachments from the web-interface didn't work.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3852
diff
changeset
|
422 ,'content':hyperdb.String() |
|
de4c2e538e06
Bug-Fix: File attachments from the web-interface didn't work.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3852
diff
changeset
|
423 ,'files':hyperdb.Multilink('file') |
|
4304
df7a4400c2ce
Fix linking of an existing item to a newly created item...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3855
diff
changeset
|
424 ,'msg':hyperdb.Link('msg') |
|
3855
de4c2e538e06
Bug-Fix: File attachments from the web-interface didn't work.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3852
diff
changeset
|
425 }) |
|
3852
0dd05c9e5fff
New test for linking of non-existing and existing properties via a form.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3635
diff
changeset
|
426 self.action = EditItemAction(self.client) |
|
0dd05c9e5fff
New test for linking of non-existing and existing properties via a form.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3635
diff
changeset
|
427 |
|
0dd05c9e5fff
New test for linking of non-existing and existing properties via a form.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3635
diff
changeset
|
428 def testMessageAttach(self): |
|
0dd05c9e5fff
New test for linking of non-existing and existing properties via a form.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3635
diff
changeset
|
429 expect = \ |
|
0dd05c9e5fff
New test for linking of non-existing and existing properties via a form.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3635
diff
changeset
|
430 [ ('create',(),{'content':'t'}) |
|
0dd05c9e5fff
New test for linking of non-existing and existing properties via a form.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3635
diff
changeset
|
431 , ('set',('4711',), {'messages':['23','42','17']}) |
|
0dd05c9e5fff
New test for linking of non-existing and existing properties via a form.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3635
diff
changeset
|
432 ] |
|
0dd05c9e5fff
New test for linking of non-existing and existing properties via a form.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3635
diff
changeset
|
433 self.client.db.classes.get = lambda a, b:['23','42'] |
|
0dd05c9e5fff
New test for linking of non-existing and existing properties via a form.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3635
diff
changeset
|
434 self.client.parsePropsFromForm = lambda: \ |
|
0dd05c9e5fff
New test for linking of non-existing and existing properties via a form.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3635
diff
changeset
|
435 ( {('msg','-1'):{'content':'t'},('issue','4711'):{}} |
|
0dd05c9e5fff
New test for linking of non-existing and existing properties via a form.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3635
diff
changeset
|
436 , [('issue','4711','messages',[('msg','-1')])] |
|
0dd05c9e5fff
New test for linking of non-existing and existing properties via a form.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3635
diff
changeset
|
437 ) |
|
0dd05c9e5fff
New test for linking of non-existing and existing properties via a form.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3635
diff
changeset
|
438 try : |
|
0dd05c9e5fff
New test for linking of non-existing and existing properties via a form.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3635
diff
changeset
|
439 self.action.handle() |
|
5248
198b6e810c67
Use Python-3-compatible 'as' syntax for except statements
Eric S. Raymond <esr@thyrsus.com>
parents:
5164
diff
changeset
|
440 except Redirect as msg: |
|
3852
0dd05c9e5fff
New test for linking of non-existing and existing properties via a form.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3635
diff
changeset
|
441 pass |
|
0dd05c9e5fff
New test for linking of non-existing and existing properties via a form.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3635
diff
changeset
|
442 self.assertEqual(expect, self.result) |
|
0dd05c9e5fff
New test for linking of non-existing and existing properties via a form.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3635
diff
changeset
|
443 |
|
4992
b562df8a5056
Fix form-parsing for multilinks
Ralf Schlatterbeck <rsc@runtux.com>
parents:
4880
diff
changeset
|
444 def testMessageMultiAttach(self): |
|
b562df8a5056
Fix form-parsing for multilinks
Ralf Schlatterbeck <rsc@runtux.com>
parents:
4880
diff
changeset
|
445 expect = \ |
|
b562df8a5056
Fix form-parsing for multilinks
Ralf Schlatterbeck <rsc@runtux.com>
parents:
4880
diff
changeset
|
446 [ ('create',(),{'content':'t2'}) |
|
b562df8a5056
Fix form-parsing for multilinks
Ralf Schlatterbeck <rsc@runtux.com>
parents:
4880
diff
changeset
|
447 , ('create',(),{'content':'t'}) |
|
b562df8a5056
Fix form-parsing for multilinks
Ralf Schlatterbeck <rsc@runtux.com>
parents:
4880
diff
changeset
|
448 , ('set',('4711',), {'messages':['23','42','17','18']}) |
|
b562df8a5056
Fix form-parsing for multilinks
Ralf Schlatterbeck <rsc@runtux.com>
parents:
4880
diff
changeset
|
449 ] |
|
b562df8a5056
Fix form-parsing for multilinks
Ralf Schlatterbeck <rsc@runtux.com>
parents:
4880
diff
changeset
|
450 self.client.db.classes.get = lambda a, b:['23','42'] |
|
b562df8a5056
Fix form-parsing for multilinks
Ralf Schlatterbeck <rsc@runtux.com>
parents:
4880
diff
changeset
|
451 self.client.parsePropsFromForm = lambda: \ |
|
b562df8a5056
Fix form-parsing for multilinks
Ralf Schlatterbeck <rsc@runtux.com>
parents:
4880
diff
changeset
|
452 ( {('msg','-1'):{'content':'t'},('msg','-2'):{'content':'t2'} |
|
b562df8a5056
Fix form-parsing for multilinks
Ralf Schlatterbeck <rsc@runtux.com>
parents:
4880
diff
changeset
|
453 , ('issue','4711'):{}} |
|
b562df8a5056
Fix form-parsing for multilinks
Ralf Schlatterbeck <rsc@runtux.com>
parents:
4880
diff
changeset
|
454 , [('issue','4711','messages',[('msg','-1'),('msg','-2')])] |
|
b562df8a5056
Fix form-parsing for multilinks
Ralf Schlatterbeck <rsc@runtux.com>
parents:
4880
diff
changeset
|
455 ) |
|
b562df8a5056
Fix form-parsing for multilinks
Ralf Schlatterbeck <rsc@runtux.com>
parents:
4880
diff
changeset
|
456 try : |
|
b562df8a5056
Fix form-parsing for multilinks
Ralf Schlatterbeck <rsc@runtux.com>
parents:
4880
diff
changeset
|
457 self.action.handle() |
|
5248
198b6e810c67
Use Python-3-compatible 'as' syntax for except statements
Eric S. Raymond <esr@thyrsus.com>
parents:
5164
diff
changeset
|
458 except Redirect as msg: |
|
4992
b562df8a5056
Fix form-parsing for multilinks
Ralf Schlatterbeck <rsc@runtux.com>
parents:
4880
diff
changeset
|
459 pass |
|
5505
2ce41b8dffaf
compared sorted lists as order can be random
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5503
diff
changeset
|
460 self.assertEqual(sorted(expect, key=NoneAndDictComparable), |
|
2ce41b8dffaf
compared sorted lists as order can be random
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5503
diff
changeset
|
461 sorted(self.result, key=NoneAndDictComparable)) |
|
4992
b562df8a5056
Fix form-parsing for multilinks
Ralf Schlatterbeck <rsc@runtux.com>
parents:
4880
diff
changeset
|
462 |
|
3855
de4c2e538e06
Bug-Fix: File attachments from the web-interface didn't work.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3852
diff
changeset
|
463 def testFileAttach(self): |
|
de4c2e538e06
Bug-Fix: File attachments from the web-interface didn't work.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3852
diff
changeset
|
464 expect = \ |
|
de4c2e538e06
Bug-Fix: File attachments from the web-interface didn't work.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3852
diff
changeset
|
465 [('create',(),{'content':'t','type':'text/plain','name':'t.txt'}) |
|
de4c2e538e06
Bug-Fix: File attachments from the web-interface didn't work.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3852
diff
changeset
|
466 ,('set',('4711',),{'files':['23','42','17']}) |
|
de4c2e538e06
Bug-Fix: File attachments from the web-interface didn't work.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3852
diff
changeset
|
467 ] |
|
de4c2e538e06
Bug-Fix: File attachments from the web-interface didn't work.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3852
diff
changeset
|
468 self.client.db.classes.get = lambda a, b:['23','42'] |
|
de4c2e538e06
Bug-Fix: File attachments from the web-interface didn't work.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3852
diff
changeset
|
469 self.client.parsePropsFromForm = lambda: \ |
|
de4c2e538e06
Bug-Fix: File attachments from the web-interface didn't work.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3852
diff
changeset
|
470 ( {('file','-1'):{'content':'t','type':'text/plain','name':'t.txt'} |
|
de4c2e538e06
Bug-Fix: File attachments from the web-interface didn't work.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3852
diff
changeset
|
471 ,('issue','4711'):{} |
|
de4c2e538e06
Bug-Fix: File attachments from the web-interface didn't work.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3852
diff
changeset
|
472 } |
|
de4c2e538e06
Bug-Fix: File attachments from the web-interface didn't work.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3852
diff
changeset
|
473 , [('issue','4711','messages',[('msg','-1')]) |
|
de4c2e538e06
Bug-Fix: File attachments from the web-interface didn't work.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3852
diff
changeset
|
474 ,('issue','4711','files',[('file','-1')]) |
|
de4c2e538e06
Bug-Fix: File attachments from the web-interface didn't work.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3852
diff
changeset
|
475 ,('msg','-1','files',[('file','-1')]) |
|
de4c2e538e06
Bug-Fix: File attachments from the web-interface didn't work.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3852
diff
changeset
|
476 ] |
|
de4c2e538e06
Bug-Fix: File attachments from the web-interface didn't work.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3852
diff
changeset
|
477 ) |
|
de4c2e538e06
Bug-Fix: File attachments from the web-interface didn't work.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3852
diff
changeset
|
478 try : |
|
de4c2e538e06
Bug-Fix: File attachments from the web-interface didn't work.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3852
diff
changeset
|
479 self.action.handle() |
|
5248
198b6e810c67
Use Python-3-compatible 'as' syntax for except statements
Eric S. Raymond <esr@thyrsus.com>
parents:
5164
diff
changeset
|
480 except Redirect as msg: |
|
3855
de4c2e538e06
Bug-Fix: File attachments from the web-interface didn't work.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3852
diff
changeset
|
481 pass |
|
de4c2e538e06
Bug-Fix: File attachments from the web-interface didn't work.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3852
diff
changeset
|
482 self.assertEqual(expect, self.result) |
|
de4c2e538e06
Bug-Fix: File attachments from the web-interface didn't work.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3852
diff
changeset
|
483 |
|
3852
0dd05c9e5fff
New test for linking of non-existing and existing properties via a form.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3635
diff
changeset
|
484 def testLinkExisting(self): |
|
0dd05c9e5fff
New test for linking of non-existing and existing properties via a form.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3635
diff
changeset
|
485 expect = [('set',('4711',),{'messages':['23','42','1']})] |
|
0dd05c9e5fff
New test for linking of non-existing and existing properties via a form.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3635
diff
changeset
|
486 self.client.db.classes.get = lambda a, b:['23','42'] |
|
0dd05c9e5fff
New test for linking of non-existing and existing properties via a form.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3635
diff
changeset
|
487 self.client.parsePropsFromForm = lambda: \ |
|
0dd05c9e5fff
New test for linking of non-existing and existing properties via a form.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3635
diff
changeset
|
488 ( {('issue','4711'):{},('msg','1'):{}} |
|
0dd05c9e5fff
New test for linking of non-existing and existing properties via a form.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3635
diff
changeset
|
489 , [('issue','4711','messages',[('msg','1')])] |
|
0dd05c9e5fff
New test for linking of non-existing and existing properties via a form.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3635
diff
changeset
|
490 ) |
|
0dd05c9e5fff
New test for linking of non-existing and existing properties via a form.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3635
diff
changeset
|
491 try : |
|
0dd05c9e5fff
New test for linking of non-existing and existing properties via a form.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3635
diff
changeset
|
492 self.action.handle() |
|
5248
198b6e810c67
Use Python-3-compatible 'as' syntax for except statements
Eric S. Raymond <esr@thyrsus.com>
parents:
5164
diff
changeset
|
493 except Redirect as msg: |
|
3852
0dd05c9e5fff
New test for linking of non-existing and existing properties via a form.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3635
diff
changeset
|
494 pass |
|
0dd05c9e5fff
New test for linking of non-existing and existing properties via a form.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3635
diff
changeset
|
495 self.assertEqual(expect, self.result) |
|
0dd05c9e5fff
New test for linking of non-existing and existing properties via a form.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3635
diff
changeset
|
496 |
|
4304
df7a4400c2ce
Fix linking of an existing item to a newly created item...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3855
diff
changeset
|
497 def testLinkNewToExisting(self): |
|
df7a4400c2ce
Fix linking of an existing item to a newly created item...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3855
diff
changeset
|
498 expect = [('create',(),{'msg':'1','title':'TEST'})] |
|
df7a4400c2ce
Fix linking of an existing item to a newly created item...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3855
diff
changeset
|
499 self.client.db.classes.get = lambda a, b:['23','42'] |
|
df7a4400c2ce
Fix linking of an existing item to a newly created item...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3855
diff
changeset
|
500 self.client.parsePropsFromForm = lambda: \ |
|
df7a4400c2ce
Fix linking of an existing item to a newly created item...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3855
diff
changeset
|
501 ( {('issue','-1'):{'title':'TEST'},('msg','1'):{}} |
|
df7a4400c2ce
Fix linking of an existing item to a newly created item...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3855
diff
changeset
|
502 , [('issue','-1','msg',[('msg','1')])] |
|
df7a4400c2ce
Fix linking of an existing item to a newly created item...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3855
diff
changeset
|
503 ) |
|
df7a4400c2ce
Fix linking of an existing item to a newly created item...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3855
diff
changeset
|
504 try : |
|
df7a4400c2ce
Fix linking of an existing item to a newly created item...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3855
diff
changeset
|
505 self.action.handle() |
|
5248
198b6e810c67
Use Python-3-compatible 'as' syntax for except statements
Eric S. Raymond <esr@thyrsus.com>
parents:
5164
diff
changeset
|
506 except Redirect as msg: |
|
4304
df7a4400c2ce
Fix linking of an existing item to a newly created item...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3855
diff
changeset
|
507 pass |
|
df7a4400c2ce
Fix linking of an existing item to a newly created item...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3855
diff
changeset
|
508 self.assertEqual(expect, self.result) |
|
df7a4400c2ce
Fix linking of an existing item to a newly created item...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3855
diff
changeset
|
509 |
|
2930
4b5d7b4bc089
applied patch [SF#1067690];
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2515
diff
changeset
|
510 # vim: set et sts=4 sw=4 : |
