1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121
|
from pathlib import Path
from django.conf import settings
from django.contrib.staticfiles import finders, storage
from django.shortcuts import render
from django.test import AsyncRequestFactory, RequestFactory
from debug_toolbar.panels.staticfiles import URLMixin
from ..base import BaseTestCase
class StaticFilesPanelTestCase(BaseTestCase):
panel_id = "StaticFilesPanel"
def test_default_case(self):
response = self.panel.process_request(self.request)
self.panel.generate_stats(self.request, response)
content = self.panel.content
self.assertIn(
"django.contrib.staticfiles.finders.AppDirectoriesFinder", content
)
self.assertIn(
"django.contrib.staticfiles.finders.FileSystemFinder (2 files)", content
)
self.assertEqual(self.panel.num_used, 0)
self.assertNotEqual(self.panel.num_found, 0)
expected_apps = ["django.contrib.admin", "debug_toolbar"]
if settings.USE_GIS:
expected_apps = ["django.contrib.gis"] + expected_apps
self.assertEqual(self.panel.get_staticfiles_apps(), expected_apps)
self.assertEqual(
self.panel.get_staticfiles_dirs(), finders.FileSystemFinder().locations
)
async def test_store_staticfiles_with_async_context(self):
async def get_response(request):
# template contains one static file
return render(request, "staticfiles/async_static.html")
self._get_response = get_response
async_request = AsyncRequestFactory().get("/")
response = await self.panel.process_request(async_request)
self.panel.generate_stats(self.request, response)
self.assertEqual(self.panel.num_used, 1)
def test_insert_content(self):
"""
Test that the panel only inserts content after generate_stats and
not the process_request.
"""
response = self.panel.process_request(self.request)
# ensure the panel does not have content yet.
self.assertNotIn(
"django.contrib.staticfiles.finders.AppDirectoriesFinder",
self.panel.content,
)
self.panel.generate_stats(self.request, response)
# ensure the panel renders correctly.
content = self.panel.content
self.assertIn(
"django.contrib.staticfiles.finders.AppDirectoriesFinder", content
)
self.assertValidHTML(content)
def test_path(self):
def get_response(request):
# template contains one static file
return render(
request,
"staticfiles/path.html",
{"path": Path("additional_static/base.css")},
)
self._get_response = get_response
request = RequestFactory().get("/")
response = self.panel.process_request(request)
self.panel.generate_stats(self.request, response)
self.assertEqual(self.panel.num_used, 1)
self.assertIn('"/static/additional_static/base.css"', self.panel.content)
def test_storage_state_preservation(self):
"""Ensure the URLMixin doesn't affect storage state"""
original_storage = storage.staticfiles_storage
original_attrs = dict(original_storage.__dict__)
# Trigger mixin injection
self.panel.ready()
# Verify all original attributes are preserved
self.assertEqual(original_attrs, dict(original_storage.__dict__))
def test_context_variable_lifecycle(self):
"""Test the request_id context variable lifecycle"""
from debug_toolbar.panels.staticfiles import request_id_context_var
# Should not raise when context not set
url = storage.staticfiles_storage.url("test.css")
self.assertTrue(url.startswith("/static/"))
# Should track when context is set
token = request_id_context_var.set("test-request-id")
try:
url = storage.staticfiles_storage.url("test.css")
self.assertTrue(url.startswith("/static/"))
# Verify file was tracked
self.assertIn("test.css", [f.path for f in self.panel.used_paths])
finally:
request_id_context_var.reset(token)
def test_multiple_initialization(self):
"""Ensure multiple panel initializations don't stack URLMixin"""
storage_class = storage.staticfiles_storage.__class__
# Initialize panel multiple times
for _ in range(3):
self.panel.ready()
# Verify URLMixin appears exactly once in bases
mixin_count = sum(1 for base in storage_class.__bases__ if base == URLMixin)
self.assertEqual(mixin_count, 1)
|