annotate test/test_actions.py @ 8526:0586f25eb25e

ruff: exclusions on imports ignore import locations and import used for side effect
author John Rouillard <rouilj@ieee.org>
date Fri, 20 Feb 2026 16:30:50 -0500
parents c9bec888c3c8
children 9c3ec0a5c7fc
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
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
4 from roundup import hyperdb
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
5 from roundup.date import Date, Interval
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
6 from roundup.cgi.actions import *
4880
ca692423e401 Different approach to fix XSS in issue2550817
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4742
diff changeset
7 from roundup.cgi.client import add_message
8409
c9bec888c3c8 refactor! move RateLimitExceeded to roundup.cgi.exceptions - test
John Rouillard <rouilj@ieee.org>
parents: 7582
diff changeset
8 from roundup.cgi.exceptions import RateLimitExceeded, Redirect, Unauthorised, SeriousError, FormError
c9bec888c3c8 refactor! move RateLimitExceeded to roundup.cgi.exceptions - test
John Rouillard <rouilj@ieee.org>
parents: 7582
diff changeset
9 from roundup.exceptions import Reject
2515
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
10
7582
978285986b2c fix: issue2551193 - Fix roundup for removal of cgi and cgitb ...
John Rouillard <rouilj@ieee.org>
parents: 7556
diff changeset
11 from roundup.anypy.cgi_ import FieldStorage, MiniFieldStorage
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
6684
9ca5cbffa0c4 Switch off using blank passwords for login
John Rouillard <rouilj@ieee.org>
parents: 6602
diff changeset
30 self.client.db.config.WEB_LOGIN_EMPTY_PASSWORDS = 0
4880
ca692423e401 Different approach to fix XSS in issue2550817
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4742
diff changeset
31 self.client._ok_message = []
ca692423e401 Different approach to fix XSS in issue2550817
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4742
diff changeset
32 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
33 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
34 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
35 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
36 self.client._ok_message, x)
2515
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
37 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
38 self.client.base = "http://whoami.com/path/"
2515
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
39 class TemplatingUtils:
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
40 pass
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
41 self.client.instance.interfaces.TemplatingUtils = TemplatingUtils
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
42
5717
cad18de2b988 issue2550949: Rate limit password guesses/login attempts.
John Rouillard <rouilj@ieee.org>
parents: 5649
diff changeset
43 def data_get(self, key):
cad18de2b988 issue2550949: Rate limit password guesses/login attempts.
John Rouillard <rouilj@ieee.org>
parents: 5649
diff changeset
44 return self.client.db.Otk.data[key]
cad18de2b988 issue2550949: Rate limit password guesses/login attempts.
John Rouillard <rouilj@ieee.org>
parents: 5649
diff changeset
45
cad18de2b988 issue2550949: Rate limit password guesses/login attempts.
John Rouillard <rouilj@ieee.org>
parents: 5649
diff changeset
46 def data_set(self, key, **value):
cad18de2b988 issue2550949: Rate limit password guesses/login attempts.
John Rouillard <rouilj@ieee.org>
parents: 5649
diff changeset
47 self.client.db.Otk.data[key] = value
cad18de2b988 issue2550949: Rate limit password guesses/login attempts.
John Rouillard <rouilj@ieee.org>
parents: 5649
diff changeset
48
2515
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
49 class ShowActionTestCase(ActionTestCase):
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
50 def assertRaisesMessage(self, exception, callable, message, *args,
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
51 **kwargs):
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
52 """An extension of assertRaises, which also checks the exception
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
53 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
54 redirecting.
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
55 """
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
56 try:
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
57 callable(*args, **kwargs)
5248
198b6e810c67 Use Python-3-compatible 'as' syntax for except statements
Eric S. Raymond <esr@thyrsus.com>
parents: 5164
diff changeset
58 except exception as msg:
2515
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
59 self.assertEqual(str(msg), message)
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
60 else:
2930
4b5d7b4bc089 applied patch [SF#1067690];
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2515
diff changeset
61 if hasattr(exception, '__name__'):
4b5d7b4bc089 applied patch [SF#1067690];
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2515
diff changeset
62 excName = exception.__name__
2515
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
63 else:
2930
4b5d7b4bc089 applied patch [SF#1067690];
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2515
diff changeset
64 excName = str(exception)
5378
35ea9b1efc14 Python 3 preparation: "raise" syntax.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5376
diff changeset
65 raise self.failureException(excName)
2515
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
66
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
67 def testShowAction(self):
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
68 self.client.base = 'BASE/'
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
69
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
70 action = ShowAction(self.client)
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
71 self.assertRaises(ValueError, action.handle)
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
72
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
73 self.form.value.append(MiniFieldStorage('@type', 'issue'))
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
74 self.assertRaises(SeriousError, action.handle)
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
75
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
76 self.form.value.append(MiniFieldStorage('@number', '1'))
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
77 self.assertRaisesMessage(Redirect, action.handle, 'BASE/issue1')
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
78
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
79 def testShowActionNoType(self):
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
80 action = ShowAction(self.client)
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
81 self.assertRaises(ValueError, action.handle)
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
82 self.form.value.append(MiniFieldStorage('@number', '1'))
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
83 self.assertRaisesMessage(ValueError, action.handle,
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
84 'No type specified')
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
85
6602
8269e89530e5 Test bad number path for ShowAction action.
John Rouillard <rouilj@ieee.org>
parents: 6468
diff changeset
86 def testShowActionBadNumber(self):
8269e89530e5 Test bad number path for ShowAction action.
John Rouillard <rouilj@ieee.org>
parents: 6468
diff changeset
87 action = ShowAction(self.client)
8269e89530e5 Test bad number path for ShowAction action.
John Rouillard <rouilj@ieee.org>
parents: 6468
diff changeset
88 self.assertRaises(ValueError, action.handle)
8269e89530e5 Test bad number path for ShowAction action.
John Rouillard <rouilj@ieee.org>
parents: 6468
diff changeset
89 self.form.value.append(MiniFieldStorage('@number', 'A'))
8269e89530e5 Test bad number path for ShowAction action.
John Rouillard <rouilj@ieee.org>
parents: 6468
diff changeset
90 self.form.value.append(MiniFieldStorage('@type', 'issue'))
8269e89530e5 Test bad number path for ShowAction action.
John Rouillard <rouilj@ieee.org>
parents: 6468
diff changeset
91 with self.assertRaises(SeriousError) as ctx:
8269e89530e5 Test bad number path for ShowAction action.
John Rouillard <rouilj@ieee.org>
parents: 6468
diff changeset
92 action.handle()
8269e89530e5 Test bad number path for ShowAction action.
John Rouillard <rouilj@ieee.org>
parents: 6468
diff changeset
93 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
94 ctx.exception.args[0])
8269e89530e5 Test bad number path for ShowAction action.
John Rouillard <rouilj@ieee.org>
parents: 6468
diff changeset
95
2515
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
96 class RetireActionTestCase(ActionTestCase):
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
97 def testRetireAction(self):
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
98 self.client.db.security.hasPermission = true
4880
ca692423e401 Different approach to fix XSS in issue2550817
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4742
diff changeset
99 self.client._ok_message = []
2515
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
100 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
101 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
102 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
103
56854f96d805 Cover a couple of more paths in Retire and Restore.
John Rouillard <rouilj@ieee.org>
parents: 5789
diff changeset
104 self.client.template = 'index'
56854f96d805 Cover a couple of more paths in Retire and Restore.
John Rouillard <rouilj@ieee.org>
parents: 5789
diff changeset
105 self.client._ok_message = []
56854f96d805 Cover a couple of more paths in Retire and Restore.
John Rouillard <rouilj@ieee.org>
parents: 5789
diff changeset
106 RetireAction(self.client).handle()
56854f96d805 Cover a couple of more paths in Retire and Restore.
John Rouillard <rouilj@ieee.org>
parents: 5789
diff changeset
107 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
108 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
109
56854f96d805 Cover a couple of more paths in Retire and Restore.
John Rouillard <rouilj@ieee.org>
parents: 5789
diff changeset
110 self.client.env={}
56854f96d805 Cover a couple of more paths in Retire and Restore.
John Rouillard <rouilj@ieee.org>
parents: 5789
diff changeset
111 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
112 self.client._ok_message = []
56854f96d805 Cover a couple of more paths in Retire and Restore.
John Rouillard <rouilj@ieee.org>
parents: 5789
diff changeset
113 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
114
2515
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
115
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
116 def testNoPermission(self):
6196
56854f96d805 Cover a couple of more paths in Retire and Restore.
John Rouillard <rouilj@ieee.org>
parents: 5789
diff changeset
117 self.client.classname='user'
2515
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
118 self.assertRaises(Unauthorised, RetireAction(self.client).execute)
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
119
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
120 def testDontRetireAdminOrAnonymous(self):
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
121 self.client.db.security.hasPermission=true
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
122 # look up the user class
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
123 self.client.classname = 'user'
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
124 # but always look up admin, regardless of nodeid
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
125 self.client.db.user.get = lambda a,b: 'admin'
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
126 self.assertRaises(ValueError, RetireAction(self.client).handle)
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
127 # .. or anonymous
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
128 self.client.db.user.get = lambda a,b: 'anonymous'
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
129 self.assertRaises(ValueError, RetireAction(self.client).handle)
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
130
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
131 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
132 # 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
133 # 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
134 # 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
135 # 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
136 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
137 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
138 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
139 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
140 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
141 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
142
56854f96d805 Cover a couple of more paths in Retire and Restore.
John Rouillard <rouilj@ieee.org>
parents: 5789
diff changeset
143 self.client.template = 'index'
56854f96d805 Cover a couple of more paths in Retire and Restore.
John Rouillard <rouilj@ieee.org>
parents: 5789
diff changeset
144 self.client._ok_message = []
56854f96d805 Cover a couple of more paths in Retire and Restore.
John Rouillard <rouilj@ieee.org>
parents: 5789
diff changeset
145 RestoreAction(self.client).handle()
56854f96d805 Cover a couple of more paths in Retire and Restore.
John Rouillard <rouilj@ieee.org>
parents: 5789
diff changeset
146 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
147 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
148
56854f96d805 Cover a couple of more paths in Retire and Restore.
John Rouillard <rouilj@ieee.org>
parents: 5789
diff changeset
149 self.client.env={}
56854f96d805 Cover a couple of more paths in Retire and Restore.
John Rouillard <rouilj@ieee.org>
parents: 5789
diff changeset
150 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
151 self.client._ok_message = []
56854f96d805 Cover a couple of more paths in Retire and Restore.
John Rouillard <rouilj@ieee.org>
parents: 5789
diff changeset
152 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
153
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 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
155 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
156
2515
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
157 class SearchActionTestCase(ActionTestCase):
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
158 def setUp(self):
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
159 ActionTestCase.setUp(self)
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
160 self.action = SearchAction(self.client)
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
161
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
162 class StandardSearchActionTestCase(SearchActionTestCase):
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
163 def testNoPermission(self):
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
164 self.assertRaises(Unauthorised, self.action.execute)
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
165
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
166 def testQueryName(self):
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
167 self.assertEqual(self.action.getQueryName(), '')
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
168
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
169 self.form.value.append(MiniFieldStorage('@queryname', 'foo'))
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
170 self.assertEqual(self.action.getQueryName(), 'foo')
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
171
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
172 class FakeFilterVarsTestCase(SearchActionTestCase):
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
173 def setUp(self):
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
174 SearchActionTestCase.setUp(self)
3635
53987aa153d2 Transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3188
diff changeset
175 self.client.db.classes.get_transitive_prop = lambda x: \
53987aa153d2 Transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3188
diff changeset
176 hyperdb.Multilink('foo')
2515
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
177
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
178 def assertFilterEquals(self, expected):
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
179 self.action.fakeFilterVars()
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
180 self.assertEqual(self.form.getvalue('@filter'), expected)
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
181
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
182 def testEmptyMultilink(self):
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 self.form.value.append(MiniFieldStorage('foo', ''))
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
185
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
186 self.assertFilterEquals(None)
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
187
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
188 def testNonEmptyMultilink(self):
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
189 self.form.value.append(MiniFieldStorage('foo', ''))
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
190 self.form.value.append(MiniFieldStorage('foo', '1'))
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
191
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
192 self.assertFilterEquals('foo')
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
193
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
194 def testEmptyKey(self):
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
195 self.form.value.append(MiniFieldStorage('foo', ''))
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
196 self.assertFilterEquals(None)
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
197
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
198 def testStandardKey(self):
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
199 self.form.value.append(MiniFieldStorage('foo', '1'))
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
200 self.assertFilterEquals('foo')
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
201
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
202 def testStringKey(self):
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
203 self.client.db.classes.getprops = lambda: {'foo': hyperdb.String()}
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
204 self.form.value.append(MiniFieldStorage('foo', 'hello'))
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
205 self.assertFilterEquals('foo')
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
206
5097
156cbc1d182c Validate values for Integer and Numeric type filter parameters rather than
John Rouillard <rouilj@ieee.org>
parents: 5037
diff changeset
207 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
208 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
209 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
210 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
211 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
212 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
213 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
214
156cbc1d182c Validate values for Integer and Numeric type filter parameters rather than
John Rouillard <rouilj@ieee.org>
parents: 5037
diff changeset
215 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
216 "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
217 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
218 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
219 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
220
156cbc1d182c Validate values for Integer and Numeric type filter parameters rather than
John Rouillard <rouilj@ieee.org>
parents: 5037
diff changeset
221 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
222 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
223 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
224 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
225 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
226 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
227 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
228
156cbc1d182c Validate values for Integer and Numeric type filter parameters rather than
John Rouillard <rouilj@ieee.org>
parents: 5037
diff changeset
229 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
230 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
231 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
232 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
233 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
234
2515
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
235 def testTokenizedStringKey(self):
3635
53987aa153d2 Transitive-property support.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3188
diff changeset
236 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
237 self.form.value.append(MiniFieldStorage('foo', 'hello world'))
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
238
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
239 self.assertFilterEquals('foo')
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
240
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
241 # 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
242 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
243 ['hello', 'world'])
2515
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
244
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
245 class CollisionDetectionTestCase(ActionTestCase):
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
246 def setUp(self):
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
247 ActionTestCase.setUp(self)
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
248 self.action = EditItemAction(self.client)
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
249 self.now = Date('.')
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
250 # round off for testing
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
251 self.now.second = int(self.now.second)
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
252
6310
68d83479747b Fix testing of :lastactivity
John Rouillard <rouilj@ieee.org>
parents: 6303
diff changeset
253 def testLastUserActivityAt(self):
2515
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
254 self.assertEqual(self.action.lastUserActivity(), None)
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
255
6303
2ded9a8be017 Test :lastactivity special variable for lastUserActivity()
John Rouillard <rouilj@ieee.org>
parents: 6301
diff changeset
256 # test @ special variable form
2930
4b5d7b4bc089 applied patch [SF#1067690];
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2515
diff changeset
257 self.client.form.value.append(
4b5d7b4bc089 applied patch [SF#1067690];
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2515
diff changeset
258 MiniFieldStorage('@lastactivity', str(self.now)))
2515
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
259 self.assertEqual(self.action.lastUserActivity(), self.now)
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
260
6310
68d83479747b Fix testing of :lastactivity
John Rouillard <rouilj@ieee.org>
parents: 6303
diff changeset
261 def testLastUserActivityColon(self):
68d83479747b Fix testing of :lastactivity
John Rouillard <rouilj@ieee.org>
parents: 6303
diff changeset
262 self.assertEqual(self.action.lastUserActivity(), None)
68d83479747b Fix testing of :lastactivity
John Rouillard <rouilj@ieee.org>
parents: 6303
diff changeset
263
6303
2ded9a8be017 Test :lastactivity special variable for lastUserActivity()
John Rouillard <rouilj@ieee.org>
parents: 6301
diff changeset
264 # test : special variable form
2ded9a8be017 Test :lastactivity special variable for lastUserActivity()
John Rouillard <rouilj@ieee.org>
parents: 6301
diff changeset
265 self.client.form.value.append(
2ded9a8be017 Test :lastactivity special variable for lastUserActivity()
John Rouillard <rouilj@ieee.org>
parents: 6301
diff changeset
266 MiniFieldStorage(':lastactivity', str(self.now)))
2ded9a8be017 Test :lastactivity special variable for lastUserActivity()
John Rouillard <rouilj@ieee.org>
parents: 6301
diff changeset
267 self.assertEqual(self.action.lastUserActivity(), self.now)
2ded9a8be017 Test :lastactivity special variable for lastUserActivity()
John Rouillard <rouilj@ieee.org>
parents: 6301
diff changeset
268
2515
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
269 def testLastNodeActivity(self):
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
270 self.action.classname = 'issue'
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
271 self.action.nodeid = '1'
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
272
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
273 def get(nodeid, propname):
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
274 self.assertEqual(nodeid, '1')
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
275 self.assertEqual(propname, 'activity')
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
276 return self.now
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
277 self.client.db.issue.get = get
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
278
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
279 self.assertEqual(self.action.lastNodeActivity(), self.now)
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
280
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
281 def testCollision(self):
3188
7faae85e1e33 merge from branch
Richard Jones <richard@users.sourceforge.net>
parents: 3018
diff changeset
282 # fake up an actual change
7faae85e1e33 merge from branch
Richard Jones <richard@users.sourceforge.net>
parents: 3018
diff changeset
283 self.action.classname = 'test'
7faae85e1e33 merge from branch
Richard Jones <richard@users.sourceforge.net>
parents: 3018
diff changeset
284 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
285 self.client.parsePropsFromForm = lambda: (
45ba6b71f1cf actions.py translation. Using mapping rather than tuple for args.
John Rouillard <rouilj@ieee.org>
parents: 6196
diff changeset
286 {('test','1'):{"prop1":"1"}}, [])
45ba6b71f1cf actions.py translation. Using mapping rather than tuple for args.
John Rouillard <rouilj@ieee.org>
parents: 6196
diff changeset
287 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
288 self.now + Interval("1d"))
45ba6b71f1cf actions.py translation. Using mapping rather than tuple for args.
John Rouillard <rouilj@ieee.org>
parents: 6196
diff changeset
289 self.assertTrue(props)
45ba6b71f1cf actions.py translation. Using mapping rather than tuple for args.
John Rouillard <rouilj@ieee.org>
parents: 6196
diff changeset
290 self.action.handleCollision(props)
45ba6b71f1cf actions.py translation. Using mapping rather than tuple for args.
John Rouillard <rouilj@ieee.org>
parents: 6196
diff changeset
291 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
292 '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
293 '(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
294 'changes</a> in a new window.')
5789
8ef8aa3d485c assertFalse not assertFail...
John Rouillard <rouilj@ieee.org>
parents: 5787
diff changeset
295 self.assertFalse(self.action.detectCollision(self.now,
3188
7faae85e1e33 merge from branch
Richard Jones <richard@users.sourceforge.net>
parents: 3018
diff changeset
296 self.now - Interval("1d")))
5789
8ef8aa3d485c assertFalse not assertFail...
John Rouillard <rouilj@ieee.org>
parents: 5787
diff changeset
297 self.assertFalse(self.action.detectCollision(None, self.now))
2515
f8dafdd91bf5 remove extra CRs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2514
diff changeset
298
2930
4b5d7b4bc089 applied patch [SF#1067690];
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2515
diff changeset
299 class LoginTestCase(ActionTestCase):
4b5d7b4bc089 applied patch [SF#1067690];
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2515
diff changeset
300 def setUp(self):
4b5d7b4bc089 applied patch [SF#1067690];
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2515
diff changeset
301 ActionTestCase.setUp(self)
4880
ca692423e401 Different approach to fix XSS in issue2550817
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4742
diff changeset
302 self.client._error_message = []
2930
4b5d7b4bc089 applied patch [SF#1067690];
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2515
diff changeset
303
4b5d7b4bc089 applied patch [SF#1067690];
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2515
diff changeset
304 # set the db password to 'right'
4b5d7b4bc089 applied patch [SF#1067690];
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2515
diff changeset
305 self.client.db.user.get = lambda a,b: 'right'
4b5d7b4bc089 applied patch [SF#1067690];
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2515
diff changeset
306
4b5d7b4bc089 applied patch [SF#1067690];
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2515
diff changeset
307 # unless explicitly overridden, we should never get here
4b5d7b4bc089 applied patch [SF#1067690];
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2515
diff changeset
308 self.client.opendb = lambda a: self.fail(
4b5d7b4bc089 applied patch [SF#1067690];
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2515
diff changeset
309 "Logged in, but we shouldn't be.")
4b5d7b4bc089 applied patch [SF#1067690];
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2515
diff changeset
310
5121
894aa07be6cb issue2550785: Using login from search (or logout) fails. when
John Rouillard <rouilj@ieee.org>
parents: 5119
diff changeset
311 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
312 **kwargs):
894aa07be6cb issue2550785: Using login from search (or logout) fails. when
John Rouillard <rouilj@ieee.org>
parents: 5119
diff changeset
313 """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
314 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
315 redirecting.
894aa07be6cb issue2550785: Using login from search (or logout) fails. when
John Rouillard <rouilj@ieee.org>
parents: 5119
diff changeset
316 """
894aa07be6cb issue2550785: Using login from search (or logout) fails. when
John Rouillard <rouilj@ieee.org>
parents: 5119
diff changeset
317 try:
894aa07be6cb issue2550785: Using login from search (or logout) fails. when
John Rouillard <rouilj@ieee.org>
parents: 5119
diff changeset
318 callable(*args, **kwargs)
5248
198b6e810c67 Use Python-3-compatible 'as' syntax for except statements
Eric S. Raymond <esr@thyrsus.com>
parents: 5164
diff changeset
319 except exception as msg:
5121
894aa07be6cb issue2550785: Using login from search (or logout) fails. when
John Rouillard <rouilj@ieee.org>
parents: 5119
diff changeset
320 self.assertEqual(str(msg), message)
894aa07be6cb issue2550785: Using login from search (or logout) fails. when
John Rouillard <rouilj@ieee.org>
parents: 5119
diff changeset
321 else:
894aa07be6cb issue2550785: Using login from search (or logout) fails. when
John Rouillard <rouilj@ieee.org>
parents: 5119
diff changeset
322 if hasattr(exception, '__name__'):
894aa07be6cb issue2550785: Using login from search (or logout) fails. when
John Rouillard <rouilj@ieee.org>
parents: 5119
diff changeset
323 excName = exception.__name__
894aa07be6cb issue2550785: Using login from search (or logout) fails. when
John Rouillard <rouilj@ieee.org>
parents: 5119
diff changeset
324 else:
894aa07be6cb issue2550785: Using login from search (or logout) fails. when
John Rouillard <rouilj@ieee.org>
parents: 5119
diff changeset
325 excName = str(exception)
5378
35ea9b1efc14 Python 3 preparation: "raise" syntax.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5376
diff changeset
326 raise self.failureException(excName)
5121
894aa07be6cb issue2550785: Using login from search (or logout) fails. when
John Rouillard <rouilj@ieee.org>
parents: 5119
diff changeset
327
2930
4b5d7b4bc089 applied patch [SF#1067690];
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2515
diff changeset
328 def assertLoginLeavesMessages(self, messages, username=None, password=None):
4b5d7b4bc089 applied patch [SF#1067690];
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2515
diff changeset
329 if username is not None:
4b5d7b4bc089 applied patch [SF#1067690];
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2515
diff changeset
330 self.form.value.append(MiniFieldStorage('__login_name', username))
4b5d7b4bc089 applied patch [SF#1067690];
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2515
diff changeset
331 if password is not None:
4b5d7b4bc089 applied patch [SF#1067690];
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2515
diff changeset
332 self.form.value.append(
4b5d7b4bc089 applied patch [SF#1067690];
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2515
diff changeset
333 MiniFieldStorage('__login_password', password))
4b5d7b4bc089 applied patch [SF#1067690];
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2515
diff changeset
334
4b5d7b4bc089 applied patch [SF#1067690];
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2515
diff changeset
335 LoginAction(self.client).handle()
4880
ca692423e401 Different approach to fix XSS in issue2550817
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4742
diff changeset
336 self.assertEqual(self.client._error_message, messages)
2930
4b5d7b4bc089 applied patch [SF#1067690];
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2515
diff changeset
337
5121
894aa07be6cb issue2550785: Using login from search (or logout) fails. when
John Rouillard <rouilj@ieee.org>
parents: 5119
diff changeset
338 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
339 if username is not None:
894aa07be6cb issue2550785: Using login from search (or logout) fails. when
John Rouillard <rouilj@ieee.org>
parents: 5119
diff changeset
340 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
341 if password is not None:
894aa07be6cb issue2550785: Using login from search (or logout) fails. when
John Rouillard <rouilj@ieee.org>
parents: 5119
diff changeset
342 self.form.value.append(
894aa07be6cb issue2550785: Using login from search (or logout) fails. when
John Rouillard <rouilj@ieee.org>
parents: 5119
diff changeset
343 MiniFieldStorage('__login_password', password))
894aa07be6cb issue2550785: Using login from search (or logout) fails. when
John Rouillard <rouilj@ieee.org>
parents: 5119
diff changeset
344 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
345 self.form.value.append(
894aa07be6cb issue2550785: Using login from search (or logout) fails. when
John Rouillard <rouilj@ieee.org>
parents: 5119
diff changeset
346 MiniFieldStorage('__came_from', came_from))
894aa07be6cb issue2550785: Using login from search (or logout) fails. when
John Rouillard <rouilj@ieee.org>
parents: 5119
diff changeset
347
894aa07be6cb issue2550785: Using login from search (or logout) fails. when
John Rouillard <rouilj@ieee.org>
parents: 5119
diff changeset
348 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
349
2930
4b5d7b4bc089 applied patch [SF#1067690];
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2515
diff changeset
350 def testNoUsername(self):
4b5d7b4bc089 applied patch [SF#1067690];
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2515
diff changeset
351 self.assertLoginLeavesMessages(['Username required'])
4b5d7b4bc089 applied patch [SF#1067690];
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2515
diff changeset
352
4b5d7b4bc089 applied patch [SF#1067690];
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2515
diff changeset
353 def testInvalidUsername(self):
4b5d7b4bc089 applied patch [SF#1067690];
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2515
diff changeset
354 def raiseKeyError(a):
4b5d7b4bc089 applied patch [SF#1067690];
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2515
diff changeset
355 raise KeyError
4b5d7b4bc089 applied patch [SF#1067690];
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2515
diff changeset
356 self.client.db.user.lookup = raiseKeyError
4b5d7b4bc089 applied patch [SF#1067690];
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2515
diff changeset
357 self.assertLoginLeavesMessages(['Invalid login'], 'foo')
4b5d7b4bc089 applied patch [SF#1067690];
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2515
diff changeset
358
4b5d7b4bc089 applied patch [SF#1067690];
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2515
diff changeset
359 def testInvalidPassword(self):
4b5d7b4bc089 applied patch [SF#1067690];
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2515
diff changeset
360 self.assertLoginLeavesMessages(['Invalid login'], 'foo', 'wrong')
4b5d7b4bc089 applied patch [SF#1067690];
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2515
diff changeset
361
4b5d7b4bc089 applied patch [SF#1067690];
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2515
diff changeset
362 def testNoWebAccess(self):
4b5d7b4bc089 applied patch [SF#1067690];
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2515
diff changeset
363 self.assertLoginLeavesMessages(['You do not have permission to login'],
4b5d7b4bc089 applied patch [SF#1067690];
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2515
diff changeset
364 'foo', 'right')
4b5d7b4bc089 applied patch [SF#1067690];
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2515
diff changeset
365
4b5d7b4bc089 applied patch [SF#1067690];
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2515
diff changeset
366 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
367 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
368
4b5d7b4bc089 applied patch [SF#1067690];
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2515
diff changeset
369 def opendb(username):
4b5d7b4bc089 applied patch [SF#1067690];
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2515
diff changeset
370 self.assertEqual(username, 'foo')
4b5d7b4bc089 applied patch [SF#1067690];
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2515
diff changeset
371 self.client.opendb = opendb
4b5d7b4bc089 applied patch [SF#1067690];
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2515
diff changeset
372
4b5d7b4bc089 applied patch [SF#1067690];
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2515
diff changeset
373 self.assertLoginLeavesMessages([], 'foo', 'right')
4b5d7b4bc089 applied patch [SF#1067690];
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2515
diff changeset
374
6684
9ca5cbffa0c4 Switch off using blank passwords for login
John Rouillard <rouilj@ieee.org>
parents: 6602
diff changeset
375 def testBlankPasswordLogin(self):
9ca5cbffa0c4 Switch off using blank passwords for login
John Rouillard <rouilj@ieee.org>
parents: 6602
diff changeset
376 self.client.db.security.hasPermission = lambda *args, **kwargs: True
9ca5cbffa0c4 Switch off using blank passwords for login
John Rouillard <rouilj@ieee.org>
parents: 6602
diff changeset
377
9ca5cbffa0c4 Switch off using blank passwords for login
John Rouillard <rouilj@ieee.org>
parents: 6602
diff changeset
378 self.client.db.user.get = lambda a,b: None
9ca5cbffa0c4 Switch off using blank passwords for login
John Rouillard <rouilj@ieee.org>
parents: 6602
diff changeset
379
9ca5cbffa0c4 Switch off using blank passwords for login
John Rouillard <rouilj@ieee.org>
parents: 6602
diff changeset
380 def opendb(username):
9ca5cbffa0c4 Switch off using blank passwords for login
John Rouillard <rouilj@ieee.org>
parents: 6602
diff changeset
381 self.assertEqual(username, 'blank')
9ca5cbffa0c4 Switch off using blank passwords for login
John Rouillard <rouilj@ieee.org>
parents: 6602
diff changeset
382 self.client.opendb = opendb
9ca5cbffa0c4 Switch off using blank passwords for login
John Rouillard <rouilj@ieee.org>
parents: 6602
diff changeset
383
9ca5cbffa0c4 Switch off using blank passwords for login
John Rouillard <rouilj@ieee.org>
parents: 6602
diff changeset
384 self.assertEqual(self.client.db.config.WEB_LOGIN_EMPTY_PASSWORDS, 0)
9ca5cbffa0c4 Switch off using blank passwords for login
John Rouillard <rouilj@ieee.org>
parents: 6602
diff changeset
385 self.assertLoginLeavesMessages(['Invalid login'], 'blank', '' )
9ca5cbffa0c4 Switch off using blank passwords for login
John Rouillard <rouilj@ieee.org>
parents: 6602
diff changeset
386
9ca5cbffa0c4 Switch off using blank passwords for login
John Rouillard <rouilj@ieee.org>
parents: 6602
diff changeset
387 self.client.db.config.WEB_LOGIN_EMPTY_PASSWORDS = 1
9ca5cbffa0c4 Switch off using blank passwords for login
John Rouillard <rouilj@ieee.org>
parents: 6602
diff changeset
388 self.form.value[:] = [] # reset form
9ca5cbffa0c4 Switch off using blank passwords for login
John Rouillard <rouilj@ieee.org>
parents: 6602
diff changeset
389 self.client._error_message = [] # reset errors
9ca5cbffa0c4 Switch off using blank passwords for login
John Rouillard <rouilj@ieee.org>
parents: 6602
diff changeset
390 self.assertLoginLeavesMessages([], 'blank', '' )
9ca5cbffa0c4 Switch off using blank passwords for login
John Rouillard <rouilj@ieee.org>
parents: 6602
diff changeset
391
9ca5cbffa0c4 Switch off using blank passwords for login
John Rouillard <rouilj@ieee.org>
parents: 6602
diff changeset
392 # reset
9ca5cbffa0c4 Switch off using blank passwords for login
John Rouillard <rouilj@ieee.org>
parents: 6602
diff changeset
393 self.client.db.user.get = lambda a,b: 'right'
9ca5cbffa0c4 Switch off using blank passwords for login
John Rouillard <rouilj@ieee.org>
parents: 6602
diff changeset
394 self.client.db.config.WEB_LOGIN_EMPTY_PASSWORDS = 0
9ca5cbffa0c4 Switch off using blank passwords for login
John Rouillard <rouilj@ieee.org>
parents: 6602
diff changeset
395
5121
894aa07be6cb issue2550785: Using login from search (or logout) fails. when
John Rouillard <rouilj@ieee.org>
parents: 5119
diff changeset
396 def testCorrectLoginRedirect(self):
894aa07be6cb issue2550785: Using login from search (or logout) fails. when
John Rouillard <rouilj@ieee.org>
parents: 5119
diff changeset
397 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
398 def opendb(username):
894aa07be6cb issue2550785: Using login from search (or logout) fails. when
John Rouillard <rouilj@ieee.org>
parents: 5119
diff changeset
399 self.assertEqual(username, 'foo')
894aa07be6cb issue2550785: Using login from search (or logout) fails. when
John Rouillard <rouilj@ieee.org>
parents: 5119
diff changeset
400 self.client.opendb = opendb
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 # basic test with query
6468
37b57da3374f issue2550917 - Add a: "Welcome user, you have logged in" ok_message on login.
aburke
parents: 6366
diff changeset
403 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
404 '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
405
894aa07be6cb issue2550785: Using login from search (or logout) fails. when
John Rouillard <rouilj@ieee.org>
parents: 5119
diff changeset
406 # 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
407 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
408 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
409 '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
410
894aa07be6cb issue2550785: Using login from search (or logout) fails. when
John Rouillard <rouilj@ieee.org>
parents: 5119
diff changeset
411 # 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
412 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
413 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
414 '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
415
894aa07be6cb issue2550785: Using login from search (or logout) fails. when
John Rouillard <rouilj@ieee.org>
parents: 5119
diff changeset
416 # 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
417 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
418 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
419 '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
420
894aa07be6cb issue2550785: Using login from search (or logout) fails. when
John Rouillard <rouilj@ieee.org>
parents: 5119
diff changeset
421 def testInvalidLoginRedirect(self):
894aa07be6cb issue2550785: Using login from search (or logout) fails. when
John Rouillard <rouilj@ieee.org>
parents: 5119
diff changeset
422 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
423
894aa07be6cb issue2550785: Using login from search (or logout) fails. when
John Rouillard <rouilj@ieee.org>
parents: 5119
diff changeset
424 def opendb(username):
894aa07be6cb issue2550785: Using login from search (or logout) fails. when
John Rouillard <rouilj@ieee.org>
parents: 5119
diff changeset
425 self.assertEqual(username, 'foo')
894aa07be6cb issue2550785: Using login from search (or logout) fails. when
John Rouillard <rouilj@ieee.org>
parents: 5119
diff changeset
426 self.client.opendb = opendb
894aa07be6cb issue2550785: Using login from search (or logout) fails. when
John Rouillard <rouilj@ieee.org>
parents: 5119
diff changeset
427
894aa07be6cb issue2550785: Using login from search (or logout) fails. when
John Rouillard <rouilj@ieee.org>
parents: 5119
diff changeset
428 # basic test with query
5503
4f6e1ce89557 always encode query parameters in sorted order
Christof Meerwald <cmeerw@cmeerw.org>
parents: 5388
diff changeset
429 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
430 '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
431
894aa07be6cb issue2550785: Using login from search (or logout) fails. when
John Rouillard <rouilj@ieee.org>
parents: 5119
diff changeset
432 # 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
433 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
434 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
435 '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
436
894aa07be6cb issue2550785: Using login from search (or logout) fails. when
John Rouillard <rouilj@ieee.org>
parents: 5119
diff changeset
437 # 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
438 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
439 # 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
440 # 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
441 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
442
894aa07be6cb issue2550785: Using login from search (or logout) fails. when
John Rouillard <rouilj@ieee.org>
parents: 5119
diff changeset
443 # 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
444 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
445 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
446 '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
447
5717
cad18de2b988 issue2550949: Rate limit password guesses/login attempts.
John Rouillard <rouilj@ieee.org>
parents: 5649
diff changeset
448 def testLoginRateLimit(self):
cad18de2b988 issue2550949: Rate limit password guesses/login attempts.
John Rouillard <rouilj@ieee.org>
parents: 5649
diff changeset
449 ''' 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
450 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
451 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
452 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
453 '''
cad18de2b988 issue2550949: Rate limit password guesses/login attempts.
John Rouillard <rouilj@ieee.org>
parents: 5649
diff changeset
454 # 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
455 self.assertLoginLeavesMessages(['Invalid login'], 'nouser')
6684
9ca5cbffa0c4 Switch off using blank passwords for login
John Rouillard <rouilj@ieee.org>
parents: 6602
diff changeset
456 # use up the rest of the 20 login attempts. Login name
9ca5cbffa0c4 Switch off using blank passwords for login
John Rouillard <rouilj@ieee.org>
parents: 6602
diff changeset
457 # persists.
5717
cad18de2b988 issue2550949: Rate limit password guesses/login attempts.
John Rouillard <rouilj@ieee.org>
parents: 5649
diff changeset
458 for i in range(19):
cad18de2b988 issue2550949: Rate limit password guesses/login attempts.
John Rouillard <rouilj@ieee.org>
parents: 5649
diff changeset
459 self.client._error_message = []
cad18de2b988 issue2550949: Rate limit password guesses/login attempts.
John Rouillard <rouilj@ieee.org>
parents: 5649
diff changeset
460 self.assertLoginLeavesMessages(['Invalid login'])
cad18de2b988 issue2550949: Rate limit password guesses/login attempts.
John Rouillard <rouilj@ieee.org>
parents: 5649
diff changeset
461
7556
273c8c2b5042 fix(api): - issue2551063 - Rest/Xmlrpc interfaces needs failed login protection.
John Rouillard <rouilj@ieee.org>
parents: 6684
diff changeset
462 self.assertRaisesMessage(RateLimitExceeded,
273c8c2b5042 fix(api): - issue2551063 - Rest/Xmlrpc interfaces needs failed login protection.
John Rouillard <rouilj@ieee.org>
parents: 6684
diff changeset
463 LoginAction(self.client).handle,
5717
cad18de2b988 issue2550949: Rate limit password guesses/login attempts.
John Rouillard <rouilj@ieee.org>
parents: 5649
diff changeset
464 '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
465
cad18de2b988 issue2550949: Rate limit password guesses/login attempts.
John Rouillard <rouilj@ieee.org>
parents: 5649
diff changeset
466 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
467 self.client._error_message = []
cad18de2b988 issue2550949: Rate limit password guesses/login attempts.
John Rouillard <rouilj@ieee.org>
parents: 5649
diff changeset
468 self.assertLoginLeavesMessages(['Invalid login']) # this is expected
cad18de2b988 issue2550949: Rate limit password guesses/login attempts.
John Rouillard <rouilj@ieee.org>
parents: 5649
diff changeset
469
cad18de2b988 issue2550949: Rate limit password guesses/login attempts.
John Rouillard <rouilj@ieee.org>
parents: 5649
diff changeset
470 # and make sure we need to wait another three seconds
7556
273c8c2b5042 fix(api): - issue2551063 - Rest/Xmlrpc interfaces needs failed login protection.
John Rouillard <rouilj@ieee.org>
parents: 6684
diff changeset
471 self.assertRaisesMessage(RateLimitExceeded,
273c8c2b5042 fix(api): - issue2551063 - Rest/Xmlrpc interfaces needs failed login protection.
John Rouillard <rouilj@ieee.org>
parents: 6684
diff changeset
472 LoginAction(self.client).handle,
5717
cad18de2b988 issue2550949: Rate limit password guesses/login attempts.
John Rouillard <rouilj@ieee.org>
parents: 5649
diff changeset
473 '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
474
5772
8dbe307bdb57 Finish up login rate limit code. Set config item to 0 disables, make
John Rouillard <rouilj@ieee.org>
parents: 5718
diff changeset
475 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
476 ''' 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
477 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
478 '''
8dbe307bdb57 Finish up login rate limit code. Set config item to 0 disables, make
John Rouillard <rouilj@ieee.org>
parents: 5718
diff changeset
479
8dbe307bdb57 Finish up login rate limit code. Set config item to 0 disables, make
John Rouillard <rouilj@ieee.org>
parents: 5718
diff changeset
480 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
481
8dbe307bdb57 Finish up login rate limit code. Set config item to 0 disables, make
John Rouillard <rouilj@ieee.org>
parents: 5718
diff changeset
482 # 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
483 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
484 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
485 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
486 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
487
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
488 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
489 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
490 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
491 self.result = []
4992
b562df8a5056 Fix form-parsing for multilinks
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4880
diff changeset
492 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
493 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
494 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
495 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
496 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
497 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
498 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
499 return kw
4992
b562df8a5056 Fix form-parsing for multilinks
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4880
diff changeset
500 self.new_id+=1
b562df8a5056 Fix form-parsing for multilinks
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4880
diff changeset
501 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
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 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
504 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
505 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
506 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
507 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
508 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
509 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
510 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
511 ({'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
512 ,'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
513 ,'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
514 ,'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
515 })
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
516 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
517
0dd05c9e5fff New test for linking of non-existing and existing properties via a form.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3635
diff changeset
518 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
519 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
520 [ ('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
521 , ('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
522 ]
0dd05c9e5fff New test for linking of non-existing and existing properties via a form.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3635
diff changeset
523 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
524 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
525 ( {('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
526 , [('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
527 )
0dd05c9e5fff New test for linking of non-existing and existing properties via a form.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3635
diff changeset
528 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
529 self.action.handle()
5248
198b6e810c67 Use Python-3-compatible 'as' syntax for except statements
Eric S. Raymond <esr@thyrsus.com>
parents: 5164
diff changeset
530 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
531 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
532 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
533
4992
b562df8a5056 Fix form-parsing for multilinks
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4880
diff changeset
534 def testMessageMultiAttach(self):
b562df8a5056 Fix form-parsing for multilinks
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4880
diff changeset
535 expect = \
b562df8a5056 Fix form-parsing for multilinks
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4880
diff changeset
536 [ ('create',(),{'content':'t2'})
b562df8a5056 Fix form-parsing for multilinks
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4880
diff changeset
537 , ('create',(),{'content':'t'})
b562df8a5056 Fix form-parsing for multilinks
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4880
diff changeset
538 , ('set',('4711',), {'messages':['23','42','17','18']})
b562df8a5056 Fix form-parsing for multilinks
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4880
diff changeset
539 ]
b562df8a5056 Fix form-parsing for multilinks
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4880
diff changeset
540 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
541 self.client.parsePropsFromForm = lambda: \
b562df8a5056 Fix form-parsing for multilinks
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4880
diff changeset
542 ( {('msg','-1'):{'content':'t'},('msg','-2'):{'content':'t2'}
b562df8a5056 Fix form-parsing for multilinks
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4880
diff changeset
543 , ('issue','4711'):{}}
b562df8a5056 Fix form-parsing for multilinks
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4880
diff changeset
544 , [('issue','4711','messages',[('msg','-1'),('msg','-2')])]
b562df8a5056 Fix form-parsing for multilinks
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4880
diff changeset
545 )
b562df8a5056 Fix form-parsing for multilinks
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4880
diff changeset
546 try :
b562df8a5056 Fix form-parsing for multilinks
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4880
diff changeset
547 self.action.handle()
5248
198b6e810c67 Use Python-3-compatible 'as' syntax for except statements
Eric S. Raymond <esr@thyrsus.com>
parents: 5164
diff changeset
548 except Redirect as msg:
4992
b562df8a5056 Fix form-parsing for multilinks
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4880
diff changeset
549 pass
5505
2ce41b8dffaf compared sorted lists as order can be random
Christof Meerwald <cmeerw@cmeerw.org>
parents: 5503
diff changeset
550 self.assertEqual(sorted(expect, key=NoneAndDictComparable),
2ce41b8dffaf compared sorted lists as order can be random
Christof Meerwald <cmeerw@cmeerw.org>
parents: 5503
diff changeset
551 sorted(self.result, key=NoneAndDictComparable))
4992
b562df8a5056 Fix form-parsing for multilinks
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4880
diff changeset
552
3855
de4c2e538e06 Bug-Fix: File attachments from the web-interface didn't work.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3852
diff changeset
553 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
554 expect = \
de4c2e538e06 Bug-Fix: File attachments from the web-interface didn't work.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3852
diff changeset
555 [('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
556 ,('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
557 ]
de4c2e538e06 Bug-Fix: File attachments from the web-interface didn't work.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3852
diff changeset
558 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
559 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
560 ( {('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
561 ,('issue','4711'):{}
de4c2e538e06 Bug-Fix: File attachments from the web-interface didn't work.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3852
diff changeset
562 }
de4c2e538e06 Bug-Fix: File attachments from the web-interface didn't work.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3852
diff changeset
563 , [('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
564 ,('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
565 ,('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
566 ]
de4c2e538e06 Bug-Fix: File attachments from the web-interface didn't work.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3852
diff changeset
567 )
de4c2e538e06 Bug-Fix: File attachments from the web-interface didn't work.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3852
diff changeset
568 try :
de4c2e538e06 Bug-Fix: File attachments from the web-interface didn't work.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3852
diff changeset
569 self.action.handle()
5248
198b6e810c67 Use Python-3-compatible 'as' syntax for except statements
Eric S. Raymond <esr@thyrsus.com>
parents: 5164
diff changeset
570 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
571 pass
de4c2e538e06 Bug-Fix: File attachments from the web-interface didn't work.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3852
diff changeset
572 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
573
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
574 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
575 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
576 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
577 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
578 ( {('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
579 , [('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
580 )
0dd05c9e5fff New test for linking of non-existing and existing properties via a form.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3635
diff changeset
581 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
582 self.action.handle()
5248
198b6e810c67 Use Python-3-compatible 'as' syntax for except statements
Eric S. Raymond <esr@thyrsus.com>
parents: 5164
diff changeset
583 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
584 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
585 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
586
4304
df7a4400c2ce Fix linking of an existing item to a newly created item...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3855
diff changeset
587 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
588 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
589 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
590 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
591 ( {('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
592 , [('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
593 )
df7a4400c2ce Fix linking of an existing item to a newly created item...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3855
diff changeset
594 try :
df7a4400c2ce Fix linking of an existing item to a newly created item...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3855
diff changeset
595 self.action.handle()
5248
198b6e810c67 Use Python-3-compatible 'as' syntax for except statements
Eric S. Raymond <esr@thyrsus.com>
parents: 5164
diff changeset
596 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
597 pass
df7a4400c2ce Fix linking of an existing item to a newly created item...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3855
diff changeset
598 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
599
2930
4b5d7b4bc089 applied patch [SF#1067690];
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2515
diff changeset
600 # vim: set et sts=4 sw=4 :

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