diff --git a/debug_toolbar/middleware.py b/debug_toolbar/middleware.py index a53bda8d4..a42bcd912 100644 --- a/debug_toolbar/middleware.py +++ b/debug_toolbar/middleware.py @@ -112,9 +112,9 @@ def generate_server_timing_header(response, panels): continue for key, record in stats.items(): - # example: `SQLPanel_sql_time=0; "SQL 0 queries"` + # example: `SQLPanel_sql_time;dur=0;desc="SQL 0 queries"` data.append( - '{}_{}={}; "{}"'.format( + '{}_{};dur={};desc="{}"'.format( panel.panel_id, key, record.get("value"), record.get("title") ) ) diff --git a/tests/test_integration.py b/tests/test_integration.py index 3cbdc6ef3..0adbdb03c 100644 --- a/tests/test_integration.py +++ b/tests/test_integration.py @@ -1,4 +1,5 @@ import os +import re import unittest import html5lib @@ -92,6 +93,7 @@ class DebugToolbarIntegrationTestCase(TestCase): def test_middleware(self): response = self.client.get("/execute_sql/") self.assertEqual(response.status_code, 200) + self.assertContains(response, "djDebug") @override_settings(DEFAULT_CHARSET="iso-8859-1") def test_non_utf8_charset(self): @@ -245,6 +247,20 @@ def test_incercept_redirects(self): # Link to LOCATION header. self.assertIn(b'href="/regular/redirect/"', response.content) + def test_server_timing_headers(self): + response = self.client.get("/execute_sql/") + server_timing = response["Server-Timing"] + expected_partials = [ + r'TimerPanel_utime;dur=(\d)*(\.(\d)*)?;desc="User CPU time", ', + r'TimerPanel_stime;dur=(\d)*(\.(\d)*)?;desc="System CPU time", ', + r'TimerPanel_total;dur=(\d)*(\.(\d)*)?;desc="Total CPU time", ', + r'TimerPanel_total_time;dur=(\d)*(\.(\d)*)?;desc="Elapsed time", ', + r'SQLPanel_sql_time;dur=(\d)*(\.(\d)*)?;desc="SQL 1 queries", ', + r'CachePanel_total_time;dur=0;desc="Cache 0 Calls"', + ] + for expected in expected_partials: + self.assertTrue(re.compile(expected).search(server_timing)) + @unittest.skipIf(webdriver is None, "selenium isn't installed") @unittest.skipUnless( diff --git a/tests/views.py b/tests/views.py index 8fba6013c..6f9e5fb1b 100644 --- a/tests/views.py +++ b/tests/views.py @@ -1,5 +1,5 @@ from django.contrib.auth.models import User -from django.http import HttpResponse, HttpResponseRedirect +from django.http import HttpResponseRedirect from django.shortcuts import render from django.template.response import TemplateResponse from django.views.decorators.cache import cache_page @@ -7,7 +7,7 @@ def execute_sql(request): list(User.objects.all()) - return HttpResponse() + return render(request, "base.html") def regular_view(request, title): @@ -25,12 +25,12 @@ def new_user(request, username="joe"): def resolving_view(request, arg1, arg2): # see test_url_resolving in tests.py - return HttpResponse() + return render(request, "base.html") @cache_page(60) def cached_view(request): - return HttpResponse() + return render(request, "base.html") def regular_jinjia_view(request, title):