290 lines
9.6 KiB
Python
290 lines
9.6 KiB
Python
import datetime
|
|
import sys
|
|
import shutil
|
|
import copy
|
|
|
|
from quixote import cleanup
|
|
from quixote.http_request import parse_query
|
|
import mechanize
|
|
|
|
from wcs import publisher
|
|
from wcs.qommon.form import *
|
|
from wcs.qommon.http_request import HTTPRequest
|
|
|
|
import __builtin__
|
|
__builtin__.__dict__['ngettext'] = lambda x, y, z: x
|
|
|
|
from utilities import create_temporary_pub
|
|
|
|
def setup_module(module):
|
|
cleanup()
|
|
global pub, req
|
|
pub = create_temporary_pub()
|
|
|
|
req = HTTPRequest(None, {})
|
|
req.language = None
|
|
pub._set_request(req)
|
|
|
|
def teardown_module(module):
|
|
shutil.rmtree(pub.APP_DIR)
|
|
|
|
class MockHtmlForm(object):
|
|
def __init__(self, widget):
|
|
widget = copy.deepcopy(widget)
|
|
form = Form(method='post', use_tokens=False, enctype='application/x-www-form-urlencoded')
|
|
form.widgets.append(widget)
|
|
self.as_html = str(form.render())
|
|
response = mechanize._response.test_html_response(self.as_html)
|
|
factory = mechanize.DefaultFactory()
|
|
factory.set_response(response)
|
|
self.factory = factory
|
|
self.form = list(factory.forms())[0]
|
|
|
|
def set_form_value(self, name, value):
|
|
self.form.set_value(value, name)
|
|
|
|
def get_parsed_query(self):
|
|
return parse_query(self.form._request_data()[1], 'utf-8')
|
|
|
|
def mock_form_submission(req, widget, html_vars={}, click=None):
|
|
form = MockHtmlForm(widget)
|
|
for k, v in html_vars.items():
|
|
form.set_form_value(k, v)
|
|
if click is not None:
|
|
request = form.form.click(click)
|
|
req.form = parse_query(request.data, 'utf-8')
|
|
else:
|
|
req.form = form.get_parsed_query()
|
|
|
|
def test_stringwidget_values():
|
|
widget = StringWidget('test')
|
|
form = MockHtmlForm(widget)
|
|
assert 'name="test"' in form.as_html
|
|
req.form = {}
|
|
assert widget.parse() is None
|
|
|
|
widget = StringWidget('test', value='foo')
|
|
req.form = {}
|
|
assert widget.parse() == 'foo'
|
|
|
|
widget = StringWidget('test', value='foo')
|
|
mock_form_submission(req, widget, {'test': ''})
|
|
assert widget.parse() is None
|
|
|
|
widget = StringWidget('test', value='foo')
|
|
mock_form_submission(req, widget, {'test': 'bar'})
|
|
assert widget.parse() == 'bar'
|
|
|
|
def test_stringwidget_required():
|
|
widget = StringWidget('test', value='foo', required=True)
|
|
mock_form_submission(req, widget, {'test': ''})
|
|
assert widget.has_error()
|
|
|
|
widget = StringWidget('test', value='foo', required=True)
|
|
mock_form_submission(req, widget, {'test': 'bar'})
|
|
assert not widget.has_error()
|
|
assert widget.parse() == 'bar'
|
|
|
|
def test_table_list_rows():
|
|
widget = TableListRowsWidget('test', columns=['a', 'b', 'c'])
|
|
form = MockHtmlForm(widget)
|
|
req.form = {}
|
|
for row in range(5):
|
|
for col in range(3):
|
|
assert 'test$element%d$col%d' % (row, col) in form.as_html
|
|
|
|
widget = TableListRowsWidget('test', columns=['a', 'b', 'c'])
|
|
form = MockHtmlForm(widget)
|
|
mock_form_submission(req, widget, {'test$element0$col0': 'bar',
|
|
'test$element1$col1': 'foo'})
|
|
assert widget.parse() == [[u'bar', None, None], [None, u'foo', None]]
|
|
|
|
def test_table_list_rows_add_row():
|
|
widget = TableListRowsWidget('test', columns=['a', 'b', 'c'])
|
|
form = MockHtmlForm(widget)
|
|
req.form = {}
|
|
mock_form_submission(req, widget, click='test$add_element')
|
|
widget = TableListRowsWidget('test', columns=['a', 'b', 'c'])
|
|
form = MockHtmlForm(widget)
|
|
for row in range(6): # one more row
|
|
for col in range(3):
|
|
assert 'test$element%d$col%d' % (row, col) in form.as_html
|
|
|
|
def test_table_list_rows_required():
|
|
req.form = {}
|
|
widget = TableListRowsWidget('test', columns=['a', 'b', 'c'], required=True)
|
|
form = MockHtmlForm(widget)
|
|
mock_form_submission(req, widget)
|
|
widget = TableListRowsWidget('test', columns=['a', 'b', 'c'], required=True)
|
|
assert widget.has_error()
|
|
|
|
req.form = {}
|
|
widget = TableListRowsWidget('test', columns=['a', 'b', 'c'], required=True)
|
|
mock_form_submission(req, widget, click='test$add_element')
|
|
widget = TableListRowsWidget('test', columns=['a', 'b', 'c'], required=True)
|
|
assert not widget.has_error()
|
|
|
|
|
|
def test_passwordentry_widget_success():
|
|
widget = PasswordEntryWidget('test')
|
|
form = MockHtmlForm(widget)
|
|
assert 'name="test$pwd1"' in form.as_html
|
|
req.form = {}
|
|
assert widget.parse() is None
|
|
|
|
widget = PasswordEntryWidget('test', value={'cleartext': 'foo'}, formats=['cleartext'])
|
|
req.form = {}
|
|
assert widget.parse() == {'cleartext': 'foo'}
|
|
|
|
widget = PasswordEntryWidget('test', formats=['cleartext'])
|
|
req.form = {}
|
|
mock_form_submission(req, widget, {'test$pwd1': ''})
|
|
assert widget.parse() is None
|
|
|
|
widget = PasswordEntryWidget('test', formats=['cleartext'])
|
|
req.form = {}
|
|
mock_form_submission(req, widget, {'test$pwd1': 'foo', 'test$pwd2': 'foo'})
|
|
assert widget.parse() == {'cleartext': 'foo'}
|
|
|
|
|
|
def test_passwordentry_widget_errors():
|
|
# mismatch
|
|
widget = PasswordEntryWidget('test', formats=['cleartext'])
|
|
req.form = {}
|
|
mock_form_submission(req, widget, {'test$pwd1': 'foo', 'test$pwd2': 'bar'})
|
|
assert widget.parse() is None
|
|
assert widget.has_error() is True
|
|
|
|
# too short
|
|
widget = PasswordEntryWidget('test', formats=['cleartext'], min_length=4)
|
|
req.form = {}
|
|
mock_form_submission(req, widget, {'test$pwd1': 'foo', 'test$pwd2': 'foo'})
|
|
assert widget.parse() is None
|
|
assert widget.has_error() is True
|
|
|
|
# uppercases
|
|
widget = PasswordEntryWidget('test', formats=['cleartext'], count_uppercase=1)
|
|
req.form = {}
|
|
mock_form_submission(req, widget, {'test$pwd1': 'foo', 'test$pwd2': 'foo'})
|
|
assert widget.parse() is None
|
|
assert widget.has_error() is True
|
|
|
|
# digits
|
|
widget = PasswordEntryWidget('test', formats=['cleartext'], count_digit=1)
|
|
req.form = {}
|
|
mock_form_submission(req, widget, {'test$pwd1': 'foo', 'test$pwd2': 'foo'})
|
|
assert widget.parse() is None
|
|
assert widget.has_error() is True
|
|
|
|
# specials
|
|
widget = PasswordEntryWidget('test', formats=['cleartext'], count_special=1)
|
|
req.form = {}
|
|
mock_form_submission(req, widget, {'test$pwd1': 'foo', 'test$pwd2': 'foo'})
|
|
assert widget.parse() is None
|
|
assert widget.has_error() is True
|
|
|
|
|
|
def test_textwidget():
|
|
widget = TextWidget('test')
|
|
form = MockHtmlForm(widget)
|
|
assert 'name="test"' in form.as_html
|
|
req.form = {}
|
|
assert widget.parse() is None
|
|
|
|
widget = TextWidget('test', value='foo')
|
|
req.form = {}
|
|
assert widget.parse() == 'foo'
|
|
|
|
widget = TextWidget('test', value='foo')
|
|
mock_form_submission(req, widget, {'test': ''})
|
|
assert widget.parse() is None
|
|
|
|
widget = TextWidget('test', value='foo')
|
|
mock_form_submission(req, widget, {'test': 'bar'})
|
|
assert widget.parse() == 'bar'
|
|
|
|
widget = TextWidget('test', value='foo', maxlength=10)
|
|
mock_form_submission(req, widget, {'test': 'bar'})
|
|
assert not widget.has_error()
|
|
assert widget.parse() == 'bar'
|
|
|
|
widget = TextWidget('test', value='foo', maxlength=10)
|
|
mock_form_submission(req, widget, {'test': 'bar'*10})
|
|
assert widget.has_error()
|
|
assert widget.get_error() == 'too many characters (limit is 10)'
|
|
|
|
|
|
def test_emailwidget():
|
|
widget = EmailWidget('test')
|
|
form = MockHtmlForm(widget)
|
|
assert 'name="test"' in form.as_html
|
|
req.form = {}
|
|
assert widget.parse() is None
|
|
|
|
widget = EmailWidget('test')
|
|
mock_form_submission(req, widget, {'test': 'foo@localhost'})
|
|
assert not widget.has_error()
|
|
assert widget.parse() == 'foo@localhost'
|
|
|
|
widget = EmailWidget('test')
|
|
mock_form_submission(req, widget, {'test': 'foo'})
|
|
assert widget.has_error()
|
|
|
|
widget = EmailWidget('test')
|
|
mock_form_submission(req, widget, {'test': 'foo@localhost@test'})
|
|
assert widget.has_error()
|
|
|
|
|
|
def test_date_widget():
|
|
widget = DateWidget('test')
|
|
form = MockHtmlForm(widget)
|
|
assert 'name="test"' in form.as_html
|
|
req.form = {}
|
|
assert widget.parse() is None
|
|
|
|
widget = DateWidget('test')
|
|
mock_form_submission(req, widget, {'test': '2014-1-20'})
|
|
assert not widget.has_error()
|
|
assert widget.parse() == '2014-1-20'
|
|
|
|
pub.cfg['language'] = {'language': 'fr'}
|
|
widget = DateWidget('test')
|
|
mock_form_submission(req, widget, {'test': '20/1/2014'})
|
|
assert not widget.has_error()
|
|
assert widget.parse() == '20/1/2014'
|
|
|
|
widget = DateWidget('test', minimum_date='1/1/2014')
|
|
mock_form_submission(req, widget, {'test': '20/1/2014'})
|
|
assert not widget.has_error()
|
|
|
|
widget = DateWidget('test', minimum_date='1/1/2014')
|
|
mock_form_submission(req, widget, {'test': '20/1/2013'})
|
|
assert widget.has_error()
|
|
|
|
widget = DateWidget('test', maximum_date='1/1/2014')
|
|
mock_form_submission(req, widget, {'test': '20/1/2013'})
|
|
assert not widget.has_error()
|
|
|
|
widget = DateWidget('test', maximum_date='1/1/2014')
|
|
mock_form_submission(req, widget, {'test': '20/1/2014'})
|
|
assert widget.has_error()
|
|
|
|
yesterday = (datetime.date.today() - datetime.timedelta(days=1)).strftime(widget.get_format_string())
|
|
tomorrow = (datetime.date.today() + datetime.timedelta(days=1)).strftime(widget.get_format_string())
|
|
|
|
widget = DateWidget('test', minimum_is_future=True)
|
|
mock_form_submission(req, widget, {'test': tomorrow})
|
|
assert not widget.has_error()
|
|
|
|
widget = DateWidget('test', minimum_is_future=True)
|
|
mock_form_submission(req, widget, {'test': yesterday})
|
|
assert widget.has_error()
|
|
|
|
widget = DateWidget('test', date_in_the_past=True)
|
|
mock_form_submission(req, widget, {'test': tomorrow})
|
|
assert widget.has_error()
|
|
|
|
widget = DateWidget('test', date_in_the_past=True)
|
|
mock_form_submission(req, widget, {'test': yesterday})
|
|
assert not widget.has_error()
|