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([ '
', '
some error
', '
', '', '
', '', '
', ]) 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