diff --git a/django/test/testcases.py b/django/test/testcases.py index dcab078553..95a6d23cee 100644 --- a/django/test/testcases.py +++ b/django/test/testcases.py @@ -12,6 +12,7 @@ from django.http import QueryDict from django.test import _doctest as doctest from django.test.client import Client from django.utils import simplejson +from django.utils.encoding import smart_str normalize_long_ints = lambda s: re.sub(r'(?<![\w])(\d+)L(?![\w])', '\\1', s) @@ -264,6 +265,7 @@ class TestCase(unittest.TestCase): self.assertEqual(response.status_code, status_code, "Couldn't retrieve page: Response code was %d (expected %d)'" % (response.status_code, status_code)) + text = smart_str(text, response._charset) real_count = response.content.count(text) if count is not None: self.assertEqual(real_count, count, @@ -282,8 +284,9 @@ class TestCase(unittest.TestCase): self.assertEqual(response.status_code, status_code, "Couldn't retrieve page: Response code was %d (expected %d)'" % (response.status_code, status_code)) - self.assertEqual(response.content.count(text), 0, - "Response should not contain '%s'" % text) + text = smart_str(text, response._charset) + self.assertEqual(response.content.count(text), + 0, "Response should not contain '%s'" % text) def assertFormError(self, response, form, field, errors): """ diff --git a/tests/regressiontests/test_client_regress/models.py b/tests/regressiontests/test_client_regress/models.py index 98c61523a4..fa12c5d69a 100644 --- a/tests/regressiontests/test_client_regress/models.py +++ b/tests/regressiontests/test_client_regress/models.py @@ -1,3 +1,4 @@ +# -*- coding: utf-8 -*- """ Regression tests for the Test Client, especially the customized assertions. """ @@ -10,6 +11,13 @@ from django.core.exceptions import SuspiciousOperation from django.template import TemplateDoesNotExist, TemplateSyntaxError class AssertContainsTests(TestCase): + def setUp(self): + self.old_templates = settings.TEMPLATE_DIRS + settings.TEMPLATE_DIRS = (os.path.join(os.path.dirname(__file__), 'templates'),) + + def tearDown(self): + settings.TEMPLATE_DIRS = self.old_templates + def test_contains(self): "Responses can be inspected for content, including counting repeated substrings" response = self.client.get('/test_client_regress/no_template_view/') @@ -56,6 +64,20 @@ class AssertContainsTests(TestCase): except AssertionError, e: self.assertEquals(str(e), "Found 0 instances of 'thrice' in response (expected 3)") + def test_unicode_contains(self): + "Unicode characters can be found in template context" + #Regression test for #10183 + r = self.client.get('/test_client_regress/check_unicode/') + self.assertContains(r, u'さかき') + self.assertContains(r, '\xe5\xb3\xa0'.decode('utf-8')) + + def test_unicode_not_contains(self): + "Unicode characters can be searched for, and not found in template context" + #Regression test for #10183 + r = self.client.get('/test_client_regress/check_unicode/') + self.assertNotContains(r, u'はたけ') + self.assertNotContains(r, '\xe3\x81\xaf\xe3\x81\x9f\xe3\x81\x91'.decode('utf-8')) + class AssertTemplateUsedTests(TestCase): fixtures = ['testdata.json'] diff --git a/tests/regressiontests/test_client_regress/templates/unicode.html b/tests/regressiontests/test_client_regress/templates/unicode.html new file mode 100644 index 0000000000..bdb6c91a8f --- /dev/null +++ b/tests/regressiontests/test_client_regress/templates/unicode.html @@ -0,0 +1,5 @@ +* 峠 (とうげ tōge "mountain pass") +* 榊 (さかき sakaki "tree, genus Cleyera") +* 辻 (つじ tsuji "crossroads, street") +* 働 (どう dō, はたら hatara(ku) "work") +* 腺 (せん sen, "gland") diff --git a/tests/regressiontests/test_client_regress/urls.py b/tests/regressiontests/test_client_regress/urls.py index ca21e18817..40aaf07217 100644 --- a/tests/regressiontests/test_client_regress/urls.py +++ b/tests/regressiontests/test_client_regress/urls.py @@ -9,4 +9,5 @@ urlpatterns = patterns('', (r'^login_protected_redirect_view/$', views.login_protected_redirect_view), (r'^set_session/$', views.set_session_view), (r'^check_session/$', views.check_session_view), + (r'^check_unicode/$', views.return_unicode), ) diff --git a/tests/regressiontests/test_client_regress/views.py b/tests/regressiontests/test_client_regress/views.py index 9cd786d86b..6d0972add2 100644 --- a/tests/regressiontests/test_client_regress/views.py +++ b/tests/regressiontests/test_client_regress/views.py @@ -1,6 +1,7 @@ from django.contrib.auth.decorators import login_required from django.http import HttpResponse, HttpResponseRedirect from django.core.exceptions import SuspiciousOperation +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" @@ -43,3 +44,6 @@ def set_session_view(request): def check_session_view(request): "A view that reads a session variable" return HttpResponse(request.session.get('session_var', 'NO')) + +def return_unicode(request): + return render_to_response('unicode.html')