aboutsummaryrefslogtreecommitdiffstats
path: root/tests/tests.py
diff options
context:
space:
mode:
Diffstat (limited to 'tests/tests.py')
-rw-r--r--tests/tests.py101
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'])