Testing Forms

Tests for the django-registration application.

For unit testing forms:

data = {
    'email': 'user@net.com',
    'name': 'Sam',
    'password': 'pass',
}
form = RegistrationForm(data=data)
self.assertTrue(form.is_valid(), form.errors)
self.assertEquals(form.cleaned_data['name'], 'Sam')

Model forms:

@pytest.mark.django_db
def test_mapping_form():
    mapping = MappingFactory()
    data = {
        'data_download': True,
        'mapping_type': Mapping.LIST_KEY,
    }
    form = MappingForm(
        data=data,
        instance=mapping,
    )
    assert form.is_valid(), form.errors
    assert {
        'data_download': True,
        'mapping_type': 'list_key',
    } == form.cleaned_data

Sample

self.assertEquals(form.errors['email'], [u'This field is required.',])
self.assertEquals(len(form.errors), 1,
    'expecting the form to have only one error %s' % form.errors)
form = ArticleForm(data=data)
self.assertFalse(form.is_valid(), form.errors)
self.assertIn('PJK', form.errors[NON_FIELD_ERRORS][0])

Attributes

def _attributes_for_widget(self, form, widget_name):
    """
    Return the HTML attributes for the widget as a dictionary.

    :param form:
        Django form containing the widget.
    :param widget_name:
        Name of the widget.
    :returns:
        (dict) HTML attributes for the widget.
    """
    widgets = {}
    for i in form:
        widgets[i.name] = i.as_widget()
    html = widgets[widget_name]
    soup = BeautifulSoup(html)
    # html will contain a single widget.
    element = soup.contents[0]
    attributes = {}
    for i in element.attrs:
        attributes[i[0]] = i[1]
    return attributes

View

To test a form within a view:

response = self.client.get(url)
form = response.context_data['form']
self.assertEqual('test@pkimber.net', form.initial['email'])