import py
import cgi
import datetime
import decimal
import field
class TestField(object):
def test_value_from_data(self):
f = field.field('foo', 'foo')
assert f.value_from_data({'foo': 'bar'}) == 'bar'
fs = cgi.FieldStorage(environ={'QUERY_STRING': 'foo=bar'})
assert f.value_from_data(fs) == 'bar'
def test_validate(self):
class myvalidator(object):
def validate(self, value):
if value == u'foo':
return
raise ValueError(u'foo')
f = field.field('foo', 'foo', validators=(myvalidator(),))
f.validate(u'foo')
py.test.raises(ValueError, "f.validate(u'bar')")
def test_validate_mandatory(self):
f = field.field('foo', 'foo')
f.validate(u'foo')
py.test.raises(ValueError, "f.validate('')")
f = field.field('foo', 'foo', mandatory=False)
f.validate(u'')
def test_render(self):
class myfield(field.field):
def render_validated(self, value, error, translate=None):
return '' % (value,)
f = myfield('foo', 'foo', value='default')
# can it deal with None input?
html, error = f.render(None)
assert not error
assert html == ''
# can it deal with proper input?
html, error = f.render({'foo': 'bar'})
assert not error
assert html == ''
# can it deal with wrong input?
html, error = f.render({'foo': ''})
assert error == 'field is mandatory'
assert html == ''
# not sure about testing the render methods verbatim
def test_render_validated(self):
f = field.field('foo', 'foo field')
html = f.render_validated('bar', None)
expected = '\n'.join([
'
',
])
assert html == expected
def test_render_validated_error(self):
f = field.field('foo', 'foo field')
html = f.render_validated('bar', 'some error')
expected = '\n'.join([
'',
])
assert html == expected
def test_render_attrs(self):
f = field.field('foo', 'foo field', attributes={'class': 'spam'})
html = f.render_validated('bar', None)
expected = '\n'.join([
'',
])
class TestLine(object):
def test_basic(self):
f = field.line('foo', 'foo')
assert f.render_tag('bar', None) == (
'')
assert f.render_tag('', 'field is mandatory') == (
'')
class TestPassword(object):
def test_basic(self):
f =field.password('foo', 'foo')
assert f.render_tag('bar', None) == (
'')
class TestInt(object):
def test_value_from_data(self):
f = field.integer('foo', 'foo')
assert f.value_from_data({'foo': '1'}) == 1
assert f.value_from_data({'foo': '-1'}) == -1
def test_render(self):
f = field.integer('foo', 'foo')
html, error = f.render({'foo': '1'})
expected = '\n'.join([
'',
])
assert html == expected
class TestDate(object):
def test_value_from_data(self):
f = field.date('date', 'date')
assert (f.value_from_data({'date': '2008/01/01'}) ==
datetime.date(2008, 1, 1))
assert (f.value_from_data({'date': '1-2-2008'}) ==
datetime.date(2008, 2, 1))
def test_render_tag(self):
f = field.date('date', 'date')
assert f.render_tag(datetime.date(2008, 2, 1), None) == (
'')
f = field.date('date', 'date')
assert f.render_tag('', None) == (
'')
class TestMoney(object):
def test_value_from_data(self):
f = field.money('price', 'price')
assert f.value_from_data({'price': '1.00'}) == decimal.Decimal('1.0')
def test_render_tag(self):
f = field.money('price', 'price')
assert f.render_tag(decimal.Decimal('1.0'), None) == (
'')
f = field.money('price', 'price')
assert f.render_tag('', None) == (
'')
class TestText(object):
def test_basic(self):
f = field.text('foo', 'foo')
assert f.render_tag('bar baz qux', None) == (
'')
class TestMultifield(object):
def test_value_from_data(self):
f = field.multifield('foo', 'foo', (('s', 'spam'), ('e', 'eggs')))
assert f.value_from_data({'foo': ['s']}) == ['s']
assert f.value_from_data({'foo': ['s', 'e']}) == ['s', 'e']
assert f.value_from_data({'foo': 's'}) == ['s']
assert f.value_from_data({'foo': []}) == []
class TestRadio(object):
def test_no_values_mandatory(self):
f = field.radio('foo', 'foo', (('s', 'spam'), ('e', 'eggs')))
html = f.render_tag([], None)
expected = '\n'.join([
'',
(''),
'',
'',
'',
'
',
])
assert html == expected
def test_no_values_optional(self):
f = field.radio('foo', 'foo', (('s', 'spam'), ('e', 'eggs')),
mandatory=False)
html = f.render_tag([], None)
expected = '\n'.join([
'',
'',
'',
'',
'',
'
',
])
assert html == expected
def test_with_value(self):
f = field.radio('foo', 'foo', (('s', 'spam'), ('e', 'eggs')))
html = f.render_tag('e', None)
expected = '\n'.join([
'',
'',
'',
(''),
'',
'
',
])
assert html == expected
class TestCheckbox(object):
def test_no_values_mandatory(self):
f = field.checkbox('foo', 'foo', (('s', 'spam'), ('e', 'eggs')))
html = f.render_tag([], None)
expected = '\n'.join([
'',
(''),
'',
'',
'',
'
',
])
assert html == expected
def test_no_values_optional(self):
f = field.checkbox('foo', 'foo', (('s', 'spam'), ('e', 'eggs')),
mandatory=False)
html = f.render_tag([], None)
expected = '\n'.join([
'',
'',
'',
'',
'',
'
',
])
assert html == expected
def test_with_value(self):
f = field.checkbox('foo', 'foo', (('s', 'spam'), ('e', 'eggs')))
html = f.render_tag(['e'], None)
expected = '\n'.join([
'',
'',
'',
(''),
'',
'
',
])
assert html == expected
def test_more_values(self):
f = field.checkbox('foo', 'foo', (('s', 'spam'), ('e', 'eggs')))
html = f.render_tag(['s', 'e'], None)
expected = '\n'.join([
'',
(''),
'',
(''),
'',
'
',
])
assert html == expected