diff options
Diffstat (limited to 'tests/tests.py')
| -rw-r--r-- | tests/tests.py | 101 |
1 files changed, 92 insertions, 9 deletions
diff --git a/tests/tests.py b/tests/tests.py index 6883428..86622fc 100644 --- a/tests/tests.py +++ b/tests/tests.py @@ -2,7 +2,9 @@ from __future__ import unicode_literals +import logging import threading +from xml.etree import ElementTree as ET import django from django.conf import settings @@ -10,11 +12,14 @@ from django.contrib.auth.models import User from django.db import connection from django.http import HttpResponse from django.test import TestCase, RequestFactory +from django.test.utils import override_settings from django.template import Template, Context from django.utils import six from django.utils import unittest from debug_toolbar.middleware import DebugToolbarMiddleware +from debug_toolbar.panels.logger import (LoggingPanel, + MESSAGE_IF_STRING_REPRESENTATION_INVALID) from debug_toolbar.panels.sql import SQLDebugPanel from debug_toolbar.panels.request_vars import RequestVarsDebugPanel from debug_toolbar.panels.template import TemplateDebugPanel @@ -26,6 +31,7 @@ rf = RequestFactory() class BaseTestCase(TestCase): + def setUp(self): request = rf.get('/') response = HttpResponse() @@ -40,6 +46,7 @@ class BaseTestCase(TestCase): class DebugToolbarTestCase(BaseTestCase): + urls = 'tests.urls' def test_middleware(self): @@ -163,21 +170,39 @@ class DebugToolbarTestCase(BaseTestCase): self.assertEqual(stats['view_kwargs'], 'None') self.assertEqual(stats['view_func'], '<no view>') + +@override_settings(DEBUG=True, INTERNAL_IPS=['127.0.0.1']) +class DebugToolbarIntegrationTestCase(TestCase): + + urls = 'tests.urls' + + @override_settings(DEFAULT_CHARSET='iso-8859-1') def test_non_utf8_charset(self): - with self.settings(DEBUG=True, - DEFAULT_CHARSET='iso-8859-1', - INTERNAL_IPS=['127.0.0.1']): + response = self.client.get('/regular/ASCII/') + self.assertContains(response, 'ASCII') # template + self.assertContains(response, 'djDebug') # toolbar + + response = self.client.get('/regular/LÀTÍN/') + self.assertContains(response, 'LÀTÍN') # template + self.assertContains(response, 'djDebug') # toolbar + + def test_non_ascii_session(self): + response = self.client.get('/set_session/') + self.assertContains(response, 'où') + if not six.PY3: + self.assertContains(response, 'là') - response = self.client.get('/regular/ASCII/') - self.assertContains(response, 'ASCII') # template - self.assertContains(response, 'djDebug') # toolbar + def test_object_with_non_ascii_repr_in_context(self): + response = self.client.get('/non_ascii_context/') + self.assertContains(response, 'nôt åscíì') - response = self.client.get('/regular/LÀTÍN/') - self.assertContains(response, 'LÀTÍN') # template - self.assertContains(response, 'djDebug') # toolbar + def test_xml_validation(self): + response = self.client.get('/regular/XML/') + ET.fromstring(response.content) # shouldn't raise ParseError class DebugToolbarNameFromObjectTest(BaseTestCase): + def test_func(self): def x(): return 1 @@ -196,6 +221,7 @@ class DebugToolbarNameFromObjectTest(BaseTestCase): class SQLPanelTestCase(BaseTestCase): + def test_recording(self): panel = self.toolbar.get_panel(SQLDebugPanel) self.assertEqual(len(panel._queries), 0) @@ -213,6 +239,18 @@ class SQLPanelTestCase(BaseTestCase): # ensure the stacktrace is populated self.assertTrue(len(query[1]['stacktrace']) > 0) + def test_non_ascii_query(self): + panel = self.toolbar.get_panel(SQLDebugPanel) + self.assertEqual(len(panel._queries), 0) + + # non-ASCII query + list(User.objects.extra(where=["username = 'café'"])) + self.assertEqual(len(panel._queries), 1) + + # non-ASCII parameters + list(User.objects.filter(username='café')) + self.assertEqual(len(panel._queries), 2) + @unittest.skipUnless(connection.vendor=='postgresql', 'Test valid only on PostgreSQL') def test_erroneous_query(self): @@ -246,6 +284,7 @@ class SQLPanelTestCase(BaseTestCase): class TemplatePanelTestCase(BaseTestCase): + def test_queryset_hook(self): template_panel = self.toolbar.get_panel(TemplateDebugPanel) sql_panel = self.toolbar.get_panel(SQLDebugPanel) @@ -263,3 +302,47 @@ class TemplatePanelTestCase(BaseTestCase): ctx = template_panel.templates[0]['context'][base_ctx_idx] self.assertIn('<<queryset of auth.User>>', ctx) self.assertIn('<<triggers database query>>', ctx) + + +class LoggingPanelTestCase(BaseTestCase): + def test_happy_case(self): + logger = logging.getLogger(__name__) + logger.info('Nothing to see here, move along!') + + logging_panel = self.toolbar.get_panel(LoggingPanel) + logging_panel.process_response(None, None) + records = logging_panel.get_stats()['records'] + + self.assertEqual(1, len(records)) + self.assertEqual('Nothing to see here, move along!', + records[0]['message']) + + def test_formatting(self): + logger = logging.getLogger(__name__) + logger.info('There are %d %s', 5, 'apples') + + logging_panel = self.toolbar.get_panel(LoggingPanel) + logging_panel.process_response(None, None) + records = logging_panel.get_stats()['records'] + + self.assertEqual(1, len(records)) + self.assertEqual('There are 5 apples', + records[0]['message']) + + def test_failing_formatting(self): + class BadClass(object): + def __str__(self): + raise Exception('Please not stringify me!') + + logger = logging.getLogger(__name__) + + # should not raise exception, but fail silently + logger.debug('This class is misbehaving: %s', BadClass()) + + logging_panel = self.toolbar.get_panel(LoggingPanel) + logging_panel.process_response(None, None) + records = logging_panel.get_stats()['records'] + + self.assertEqual(1, len(records)) + self.assertEqual(MESSAGE_IF_STRING_REPRESENTATION_INVALID, + records[0]['message']) |
