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 122 123 124 125 126 127 128 129 130 131
|
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 StaticFilesPanel, URLMixin
from ..base import BaseTestCase
class StaticFilesPanelTestCase(BaseTestCase):
panel_id = StaticFilesPanel.panel_id
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.get_stats()["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.get_stats()["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):
return render(
request,
"staticfiles/path.html",
{
"paths": [
Path("additional_static/base.css"),
"additional_static/base.css",
"additional_static/base2.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.get_stats()["num_used"], 2)
self.assertIn(
'href="/static/additional_static/base.css"', self.panel.content, 1
)
self.assertIn(
'href="/static/additional_static/base2.css"', self.panel.content, 1
)
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[0] 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)
|