From 56394220d5d4ae443dfc0fb55f677099696a55bf Mon Sep 17 00:00:00 2001 From: Russell Keith-Magee Date: Fri, 20 Jul 2007 14:32:20 +0000 Subject: [PATCH] Fixed #4901 -- Modified assertContains to provide a default check of 'any instances of text in content'. Thanks for the suggestion, nis@superlativ.dk. git-svn-id: http://code.djangoproject.com/svn/django/trunk@5731 bcc190cf-cafb-0310-a4f2-bffc1f526a37 --- django/test/testcases.py | 14 +++++---- docs/testing.txt | 7 +++-- .../test_client_regress/models.py | 30 +++++++++++++++++++ .../test_client_regress/views.py | 2 +- 4 files changed, 44 insertions(+), 9 deletions(-) diff --git a/django/test/testcases.py b/django/test/testcases.py index e88741e94c..df583b3ce3 100644 --- a/django/test/testcases.py +++ b/django/test/testcases.py @@ -73,19 +73,23 @@ class TestCase(unittest.TestCase): "Couldn't retrieve redirection page '%s': response code was %d (expected %d)" % (path, redirect_response.status_code, target_status_code)) - def assertContains(self, response, text, count=1, status_code=200): + def assertContains(self, response, text, count=None, status_code=200): """Assert that a response indicates that a page was retreived successfully, (i.e., the HTTP status code was as expected), and that ``text`` occurs ``count`` - times in the content of the response. + times in the content of the response. If ``count`` is None, the count doesn't + matter - the assertion is true if the text occurs at least once in the response. """ self.assertEqual(response.status_code, status_code, "Couldn't retrieve page: Response code was %d (expected %d)'" % (response.status_code, status_code)) real_count = response.content.count(text) - self.assertEqual(real_count, count, - "Found %d instances of '%s' in response (expected %d)" % (real_count, text, count)) - + if count: + self.assertEqual(real_count, count, + "Found %d instances of '%s' in response (expected %d)" % (real_count, text, count)) + else: + self.assertTrue(real_count != 0, "Couldn't find '%s' in response" % text) + def assertFormError(self, response, form, field, errors): "Assert that a form used to render the response has a specific field error" if not response.context: diff --git a/docs/testing.txt b/docs/testing.txt index 704d224daa..4158e9277a 100644 --- a/docs/testing.txt +++ b/docs/testing.txt @@ -481,10 +481,11 @@ Normal Python unit tests have a wide range of assertions, such as ``django.TestCase`` adds to these, providing some assertions that can be useful in testing the behavior of web sites. -``assertContains(response, text, count=1, status_code=200)`` +``assertContains(response, text, count=None, status_code=200)`` Assert that a response indicates that a page could be retrieved and - produced the nominated status code, and that ``text`` occurs ``count`` - times in the content of the response. + produced the nominated status code, and that ``text`` in the content + of the response. If ``count`` is provided, ``text`` must occur exactly + ``count`` times in the response. ``assertFormError(response, form, field, errors)`` Assert that a field on a form raised the provided list of errors when diff --git a/tests/regressiontests/test_client_regress/models.py b/tests/regressiontests/test_client_regress/models.py index f03615e961..5e1c562daa 100644 --- a/tests/regressiontests/test_client_regress/models.py +++ b/tests/regressiontests/test_client_regress/models.py @@ -6,6 +6,36 @@ from django.test import Client, TestCase from django.core import mail import os +class AssertContainsTests(TestCase): + def test_contains(self): + "Reponses can be inspected for content, including counting repeated substrings" + response = self.client.get('/test_client_regress/no_template_view/') + + self.assertContains(response, 'once') + self.assertContains(response, 'once', 1) + self.assertContains(response, 'twice') + self.assertContains(response, 'twice', 2) + + try: + self.assertContains(response, 'once', 2) + except AssertionError, e: + self.assertEquals(str(e), "Found 1 instances of 'once' in response (expected 2)") + + try: + self.assertContains(response, 'twice', 1) + except AssertionError, e: + self.assertEquals(str(e), "Found 2 instances of 'twice' in response (expected 1)") + + try: + self.assertContains(response, 'thrice') + except AssertionError, e: + self.assertEquals(str(e), "Couldn't find 'thrice' in response") + + try: + self.assertContains(response, 'thrice', 3) + except AssertionError, e: + self.assertEquals(str(e), "Found 0 instances of 'thrice' in response (expected 3)") + class AssertTemplateUsedTests(TestCase): fixtures = ['testdata.json'] diff --git a/tests/regressiontests/test_client_regress/views.py b/tests/regressiontests/test_client_regress/views.py index 8728ab0d7d..d3fbcf8448 100644 --- a/tests/regressiontests/test_client_regress/views.py +++ b/tests/regressiontests/test_client_regress/views.py @@ -4,7 +4,7 @@ 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") + return HttpResponse("No template used. Sample content: twice once twice. Content ends.") def file_upload_view(request): """