From 70902908c728264f65df40f0aec8474cd7d672c8 Mon Sep 17 00:00:00 2001 From: Russell Keith-Magee Date: Thu, 10 May 2007 13:46:15 +0000 Subject: [PATCH] Improved error reporting for assertions where there are no form errors, or a non-existent field has been provided. Also created a test client regression test, to hold the tests validating the failure cases of the TestCase assertions. git-svn-id: http://code.djangoproject.com/svn/django/trunk@5181 bcc190cf-cafb-0310-a4f2-bffc1f526a37 --- tests/modeltests/test_client/models.py | 7 - tests/modeltests/test_client/urls.py | 1 - tests/modeltests/test_client/views.py | 4 - .../test_client_regress/__init__.py | 0 .../test_client_regress/models.py | 136 ++++++++++++++++++ .../test_client_regress/urls.py | 7 + .../test_client_regress/views.py | 8 ++ tests/urls.py | 1 + 8 files changed, 152 insertions(+), 12 deletions(-) create mode 100644 tests/regressiontests/test_client_regress/__init__.py create mode 100644 tests/regressiontests/test_client_regress/models.py create mode 100644 tests/regressiontests/test_client_regress/urls.py create mode 100644 tests/regressiontests/test_client_regress/views.py diff --git a/tests/modeltests/test_client/models.py b/tests/modeltests/test_client/models.py index c36b435e25..5ebf29678c 100644 --- a/tests/modeltests/test_client/models.py +++ b/tests/modeltests/test_client/models.py @@ -34,13 +34,6 @@ class ClientTest(TestCase): self.assertEqual(response.context['var'], 42) self.assertEqual(response.template.name, 'GET Template') - def test_no_template_view(self): - "Template usage assertions work then templates aren't in use" - response = self.client.get('/test_client/no_template_view/') - - # Check that the no template case doesn't mess with the template assertions - self.assertTemplateNotUsed(response, 'GET Template') - def test_get_post_view(self): "GET a view that normally expects POSTs" response = self.client.get('/test_client/post_view/', {}) diff --git a/tests/modeltests/test_client/urls.py b/tests/modeltests/test_client/urls.py index 12303403ed..538c0e4b43 100644 --- a/tests/modeltests/test_client/urls.py +++ b/tests/modeltests/test_client/urls.py @@ -3,7 +3,6 @@ from django.views.generic.simple import redirect_to import views urlpatterns = patterns('', - (r'^no_template_view/$', views.no_template_view), (r'^get_view/$', views.get_view), (r'^post_view/$', views.post_view), (r'^raw_post_view/$', views.raw_post_view), diff --git a/tests/modeltests/test_client/views.py b/tests/modeltests/test_client/views.py index 0320f0618a..9bdf213b35 100644 --- a/tests/modeltests/test_client/views.py +++ b/tests/modeltests/test_client/views.py @@ -7,10 +7,6 @@ from django.newforms.forms import Form from django.newforms import fields from django.shortcuts import render_to_response -def no_template_view(request): - "A simple view that expects a GET request, and returns a rendered template" - return HttpResponse("No template used") - def get_view(request): "A simple view that expects a GET request, and returns a rendered template" t = Template('This is a test. {{ var }} is the value.', name='GET Template') diff --git a/tests/regressiontests/test_client_regress/__init__.py b/tests/regressiontests/test_client_regress/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tests/regressiontests/test_client_regress/models.py b/tests/regressiontests/test_client_regress/models.py new file mode 100644 index 0000000000..c39fafe314 --- /dev/null +++ b/tests/regressiontests/test_client_regress/models.py @@ -0,0 +1,136 @@ +""" +Regression tests for the Test Client, especially the customized assertions. + +""" +from django.test import Client, TestCase +from django.core import mail + +class AssertTemplateUsedTests(TestCase): + fixtures = ['testdata.json'] + + def test_no_context(self): + "Template usage assertions work then templates aren't in use" + response = self.client.get('/test_client_regress/no_template_view/') + + # Check that the no template case doesn't mess with the template assertions + self.assertTemplateNotUsed(response, 'GET Template') + + try: + self.assertTemplateUsed(response, 'GET Template') + except AssertionError, e: + self.assertEquals(str(e), "No templates used to render the response") + + def test_single_context(self): + "Template assertions work when there is a single context" + response = self.client.get('/test_client/post_view/', {}) + + # + try: + self.assertTemplateNotUsed(response, 'Empty GET Template') + except AssertionError, e: + self.assertEquals(str(e), "Template 'Empty GET Template' was used unexpectedly in rendering the response") + + try: + self.assertTemplateUsed(response, 'Empty POST Template') + except AssertionError, e: + self.assertEquals(str(e), "Template 'Empty POST Template' was not used to render the response. Actual template was 'Empty GET Template'") + + def test_multiple_context(self): + "Template assertions work when there are multiple contexts" + post_data = { + 'text': 'Hello World', + 'email': 'foo@example.com', + 'value': 37, + 'single': 'b', + 'multi': ('b','c','e') + } + response = self.client.post('/test_client/form_view_with_template/', post_data) + self.assertContains(response, 'POST data OK') + try: + self.assertTemplateNotUsed(response, "form_view.html") + except AssertionError, e: + self.assertEquals(str(e), "Template 'form_view.html' was used unexpectedly in rendering the response") + + try: + self.assertTemplateNotUsed(response, 'base.html') + except AssertionError, e: + self.assertEquals(str(e), "Template 'base.html' was used unexpectedly in rendering the response") + + try: + self.assertTemplateUsed(response, "Valid POST Template") + except AssertionError, e: + self.assertEquals(str(e), "Template 'Valid POST Template' was not one of the templates used to render the response. Templates used: ['form_view.html', 'base.html']") + +class AssertFormErrorTests(TestCase): + def test_unknown_form(self): + "An assertion is raised if the form name is unknown" + post_data = { + 'text': 'Hello World', + 'email': 'not an email address', + 'value': 37, + 'single': 'b', + 'multi': ('b','c','e') + } + response = self.client.post('/test_client/form_view/', post_data) + self.assertEqual(response.status_code, 200) + self.assertTemplateUsed(response, "Invalid POST Template") + + try: + self.assertFormError(response, 'wrong_form', 'some_field', 'Some error.') + except AssertionError, e: + self.assertEqual(str(e), "The form 'wrong_form' was not used to render the response") + + def test_unknown_field(self): + "An assertion is raised if the field name is unknown" + post_data = { + 'text': 'Hello World', + 'email': 'not an email address', + 'value': 37, + 'single': 'b', + 'multi': ('b','c','e') + } + response = self.client.post('/test_client/form_view/', post_data) + self.assertEqual(response.status_code, 200) + self.assertTemplateUsed(response, "Invalid POST Template") + + try: + self.assertFormError(response, 'form', 'some_field', 'Some error.') + except AssertionError, e: + self.assertEqual(str(e), "The form 'form' in context 0 does not contain the field 'some_field'") + + def test_noerror_field(self): + "An assertion is raised if the field doesn't have any errors" + post_data = { + 'text': 'Hello World', + 'email': 'not an email address', + 'value': 37, + 'single': 'b', + 'multi': ('b','c','e') + } + response = self.client.post('/test_client/form_view/', post_data) + self.assertEqual(response.status_code, 200) + self.assertTemplateUsed(response, "Invalid POST Template") + + try: + self.assertFormError(response, 'form', 'value', 'Some error.') + except AssertionError, e: + self.assertEqual(str(e), "The field 'value' on form 'form' in context 0 contains no errors") + + def test_unknown_error(self): + "An assertion is raised if the field doesn't contain the provided error" + post_data = { + 'text': 'Hello World', + 'email': 'not an email address', + 'value': 37, + 'single': 'b', + 'multi': ('b','c','e') + } + response = self.client.post('/test_client/form_view/', post_data) + self.assertEqual(response.status_code, 200) + self.assertTemplateUsed(response, "Invalid POST Template") + + try: + self.assertFormError(response, 'form', 'email', 'Some error.') + except AssertionError, e: + self.assertEqual(str(e), "The field 'email' on form 'form' in context 0 does not contain the error 'Some error.' (actual errors: [u'Enter a valid e-mail address.'])") + diff --git a/tests/regressiontests/test_client_regress/urls.py b/tests/regressiontests/test_client_regress/urls.py new file mode 100644 index 0000000000..e9cd0aea15 --- /dev/null +++ b/tests/regressiontests/test_client_regress/urls.py @@ -0,0 +1,7 @@ +from django.conf.urls.defaults import * +from django.views.generic.simple import redirect_to +import views + +urlpatterns = patterns('', + (r'^no_template_view/$', views.no_template_view), +) diff --git a/tests/regressiontests/test_client_regress/views.py b/tests/regressiontests/test_client_regress/views.py new file mode 100644 index 0000000000..d8dd2b349c --- /dev/null +++ b/tests/regressiontests/test_client_regress/views.py @@ -0,0 +1,8 @@ +from django.core.mail import EmailMessage, SMTPConnection +from django.http import HttpResponse +from django.shortcuts import render_to_response + +def no_template_view(request): + "A simple view that expects a GET request, and returns a rendered template" + return HttpResponse("No template used") + diff --git a/tests/urls.py b/tests/urls.py index 9dcdca944e..dd475b0ea7 100644 --- a/tests/urls.py +++ b/tests/urls.py @@ -3,6 +3,7 @@ from django.conf.urls.defaults import * urlpatterns = patterns('', # test_client modeltest urls (r'^test_client/', include('modeltests.test_client.urls')), + (r'^test_client_regress/', include('regressiontests.test_client_regress.urls')), # Always provide the auth system login and logout views (r'^accounts/login/$', 'django.contrib.auth.views.login', {'template_name': 'login.html'}),