import py
import form
import field

class TestForm(object):
    def setup_method(self, meth):
        self.form = form.form(meth.im_func.func_name, [
            field.line('foo', 'foo'),
        ])

    def test_render_basic(self):
        html, error = self.form.render(None)
        assert not error
        assert html.startswith('<form action="." id="test_render_basic"')
        assert '<input type="submit" name="test_render_basic"' in html
        assert html.endswith('</form>')

    def test_render_with_data(self):
        html, error = self.form.render({
            'test_render_with_data': 'true',
            'foo': 'bar',
        })
        assert not error
        assert 'class="former-error"' not in html
        assert 'value="bar"' in html

    def test_render_with_error(self):
        html, error = self.form.render({
            'test_render_with_error': 'true',
            'foo': '',
        })
        assert len(error) == 1
        assert 'class="former-error"' in html

    def test_render_with_missing_field(self):
        html, error = self.form.render({
            'test_render_with_missing_field': 'true',
        })
        assert len(error) == 1
        assert 'class="former-error"' in html

    def test_render_without_key(self):
        html, error = self.form.render({
            'foo': '',
        })
        assert not error

    def test_process_data(self):
        data, error = self.form.process_data(None)
        assert data is None
        assert error == []

        data, error = self.form.process_data({
            'test_process_data': 'true',
            'foo': 'bar',
        })
        assert data == {'foo': 'bar'}
        assert error == []

        data, error = self.form.process_data({
            'test_process_data': 'true',
            'foo': '',
        })
        assert data == {'foo': ''}
        assert len(error) == 1

        data, error = self.form.process_data({
            'test_process_data': 'true',
        })
        assert data == {'foo': ''}
        assert len(error) == 1

        data, error = self.form.process_data({
            'foo': 'bar',
        })
        assert data is None
        assert error == []

