annotate test/test_actions.py @ 6681:ab2ed11c021e

issue2551205: Add support for specifying valid origins for api: xmlrpc/rest We now have an allow list to filter the hosts allowed to do api requests. An element of this allow list must match the http ORIGIN header exactly or the rest/xmlrpc CORS request will result in an error. The tracker host is always allowed to do a request.
author John Rouillard <rouilj@ieee.org>
date Tue, 17 May 2022 17:18:51 -0400
parents 8269e89530e5
children 9ca5cbffa0c4
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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
6303
2ded9a8be017 Test :lastactivity special variable for lastUserActivity()
John Rouillard <rouilj@ieee.org>
parents: 6301
diff changeset
2 import unittest, copy
2515
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
6366
f2c31f5ec50b Move mocknull from test to roundup/test
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6310
diff changeset
16 from roundup.test.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 = []
6301
45ba6b71f1cf actions.py translation. Using mapping rather than tuple for args.
John Rouillard <rouilj@ieee.org>
parents: 6196
diff changeset
32 self.client.add_error_message = lambda x, escape=True: add_message(
45ba6b71f1cf actions.py translation. Using mapping rather than tuple for args.
John Rouillard <rouilj@ieee.org>
parents: 6196
diff changeset
33 self.client._error_message, x, escape=escape)
4880
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
6602
8269e89530e5 Test bad number path for ShowAction action.
John Rouillard <rouilj@ieee.org>
parents: 6468
diff changeset
85 def testShowActionBadNumber(self):
8269e89530e5 Test bad number path for ShowAction action.
John Rouillard <rouilj@ieee.org>
parents: 6468
diff changeset
86 action = ShowAction(self.client)
8269e89530e5 Test bad number path for ShowAction action.
John Rouillard <rouilj@ieee.org>
parents: 6468
diff changeset
87 self.assertRaises(ValueError, action.handle)
8269e89530e5 Test bad number path for ShowAction action.
John Rouillard <rouilj@ieee.org>
parents: 6468
diff changeset
88 self.form.value.append(MiniFieldStorage('@number', 'A'))
8269e89530e5 Test bad number path for ShowAction action.
John Rouillard <rouilj@ieee.org>
parents: 6468
diff changeset
89 self.form.value.append(MiniFieldStorage('@type', 'issue'))
8269e89530e5 Test bad number path for ShowAction action.
John Rouillard <rouilj@ieee.org>
parents: 6468
diff changeset
90 with self.assertRaises(SeriousError) as ctx:
8269e89530e5 Test bad number path for ShowAction action.
John Rouillard <rouilj@ieee.org>
parents: 6468
diff changeset
91 action.handle()
8269e89530e5 Test bad number path for ShowAction action.
John Rouillard <rouilj@ieee.org>
parents: 6468
diff changeset
92 self.assertEqual('"A" is not an ID (issue ID required)',
8269e89530e5 Test bad number path for ShowAction action.
John Rouillard <rouilj@ieee.org>
parents: 6468
diff changeset
93 ctx.exception.args[0])
8269e89530e5 Test bad number path for ShowAction action.
John Rouillard <rouilj@ieee.org>
parents: 6468
diff changeset
94
2515
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
95 class RetireActionTestCase(ActionTestCase):
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
96 def testRetireAction(self):
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
97 self.client.db.security.hasPermission = true
4880
ca692423e401 Different approach to fix XSS in issue2550817
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4742
diff changeset
98 self.client._ok_message = []
2515
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
99 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
100 self.assertTrue(len(self.client._ok_message) == 1)
6196
56854f96d805 Cover a couple of more paths in Retire and Restore.
John Rouillard <rouilj@ieee.org>
parents: 5789
diff changeset
101 self.assertTrue(not self.client.nodeid == None)
56854f96d805 Cover a couple of more paths in Retire and Restore.
John Rouillard <rouilj@ieee.org>
parents: 5789
diff changeset
102
56854f96d805 Cover a couple of more paths in Retire and Restore.
John Rouillard <rouilj@ieee.org>
parents: 5789
diff changeset
103 self.client.template = 'index'
56854f96d805 Cover a couple of more paths in Retire and Restore.
John Rouillard <rouilj@ieee.org>
parents: 5789
diff changeset
104 self.client._ok_message = []
56854f96d805 Cover a couple of more paths in Retire and Restore.
John Rouillard <rouilj@ieee.org>
parents: 5789
diff changeset
105 RetireAction(self.client).handle()
56854f96d805 Cover a couple of more paths in Retire and Restore.
John Rouillard <rouilj@ieee.org>
parents: 5789
diff changeset
106 self.assertTrue(len(self.client._ok_message) == 1)
56854f96d805 Cover a couple of more paths in Retire and Restore.
John Rouillard <rouilj@ieee.org>
parents: 5789
diff changeset
107 self.assertTrue(self.client.nodeid == None)
56854f96d805 Cover a couple of more paths in Retire and Restore.
John Rouillard <rouilj@ieee.org>
parents: 5789
diff changeset
108
56854f96d805 Cover a couple of more paths in Retire and Restore.
John Rouillard <rouilj@ieee.org>
parents: 5789
diff changeset
109 self.client.env={}
56854f96d805 Cover a couple of more paths in Retire and Restore.
John Rouillard <rouilj@ieee.org>
parents: 5789
diff changeset
110 self.client.env['REQUEST_METHOD'] = 'GET'
56854f96d805 Cover a couple of more paths in Retire and Restore.
John Rouillard <rouilj@ieee.org>
parents: 5789
diff changeset
111 self.client._ok_message = []
56854f96d805 Cover a couple of more paths in Retire and Restore.
John Rouillard <rouilj@ieee.org>
parents: 5789
diff changeset
112 self.assertRaises(Reject, RetireAction(self.client).execute)
56854f96d805 Cover a couple of more paths in Retire and Restore.
John Rouillard <rouilj@ieee.org>
parents: 5789
diff changeset
113
2515
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
114
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
115 def testNoPermission(self):
6196
56854f96d805 Cover a couple of more paths in Retire and Restore.
John Rouillard <rouilj@ieee.org>
parents: 5789
diff changeset
116 self.client.classname='user'
2515
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
117 self.assertRaises(Unauthorised, RetireAction(self.client).execute)
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
118
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
119 def testDontRetireAdminOrAnonymous(self):
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
120 self.client.db.security.hasPermission=true
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
121 # look up the user class
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
122 self.client.classname = 'user'
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
123 # but always look up admin, regardless of nodeid
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
124 self.client.db.user.get = lambda a,b: 'admin'
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
125 self.assertRaises(ValueError, RetireAction(self.client).handle)
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
126 # .. or anonymous
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
127 self.client.db.user.get = lambda a,b: 'anonymous'
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
128 self.assertRaises(ValueError, RetireAction(self.client).handle)
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
129
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
130 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
131 # 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
132 # 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
133 # 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
134 # 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
135 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
136 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
137 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
138 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
139 self.assertTrue(len(self.client._ok_message) == 1)
6196
56854f96d805 Cover a couple of more paths in Retire and Restore.
John Rouillard <rouilj@ieee.org>
parents: 5789
diff changeset
140 self.assertTrue(not self.client.nodeid == None)
56854f96d805 Cover a couple of more paths in Retire and Restore.
John Rouillard <rouilj@ieee.org>
parents: 5789
diff changeset
141
56854f96d805 Cover a couple of more paths in Retire and Restore.
John Rouillard <rouilj@ieee.org>
parents: 5789
diff changeset
142 self.client.template = 'index'
56854f96d805 Cover a couple of more paths in Retire and Restore.
John Rouillard <rouilj@ieee.org>
parents: 5789
diff changeset
143 self.client._ok_message = []
56854f96d805 Cover a couple of more paths in Retire and Restore.
John Rouillard <rouilj@ieee.org>
parents: 5789
diff changeset
144 RestoreAction(self.client).handle()
56854f96d805 Cover a couple of more paths in Retire and Restore.
John Rouillard <rouilj@ieee.org>
parents: 5789
diff changeset
145 self.assertTrue(len(self.client._ok_message) == 1)
56854f96d805 Cover a couple of more paths in Retire and Restore.
John Rouillard <rouilj@ieee.org>
parents: 5789
diff changeset
146 self.assertTrue(self.client.nodeid == None)
56854f96d805 Cover a couple of more paths in Retire and Restore.
John Rouillard <rouilj@ieee.org>
parents: 5789
diff changeset
147
56854f96d805 Cover a couple of more paths in Retire and Restore.
John Rouillard <rouilj@ieee.org>
parents: 5789
diff changeset
148 self.client.env={}
56854f96d805 Cover a couple of more paths in Retire and Restore.
John Rouillard <rouilj@ieee.org>
parents: 5789
diff changeset
149 self.client.env['REQUEST_METHOD'] = 'GET'
56854f96d805 Cover a couple of more paths in Retire and Restore.
John Rouillard <rouilj@ieee.org>
parents: 5789
diff changeset
150 self.client._ok_message = []
56854f96d805 Cover a couple of more paths in Retire and Restore.
John Rouillard <rouilj@ieee.org>
parents: 5789
diff changeset
151 self.assertRaises(Reject, RestoreAction(self.client).execute)
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
152
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
153 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
154 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
155
2515
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
156 class SearchActionTestCase(ActionTestCase):
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
157 def setUp(self):
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
158 ActionTestCase.setUp(self)
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
159 self.action = SearchAction(self.client)
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 class StandardSearchActionTestCase(SearchActionTestCase):
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
162 def testNoPermission(self):
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
163 self.assertRaises(Unauthorised, self.action.execute)
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 testQueryName(self):
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
166 self.assertEqual(self.action.getQueryName(), '')
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.form.value.append(MiniFieldStorage('@queryname', 'foo'))
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
169 self.assertEqual(self.action.getQueryName(), 'foo')
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
170
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
171 class FakeFilterVarsTestCase(SearchActionTestCase):
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
172 def setUp(self):
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
173 SearchActionTestCase.setUp(self)
3635
53987aa153d2 Transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3188
diff changeset
174 self.client.db.classes.get_transitive_prop = lambda x: \
53987aa153d2 Transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3188
diff changeset
175 hyperdb.Multilink('foo')
2515
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
176
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
177 def assertFilterEquals(self, expected):
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
178 self.action.fakeFilterVars()
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
179 self.assertEqual(self.form.getvalue('@filter'), expected)
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
180
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
181 def testEmptyMultilink(self):
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
182 self.form.value.append(MiniFieldStorage('foo', ''))
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
183 self.form.value.append(MiniFieldStorage('foo', ''))
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
184
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
185 self.assertFilterEquals(None)
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
186
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
187 def testNonEmptyMultilink(self):
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
188 self.form.value.append(MiniFieldStorage('foo', ''))
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
189 self.form.value.append(MiniFieldStorage('foo', '1'))
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
190
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
191 self.assertFilterEquals('foo')
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
192
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
193 def testEmptyKey(self):
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
194 self.form.value.append(MiniFieldStorage('foo', ''))
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
195 self.assertFilterEquals(None)
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
196
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
197 def testStandardKey(self):
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
198 self.form.value.append(MiniFieldStorage('foo', '1'))
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
199 self.assertFilterEquals('foo')
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
200
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
201 def testStringKey(self):
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
202 self.client.db.classes.getprops = lambda: {'foo': hyperdb.String()}
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
203 self.form.value.append(MiniFieldStorage('foo', 'hello'))
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
204 self.assertFilterEquals('foo')
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
205
5097
156cbc1d182c Validate values for Integer and Numeric type filter parameters rather than
John Rouillard <rouilj@ieee.org>
parents: 5037
diff changeset
206 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
207 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
208 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
209 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
210 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
211 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
212 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
213
156cbc1d182c Validate values for Integer and Numeric type filter parameters rather than
John Rouillard <rouilj@ieee.org>
parents: 5037
diff changeset
214 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
215 "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
216 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
217 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
218 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
219
156cbc1d182c Validate values for Integer and Numeric type filter parameters rather than
John Rouillard <rouilj@ieee.org>
parents: 5037
diff changeset
220 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
221 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
222 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
223 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
224 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
225 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
226 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
227
156cbc1d182c Validate values for Integer and Numeric type filter parameters rather than
John Rouillard <rouilj@ieee.org>
parents: 5037
diff changeset
228 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
229 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
230 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
231 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
232 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
233
2515
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
234 def testTokenizedStringKey(self):
3635
53987aa153d2 Transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3188
diff changeset
235 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
236 self.form.value.append(MiniFieldStorage('foo', 'hello world'))
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 self.assertFilterEquals('foo')
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
239
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
240 # 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
241 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
242 ['hello', 'world'])
2515
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
243
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
244 class CollisionDetectionTestCase(ActionTestCase):
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
245 def setUp(self):
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
246 ActionTestCase.setUp(self)
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
247 self.action = EditItemAction(self.client)
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
248 self.now = Date('.')
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
249 # round off for testing
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
250 self.now.second = int(self.now.second)
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
251
6310
68d83479747b Fix testing of :lastactivity
John Rouillard <rouilj@ieee.org>
parents: 6303
diff changeset
252 def testLastUserActivityAt(self):
2515
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
253 self.assertEqual(self.action.lastUserActivity(), None)
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
254
6303
2ded9a8be017 Test :lastactivity special variable for lastUserActivity()
John Rouillard <rouilj@ieee.org>
parents: 6301
diff changeset
255 # test @ special variable form
2930
4b5d7b4bc089 applied patch [SF#1067690];
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2515
diff changeset
256 self.client.form.value.append(
4b5d7b4bc089 applied patch [SF#1067690];
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2515
diff changeset
257 MiniFieldStorage('@lastactivity', str(self.now)))
2515
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
258 self.assertEqual(self.action.lastUserActivity(), self.now)
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
259
6310
68d83479747b Fix testing of :lastactivity
John Rouillard <rouilj@ieee.org>
parents: 6303
diff changeset
260 def testLastUserActivityColon(self):
68d83479747b Fix testing of :lastactivity
John Rouillard <rouilj@ieee.org>
parents: 6303
diff changeset
261 self.assertEqual(self.action.lastUserActivity(), None)
68d83479747b Fix testing of :lastactivity
John Rouillard <rouilj@ieee.org>
parents: 6303
diff changeset
262
6303
2ded9a8be017 Test :lastactivity special variable for lastUserActivity()
John Rouillard <rouilj@ieee.org>
parents: 6301
diff changeset
263 # test : special variable form
2ded9a8be017 Test :lastactivity special variable for lastUserActivity()
John Rouillard <rouilj@ieee.org>
parents: 6301
diff changeset
264 self.client.form.value.append(
2ded9a8be017 Test :lastactivity special variable for lastUserActivity()
John Rouillard <rouilj@ieee.org>
parents: 6301
diff changeset
265 MiniFieldStorage(':lastactivity', str(self.now)))
2ded9a8be017 Test :lastactivity special variable for lastUserActivity()
John Rouillard <rouilj@ieee.org>
parents: 6301
diff changeset
266 self.assertEqual(self.action.lastUserActivity(), self.now)
2ded9a8be017 Test :lastactivity special variable for lastUserActivity()
John Rouillard <rouilj@ieee.org>
parents: 6301
diff changeset
267
2515
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
268 def testLastNodeActivity(self):
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
269 self.action.classname = 'issue'
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
270 self.action.nodeid = '1'
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
271
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
272 def get(nodeid, propname):
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
273 self.assertEqual(nodeid, '1')
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
274 self.assertEqual(propname, 'activity')
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
275 return self.now
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
276 self.client.db.issue.get = get
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
277
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
278 self.assertEqual(self.action.lastNodeActivity(), self.now)
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
279
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
280 def testCollision(self):
3188
7faae85e1e33 merge from branch
Richard Jones <richard@users.sourceforge.net>
parents: 3018
diff changeset
281 # fake up an actual change
7faae85e1e33 merge from branch
Richard Jones <richard@users.sourceforge.net>
parents: 3018
diff changeset
282 self.action.classname = 'test'
7faae85e1e33 merge from branch
Richard Jones <richard@users.sourceforge.net>
parents: 3018
diff changeset
283 self.action.nodeid = '1'
6301
45ba6b71f1cf actions.py translation. Using mapping rather than tuple for args.
John Rouillard <rouilj@ieee.org>
parents: 6196
diff changeset
284 self.client.parsePropsFromForm = lambda: (
45ba6b71f1cf actions.py translation. Using mapping rather than tuple for args.
John Rouillard <rouilj@ieee.org>
parents: 6196
diff changeset
285 {('test','1'):{"prop1":"1"}}, [])
45ba6b71f1cf actions.py translation. Using mapping rather than tuple for args.
John Rouillard <rouilj@ieee.org>
parents: 6196
diff changeset
286 props = self.action.detectCollision(self.now,
45ba6b71f1cf actions.py translation. Using mapping rather than tuple for args.
John Rouillard <rouilj@ieee.org>
parents: 6196
diff changeset
287 self.now + Interval("1d"))
45ba6b71f1cf actions.py translation. Using mapping rather than tuple for args.
John Rouillard <rouilj@ieee.org>
parents: 6196
diff changeset
288 self.assertTrue(props)
45ba6b71f1cf actions.py translation. Using mapping rather than tuple for args.
John Rouillard <rouilj@ieee.org>
parents: 6196
diff changeset
289 self.action.handleCollision(props)
45ba6b71f1cf actions.py translation. Using mapping rather than tuple for args.
John Rouillard <rouilj@ieee.org>
parents: 6196
diff changeset
290 self.assertEqual(self.client._error_message[0],
45ba6b71f1cf actions.py translation. Using mapping rather than tuple for args.
John Rouillard <rouilj@ieee.org>
parents: 6196
diff changeset
291 'Edit Error: someone else has edited this test '
45ba6b71f1cf actions.py translation. Using mapping rather than tuple for args.
John Rouillard <rouilj@ieee.org>
parents: 6196
diff changeset
292 '(prop1). View <a target="_blank" href="test1">their '
45ba6b71f1cf actions.py translation. Using mapping rather than tuple for args.
John Rouillard <rouilj@ieee.org>
parents: 6196
diff changeset
293 'changes</a> in a new window.')
5789
8ef8aa3d485c assertFalse not assertFail...
John Rouillard <rouilj@ieee.org>
parents: 5787
diff changeset
294 self.assertFalse(self.action.detectCollision(self.now,
3188
7faae85e1e33 merge from branch
Richard Jones <richard@users.sourceforge.net>
parents: 3018
diff changeset
295 self.now - Interval("1d")))
5789
8ef8aa3d485c assertFalse not assertFail...
John Rouillard <rouilj@ieee.org>
parents: 5787
diff changeset
296 self.assertFalse(self.action.detectCollision(None, self.now))
2515
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
297
2930
4b5d7b4bc089 applied patch [SF#1067690];
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2515
diff changeset
298 class LoginTestCase(ActionTestCase):
4b5d7b4bc089 applied patch [SF#1067690];
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2515
diff changeset
299 def setUp(self):
4b5d7b4bc089 applied patch [SF#1067690];
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2515
diff changeset
300 ActionTestCase.setUp(self)
4880
ca692423e401 Different approach to fix XSS in issue2550817
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4742
diff changeset
301 self.client._error_message = []
2930
4b5d7b4bc089 applied patch [SF#1067690];
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2515
diff changeset
302
4b5d7b4bc089 applied patch [SF#1067690];
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2515
diff changeset
303 # set the db password to 'right'
4b5d7b4bc089 applied patch [SF#1067690];
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2515
diff changeset
304 self.client.db.user.get = lambda a,b: 'right'
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 # unless explicitly overridden, we should never get here
4b5d7b4bc089 applied patch [SF#1067690];
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2515
diff changeset
307 self.client.opendb = lambda a: self.fail(
4b5d7b4bc089 applied patch [SF#1067690];
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2515
diff changeset
308 "Logged in, but we shouldn't be.")
4b5d7b4bc089 applied patch [SF#1067690];
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2515
diff changeset
309
5121
894aa07be6cb issue2550785: Using login from search (or logout) fails. when
John Rouillard <rouilj@ieee.org>
parents: 5119
diff changeset
310 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
311 **kwargs):
894aa07be6cb issue2550785: Using login from search (or logout) fails. when
John Rouillard <rouilj@ieee.org>
parents: 5119
diff changeset
312 """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
313 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
314 redirecting.
894aa07be6cb issue2550785: Using login from search (or logout) fails. when
John Rouillard <rouilj@ieee.org>
parents: 5119
diff changeset
315 """
894aa07be6cb issue2550785: Using login from search (or logout) fails. when
John Rouillard <rouilj@ieee.org>
parents: 5119
diff changeset
316 try:
894aa07be6cb issue2550785: Using login from search (or logout) fails. when
John Rouillard <rouilj@ieee.org>
parents: 5119
diff changeset
317 callable(*args, **kwargs)
5248
198b6e810c67 Use Python-3-compatible 'as' syntax for except statements
Eric S. Raymond <esr@thyrsus.com>
parents: 5164
diff changeset
318 except exception as msg:
5121
894aa07be6cb issue2550785: Using login from search (or logout) fails. when
John Rouillard <rouilj@ieee.org>
parents: 5119
diff changeset
319 self.assertEqual(str(msg), message)
894aa07be6cb issue2550785: Using login from search (or logout) fails. when
John Rouillard <rouilj@ieee.org>
parents: 5119
diff changeset
320 else:
894aa07be6cb issue2550785: Using login from search (or logout) fails. when
John Rouillard <rouilj@ieee.org>
parents: 5119
diff changeset
321 if hasattr(exception, '__name__'):
894aa07be6cb issue2550785: Using login from search (or logout) fails. when
John Rouillard <rouilj@ieee.org>
parents: 5119
diff changeset
322 excName = exception.__name__
894aa07be6cb issue2550785: Using login from search (or logout) fails. when
John Rouillard <rouilj@ieee.org>
parents: 5119
diff changeset
323 else:
894aa07be6cb issue2550785: Using login from search (or logout) fails. when
John Rouillard <rouilj@ieee.org>
parents: 5119
diff changeset
324 excName = str(exception)
5378
35ea9b1efc14 Python 3 preparation: "raise" syntax.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5376
diff changeset
325 raise self.failureException(excName)
5121
894aa07be6cb issue2550785: Using login from search (or logout) fails. when
John Rouillard <rouilj@ieee.org>
parents: 5119
diff changeset
326
2930
4b5d7b4bc089 applied patch [SF#1067690];
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2515
diff changeset
327 def assertLoginLeavesMessages(self, messages, username=None, password=None):
4b5d7b4bc089 applied patch [SF#1067690];
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2515
diff changeset
328 if username is not None:
4b5d7b4bc089 applied patch [SF#1067690];
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2515
diff changeset
329 self.form.value.append(MiniFieldStorage('__login_name', username))
4b5d7b4bc089 applied patch [SF#1067690];
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2515
diff changeset
330 if password is not None:
4b5d7b4bc089 applied patch [SF#1067690];
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2515
diff changeset
331 self.form.value.append(
4b5d7b4bc089 applied patch [SF#1067690];
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2515
diff changeset
332 MiniFieldStorage('__login_password', password))
4b5d7b4bc089 applied patch [SF#1067690];
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2515
diff changeset
333
4b5d7b4bc089 applied patch [SF#1067690];
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2515
diff changeset
334 LoginAction(self.client).handle()
4880
ca692423e401 Different approach to fix XSS in issue2550817
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4742
diff changeset
335 self.assertEqual(self.client._error_message, messages)
2930
4b5d7b4bc089 applied patch [SF#1067690];
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2515
diff changeset
336
5121
894aa07be6cb issue2550785: Using login from search (or logout) fails. when
John Rouillard <rouilj@ieee.org>
parents: 5119
diff changeset
337 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
338 if username is not None:
894aa07be6cb issue2550785: Using login from search (or logout) fails. when
John Rouillard <rouilj@ieee.org>
parents: 5119
diff changeset
339 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
340 if password is not None:
894aa07be6cb issue2550785: Using login from search (or logout) fails. when
John Rouillard <rouilj@ieee.org>
parents: 5119
diff changeset
341 self.form.value.append(
894aa07be6cb issue2550785: Using login from search (or logout) fails. when
John Rouillard <rouilj@ieee.org>
parents: 5119
diff changeset
342 MiniFieldStorage('__login_password', password))
894aa07be6cb issue2550785: Using login from search (or logout) fails. when
John Rouillard <rouilj@ieee.org>
parents: 5119
diff changeset
343 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
344 self.form.value.append(
894aa07be6cb issue2550785: Using login from search (or logout) fails. when
John Rouillard <rouilj@ieee.org>
parents: 5119
diff changeset
345 MiniFieldStorage('__came_from', came_from))
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 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
348
2930
4b5d7b4bc089 applied patch [SF#1067690];
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2515
diff changeset
349 def testNoUsername(self):
4b5d7b4bc089 applied patch [SF#1067690];
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2515
diff changeset
350 self.assertLoginLeavesMessages(['Username required'])
4b5d7b4bc089 applied patch [SF#1067690];
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2515
diff changeset
351
4b5d7b4bc089 applied patch [SF#1067690];
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2515
diff changeset
352 def testInvalidUsername(self):
4b5d7b4bc089 applied patch [SF#1067690];
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2515
diff changeset
353 def raiseKeyError(a):
4b5d7b4bc089 applied patch [SF#1067690];
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2515
diff changeset
354 raise KeyError
4b5d7b4bc089 applied patch [SF#1067690];
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2515
diff changeset
355 self.client.db.user.lookup = raiseKeyError
4b5d7b4bc089 applied patch [SF#1067690];
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2515
diff changeset
356 self.assertLoginLeavesMessages(['Invalid login'], 'foo')
4b5d7b4bc089 applied patch [SF#1067690];
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2515
diff changeset
357
4b5d7b4bc089 applied patch [SF#1067690];
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2515
diff changeset
358 def testInvalidPassword(self):
4b5d7b4bc089 applied patch [SF#1067690];
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2515
diff changeset
359 self.assertLoginLeavesMessages(['Invalid login'], 'foo', 'wrong')
4b5d7b4bc089 applied patch [SF#1067690];
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2515
diff changeset
360
4b5d7b4bc089 applied patch [SF#1067690];
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2515
diff changeset
361 def testNoWebAccess(self):
4b5d7b4bc089 applied patch [SF#1067690];
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2515
diff changeset
362 self.assertLoginLeavesMessages(['You do not have permission to login'],
4b5d7b4bc089 applied patch [SF#1067690];
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2515
diff changeset
363 'foo', 'right')
4b5d7b4bc089 applied patch [SF#1067690];
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2515
diff changeset
364
4b5d7b4bc089 applied patch [SF#1067690];
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2515
diff changeset
365 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
366 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
367
4b5d7b4bc089 applied patch [SF#1067690];
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2515
diff changeset
368 def opendb(username):
4b5d7b4bc089 applied patch [SF#1067690];
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2515
diff changeset
369 self.assertEqual(username, 'foo')
4b5d7b4bc089 applied patch [SF#1067690];
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2515
diff changeset
370 self.client.opendb = opendb
4b5d7b4bc089 applied patch [SF#1067690];
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2515
diff changeset
371
4b5d7b4bc089 applied patch [SF#1067690];
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2515
diff changeset
372 self.assertLoginLeavesMessages([], 'foo', 'right')
4b5d7b4bc089 applied patch [SF#1067690];
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2515
diff changeset
373
5121
894aa07be6cb issue2550785: Using login from search (or logout) fails. when
John Rouillard <rouilj@ieee.org>
parents: 5119
diff changeset
374 def testCorrectLoginRedirect(self):
894aa07be6cb issue2550785: Using login from search (or logout) fails. when
John Rouillard <rouilj@ieee.org>
parents: 5119
diff changeset
375 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
376 def opendb(username):
894aa07be6cb issue2550785: Using login from search (or logout) fails. when
John Rouillard <rouilj@ieee.org>
parents: 5119
diff changeset
377 self.assertEqual(username, 'foo')
894aa07be6cb issue2550785: Using login from search (or logout) fails. when
John Rouillard <rouilj@ieee.org>
parents: 5119
diff changeset
378 self.client.opendb = opendb
894aa07be6cb issue2550785: Using login from search (or logout) fails. when
John Rouillard <rouilj@ieee.org>
parents: 5119
diff changeset
379
894aa07be6cb issue2550785: Using login from search (or logout) fails. when
John Rouillard <rouilj@ieee.org>
parents: 5119
diff changeset
380 # basic test with query
6468
37b57da3374f issue2550917 - Add a: "Welcome user, you have logged in" ok_message on login.
aburke
parents: 6366
diff changeset
381 self.assertLoginRaisesRedirect("http://whoami.com/path/issue?%40action=search&%40ok_message=Welcome+foo%21",
5121
894aa07be6cb issue2550785: Using login from search (or logout) fails. when
John Rouillard <rouilj@ieee.org>
parents: 5119
diff changeset
382 '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
383
894aa07be6cb issue2550785: Using login from search (or logout) fails. when
John Rouillard <rouilj@ieee.org>
parents: 5119
diff changeset
384 # 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
385 self.form.value[:] = [] # clear out last test's setup values
6468
37b57da3374f issue2550917 - Add a: "Welcome user, you have logged in" ok_message on login.
aburke
parents: 6366
diff changeset
386 self.assertLoginRaisesRedirect("http://whoami.com/path/issue?%40action=search&%40ok_message=Welcome+foo%21",
5121
894aa07be6cb issue2550785: Using login from search (or logout) fails. when
John Rouillard <rouilj@ieee.org>
parents: 5119
diff changeset
387 '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
388
894aa07be6cb issue2550785: Using login from search (or logout) fails. when
John Rouillard <rouilj@ieee.org>
parents: 5119
diff changeset
389 # 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
390 self.form.value[:] = [] # clear out last test's setup values
6468
37b57da3374f issue2550917 - Add a: "Welcome user, you have logged in" ok_message on login.
aburke
parents: 6366
diff changeset
391 self.assertLoginRaisesRedirect("http://whoami.com/path/issue255?%40ok_message=Welcome+foo%21",
5121
894aa07be6cb issue2550785: Using login from search (or logout) fails. when
John Rouillard <rouilj@ieee.org>
parents: 5119
diff changeset
392 '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
393
894aa07be6cb issue2550785: Using login from search (or logout) fails. when
John Rouillard <rouilj@ieee.org>
parents: 5119
diff changeset
394 # 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
395 self.form.value[:] = [] # clear out last test's setup values
6468
37b57da3374f issue2550917 - Add a: "Welcome user, you have logged in" ok_message on login.
aburke
parents: 6366
diff changeset
396 self.assertLoginRaisesRedirect("http://whoami.com/path/issue39?%40ok_message=Welcome+foo%21&%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
397 '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
398
894aa07be6cb issue2550785: Using login from search (or logout) fails. when
John Rouillard <rouilj@ieee.org>
parents: 5119
diff changeset
399 def testInvalidLoginRedirect(self):
894aa07be6cb issue2550785: Using login from search (or logout) fails. when
John Rouillard <rouilj@ieee.org>
parents: 5119
diff changeset
400 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
401
894aa07be6cb issue2550785: Using login from search (or logout) fails. when
John Rouillard <rouilj@ieee.org>
parents: 5119
diff changeset
402 def opendb(username):
894aa07be6cb issue2550785: Using login from search (or logout) fails. when
John Rouillard <rouilj@ieee.org>
parents: 5119
diff changeset
403 self.assertEqual(username, 'foo')
894aa07be6cb issue2550785: Using login from search (or logout) fails. when
John Rouillard <rouilj@ieee.org>
parents: 5119
diff changeset
404 self.client.opendb = opendb
894aa07be6cb issue2550785: Using login from search (or logout) fails. when
John Rouillard <rouilj@ieee.org>
parents: 5119
diff changeset
405
894aa07be6cb issue2550785: Using login from search (or logout) fails. when
John Rouillard <rouilj@ieee.org>
parents: 5119
diff changeset
406 # basic test with query
5503
4f6e1ce89557 always encode query parameters in sorted order
Christof Meerwald <cmeerw@cmeerw.org>
parents: 5388
diff changeset
407 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
408 '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
409
894aa07be6cb issue2550785: Using login from search (or logout) fails. when
John Rouillard <rouilj@ieee.org>
parents: 5119
diff changeset
410 # 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
411 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
412 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
413 '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
414
894aa07be6cb issue2550785: Using login from search (or logout) fails. when
John Rouillard <rouilj@ieee.org>
parents: 5119
diff changeset
415 # 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
416 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
417 # 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
418 # 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
419 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
420
894aa07be6cb issue2550785: Using login from search (or logout) fails. when
John Rouillard <rouilj@ieee.org>
parents: 5119
diff changeset
421 # 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
422 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
423 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
424 '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
425
5717
cad18de2b988 issue2550949: Rate limit password guesses/login attempts.
John Rouillard <rouilj@ieee.org>
parents: 5649
diff changeset
426 def testLoginRateLimit(self):
cad18de2b988 issue2550949: Rate limit password guesses/login attempts.
John Rouillard <rouilj@ieee.org>
parents: 5649
diff changeset
427 ''' 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
428 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
429 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
430 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
431 '''
cad18de2b988 issue2550949: Rate limit password guesses/login attempts.
John Rouillard <rouilj@ieee.org>
parents: 5649
diff changeset
432 # 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
433 self.assertLoginLeavesMessages(['Invalid login'], 'nouser')
cad18de2b988 issue2550949: Rate limit password guesses/login attempts.
John Rouillard <rouilj@ieee.org>
parents: 5649
diff changeset
434 # 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
435 for i in range(19):
cad18de2b988 issue2550949: Rate limit password guesses/login attempts.
John Rouillard <rouilj@ieee.org>
parents: 5649
diff changeset
436 self.client._error_message = []
cad18de2b988 issue2550949: Rate limit password guesses/login attempts.
John Rouillard <rouilj@ieee.org>
parents: 5649
diff changeset
437 self.assertLoginLeavesMessages(['Invalid login'])
cad18de2b988 issue2550949: Rate limit password guesses/login attempts.
John Rouillard <rouilj@ieee.org>
parents: 5649
diff changeset
438
cad18de2b988 issue2550949: Rate limit password guesses/login attempts.
John Rouillard <rouilj@ieee.org>
parents: 5649
diff changeset
439 self.assertRaisesMessage(Reject, LoginAction(self.client).handle,
cad18de2b988 issue2550949: Rate limit password guesses/login attempts.
John Rouillard <rouilj@ieee.org>
parents: 5649
diff changeset
440 '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
441
cad18de2b988 issue2550949: Rate limit password guesses/login attempts.
John Rouillard <rouilj@ieee.org>
parents: 5649
diff changeset
442 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
443 self.client._error_message = []
cad18de2b988 issue2550949: Rate limit password guesses/login attempts.
John Rouillard <rouilj@ieee.org>
parents: 5649
diff changeset
444 self.assertLoginLeavesMessages(['Invalid login']) # this is expected
cad18de2b988 issue2550949: Rate limit password guesses/login attempts.
John Rouillard <rouilj@ieee.org>
parents: 5649
diff changeset
445
cad18de2b988 issue2550949: Rate limit password guesses/login attempts.
John Rouillard <rouilj@ieee.org>
parents: 5649
diff changeset
446 # 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
447 self.assertRaisesMessage(Reject, LoginAction(self.client).handle,
cad18de2b988 issue2550949: Rate limit password guesses/login attempts.
John Rouillard <rouilj@ieee.org>
parents: 5649
diff changeset
448 '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
449
5772
8dbe307bdb57 Finish up login rate limit code. Set config item to 0 disables, make
John Rouillard <rouilj@ieee.org>
parents: 5718
diff changeset
450 def testLoginRateLimitOff(self):
8dbe307bdb57 Finish up login rate limit code. Set config item to 0 disables, make
John Rouillard <rouilj@ieee.org>
parents: 5718
diff changeset
451 ''' Set number of logins to 0 per minute. Verify that
8dbe307bdb57 Finish up login rate limit code. Set config item to 0 disables, make
John Rouillard <rouilj@ieee.org>
parents: 5718
diff changeset
452 we can do 1000 which for manual login might as well be off.
8dbe307bdb57 Finish up login rate limit code. Set config item to 0 disables, make
John Rouillard <rouilj@ieee.org>
parents: 5718
diff changeset
453 '''
8dbe307bdb57 Finish up login rate limit code. Set config item to 0 disables, make
John Rouillard <rouilj@ieee.org>
parents: 5718
diff changeset
454
8dbe307bdb57 Finish up login rate limit code. Set config item to 0 disables, make
John Rouillard <rouilj@ieee.org>
parents: 5718
diff changeset
455 self.client.db.config.WEB_LOGIN_ATTEMPTS_MIN = 0
8dbe307bdb57 Finish up login rate limit code. Set config item to 0 disables, make
John Rouillard <rouilj@ieee.org>
parents: 5718
diff changeset
456
8dbe307bdb57 Finish up login rate limit code. Set config item to 0 disables, make
John Rouillard <rouilj@ieee.org>
parents: 5718
diff changeset
457 # Do the first login setting an invalid login name
8dbe307bdb57 Finish up login rate limit code. Set config item to 0 disables, make
John Rouillard <rouilj@ieee.org>
parents: 5718
diff changeset
458 self.assertLoginLeavesMessages(['Invalid login'], 'nouser')
8dbe307bdb57 Finish up login rate limit code. Set config item to 0 disables, make
John Rouillard <rouilj@ieee.org>
parents: 5718
diff changeset
459 for i in range(1000):
8dbe307bdb57 Finish up login rate limit code. Set config item to 0 disables, make
John Rouillard <rouilj@ieee.org>
parents: 5718
diff changeset
460 self.client._error_message = []
8dbe307bdb57 Finish up login rate limit code. Set config item to 0 disables, make
John Rouillard <rouilj@ieee.org>
parents: 5718
diff changeset
461 self.assertLoginLeavesMessages(['Invalid login'])
8dbe307bdb57 Finish up login rate limit code. Set config item to 0 disables, make
John Rouillard <rouilj@ieee.org>
parents: 5718
diff changeset
462
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
463 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
464 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
465 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
466 self.result = []
4992
b562df8a5056 Fix form-parsing for multilinks
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4880
diff changeset
467 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
468 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
469 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
470 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
471 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
472 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
473 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
474 return kw
4992
b562df8a5056 Fix form-parsing for multilinks
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4880
diff changeset
475 self.new_id+=1
b562df8a5056 Fix form-parsing for multilinks
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4880
diff changeset
476 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
477
0dd05c9e5fff New test for linking of non-existing and existing properties via a form.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3635
diff changeset
478 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
479 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
480 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
481 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
482 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
483 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
484 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
485 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
486 ({'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
487 ,'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
488 ,'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
489 ,'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
490 })
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
491 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
492
0dd05c9e5fff New test for linking of non-existing and existing properties via a form.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3635
diff changeset
493 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
494 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
495 [ ('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
496 , ('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
497 ]
0dd05c9e5fff New test for linking of non-existing and existing properties via a form.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3635
diff changeset
498 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
499 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
500 ( {('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
501 , [('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
502 )
0dd05c9e5fff New test for linking of non-existing and existing properties via a form.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3635
diff changeset
503 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
504 self.action.handle()
5248
198b6e810c67 Use Python-3-compatible 'as' syntax for except statements
Eric S. Raymond <esr@thyrsus.com>
parents: 5164
diff changeset
505 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
506 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
507 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
508
4992
b562df8a5056 Fix form-parsing for multilinks
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4880
diff changeset
509 def testMessageMultiAttach(self):
b562df8a5056 Fix form-parsing for multilinks
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4880
diff changeset
510 expect = \
b562df8a5056 Fix form-parsing for multilinks
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4880
diff changeset
511 [ ('create',(),{'content':'t2'})
b562df8a5056 Fix form-parsing for multilinks
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4880
diff changeset
512 , ('create',(),{'content':'t'})
b562df8a5056 Fix form-parsing for multilinks
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4880
diff changeset
513 , ('set',('4711',), {'messages':['23','42','17','18']})
b562df8a5056 Fix form-parsing for multilinks
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4880
diff changeset
514 ]
b562df8a5056 Fix form-parsing for multilinks
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4880
diff changeset
515 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
516 self.client.parsePropsFromForm = lambda: \
b562df8a5056 Fix form-parsing for multilinks
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4880
diff changeset
517 ( {('msg','-1'):{'content':'t'},('msg','-2'):{'content':'t2'}
b562df8a5056 Fix form-parsing for multilinks
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4880
diff changeset
518 , ('issue','4711'):{}}
b562df8a5056 Fix form-parsing for multilinks
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4880
diff changeset
519 , [('issue','4711','messages',[('msg','-1'),('msg','-2')])]
b562df8a5056 Fix form-parsing for multilinks
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4880
diff changeset
520 )
b562df8a5056 Fix form-parsing for multilinks
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4880
diff changeset
521 try :
b562df8a5056 Fix form-parsing for multilinks
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4880
diff changeset
522 self.action.handle()
5248
198b6e810c67 Use Python-3-compatible 'as' syntax for except statements
Eric S. Raymond <esr@thyrsus.com>
parents: 5164
diff changeset
523 except Redirect as msg:
4992
b562df8a5056 Fix form-parsing for multilinks
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4880
diff changeset
524 pass
5505
2ce41b8dffaf compared sorted lists as order can be random
Christof Meerwald <cmeerw@cmeerw.org>
parents: 5503
diff changeset
525 self.assertEqual(sorted(expect, key=NoneAndDictComparable),
2ce41b8dffaf compared sorted lists as order can be random
Christof Meerwald <cmeerw@cmeerw.org>
parents: 5503
diff changeset
526 sorted(self.result, key=NoneAndDictComparable))
4992
b562df8a5056 Fix form-parsing for multilinks
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4880
diff changeset
527
3855
de4c2e538e06 Bug-Fix: File attachments from the web-interface didn't work.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3852
diff changeset
528 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
529 expect = \
de4c2e538e06 Bug-Fix: File attachments from the web-interface didn't work.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3852
diff changeset
530 [('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
531 ,('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
532 ]
de4c2e538e06 Bug-Fix: File attachments from the web-interface didn't work.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3852
diff changeset
533 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
534 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
535 ( {('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
536 ,('issue','4711'):{}
de4c2e538e06 Bug-Fix: File attachments from the web-interface didn't work.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3852
diff changeset
537 }
de4c2e538e06 Bug-Fix: File attachments from the web-interface didn't work.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3852
diff changeset
538 , [('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
539 ,('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
540 ,('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
541 ]
de4c2e538e06 Bug-Fix: File attachments from the web-interface didn't work.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3852
diff changeset
542 )
de4c2e538e06 Bug-Fix: File attachments from the web-interface didn't work.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3852
diff changeset
543 try :
de4c2e538e06 Bug-Fix: File attachments from the web-interface didn't work.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3852
diff changeset
544 self.action.handle()
5248
198b6e810c67 Use Python-3-compatible 'as' syntax for except statements
Eric S. Raymond <esr@thyrsus.com>
parents: 5164
diff changeset
545 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
546 pass
de4c2e538e06 Bug-Fix: File attachments from the web-interface didn't work.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3852
diff changeset
547 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
548
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
549 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
550 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
551 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
552 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
553 ( {('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
554 , [('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
555 )
0dd05c9e5fff New test for linking of non-existing and existing properties via a form.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3635
diff changeset
556 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
557 self.action.handle()
5248
198b6e810c67 Use Python-3-compatible 'as' syntax for except statements
Eric S. Raymond <esr@thyrsus.com>
parents: 5164
diff changeset
558 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
559 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
560 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
561
4304
df7a4400c2ce Fix linking of an existing item to a newly created item...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3855
diff changeset
562 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
563 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
564 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
565 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
566 ( {('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
567 , [('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
568 )
df7a4400c2ce Fix linking of an existing item to a newly created item...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3855
diff changeset
569 try :
df7a4400c2ce Fix linking of an existing item to a newly created item...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3855
diff changeset
570 self.action.handle()
5248
198b6e810c67 Use Python-3-compatible 'as' syntax for except statements
Eric S. Raymond <esr@thyrsus.com>
parents: 5164
diff changeset
571 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
572 pass
df7a4400c2ce Fix linking of an existing item to a newly created item...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3855
diff changeset
573 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
574
2930
4b5d7b4bc089 applied patch [SF#1067690];
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2515
diff changeset
575 # vim: set et sts=4 sw=4 :

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