tests: add testing of table with rows widget (#2763)

This commit is contained in:
Frédéric Péters 2013-04-18 16:25:08 +02:00
parent b573f881e5
commit f261cd6610
1 changed files with 123 additions and 0 deletions

123
tests/test_widgets.py Normal file
View File

@ -0,0 +1,123 @@
import sys
import shutil
import tempfile
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
def setup_module(module):
cleanup()
global pub, req
publisher.WcsPublisher.APP_DIR = tempfile.mkdtemp()
pub = publisher.WcsPublisher.create_publisher()
req = HTTPRequest(None, {})
pub._set_request(req)
def teardown_module(module):
shutil.rmtree(pub.APP_DIR)
class MockHtmlForm(object):
def __init__(self, widget):
widget = copy.copy(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)
print 'data:', request.data
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()