wcs/tests/test_fields.py

136 lines
4.6 KiB
Python

import shutil
import pytest
from quixote import cleanup
from quixote.http_request import HTTPRequest, Upload
from wcs.qommon import sessions
from wcs import fields
from wcs.qommon.form import Form
from wcs.formdef import FormDef
from utilities import create_temporary_pub, MockSubstitutionVariables
def setup_module(module):
cleanup()
global pub
pub = create_temporary_pub()
req = HTTPRequest(None, {'SERVER_NAME': 'example.net', 'SCRIPT_NAME': ''})
pub._set_request(req)
req.session = sessions.Session(id=1)
def teardown_module(module):
global pub
shutil.rmtree(pub.APP_DIR)
def test_fill_admin_form():
for klass in fields.field_classes:
form = Form()
klass().fill_admin_form(form)
def test_get_admin_attributes():
for klass in fields.field_classes:
klass().get_admin_attributes()
def test_add_to_form():
for klass in fields.field_classes:
form = Form()
if klass is fields.PageField:
with pytest.raises(AttributeError):
klass(label='foo').add_to_form(form)
else:
klass(label='foo').add_to_form(form)
def test_string():
assert fields.StringField().get_view_value('foo') == 'foo'
assert fields.StringField().get_view_short_value('') == ''
assert fields.StringField().get_view_short_value('foo') == 'foo'
assert fields.StringField().get_csv_value('') == ['']
assert fields.StringField().get_csv_value('foo') == ['foo']
def test_text():
assert fields.TextField().get_view_short_value('foo'*10) == ('foo'*10)[:25] + ' (...)'
assert fields.TextField().get_view_value('foo') == '<p>foo</p>'
assert fields.TextField().get_view_value('foo\n\nfoo') == '<p>foo\n</p><p>\nfoo</p>'
assert fields.TextField(pre=True).get_view_value('foo') == '<pre>foo</pre>'
def test_email():
assert fields.EmailField().get_view_value('foo@localhost') == \
'<a href="mailto:foo@localhost">foo@localhost</a>'
assert fields.EmailField().get_rst_view_value('foo@localhost') == 'foo@localhost'
def test_bool():
assert fields.BoolField().get_view_value(True) == 'Yes'
assert fields.BoolField().get_view_value(False) == 'No'
def test_items():
assert fields.ItemsField(items=['a', 'b', 'c']).get_view_value(['a', 'b']) == 'a, b'
assert fields.ItemsField(items=['a', 'b', 'c']).get_csv_value(['a', 'b']) == ['a', 'b', '']
assert fields.ItemsField(items=['a', 'b', 'c'], max_choices=2).get_csv_value(['a', 'b']) == ['a', 'b']
field = fields.ItemsField()
field.data_source = {
'type': 'formula',
'value': '''[('1', 'foo'), ('2', 'bar')]'''
}
assert field.get_items() == [('1', 'foo'), ('2', 'bar')]
assert field.get_items() == [('1', 'foo'), ('2', 'bar')] # twice for cached behaviour
def test_password():
assert fields.PasswordField().get_view_value('xxx') == '********'
def test_file():
upload = Upload('/foo/bar', content_type='text/plain')
assert fields.FileField().get_csv_value(upload) == ['/foo/bar']
def test_page():
formdef = FormDef()
formdef.fields = []
page = fields.PageField()
assert page.is_visible({}, formdef) is True
page.condition = 'var_foo == "bar"'
assert page.is_visible({}, formdef) is True # 'var_foo' is not defined
formdef.fields = [fields.StringField(id='1', label='string', varname='foo')]
assert page.is_visible({}, formdef) is False
assert page.is_visible({'1': 'bar'}, formdef) is True
assert page.is_visible({'1': 'baz'}, formdef) is False
def test_table():
assert 'prefill' not in fields.TableField().get_admin_attributes()
def test_title():
field = fields.TitleField(label='Foobar')
form = Form()
field.add_to_form(form)
assert '<h3>Foobar</h3>' in str(form.render())
def test_subtitle():
field = fields.SubtitleField(label='Foobar')
form = Form()
field.add_to_form(form)
assert '<h4>Foobar</h4>' in str(form.render())
def test_comment():
field = fields.CommentField(label='Foobar')
form = Form()
field.add_to_form(form)
assert '<p>Foobar</p>' in str(form.render())
field = fields.CommentField(label='Foo\n\nBar\n\nBaz')
form = Form()
field.add_to_form(form)
assert '<p>Foo</p>\n<p>Bar</p>\n<p>Baz</p>' in str(form.render())
# test for variable substitution
pub.substitutions.feed(MockSubstitutionVariables())
field = fields.CommentField(label='[bar]')
form = Form()
field.add_to_form(form)
assert '<p>Foobar</p>' in str(form.render())
# test for html content
field = fields.CommentField(label='<p>Foobar</p>')
form = Form()
field.add_to_form(form)
assert '<p>Foobar</p>' in str(form.render())