|
1 | 1 | from pathlib import Path
|
2 | 2 |
|
3 | 3 | from django.conf import settings
|
4 |
| -from django.contrib.staticfiles import finders |
| 4 | +from django.contrib.staticfiles import finders, storage |
5 | 5 | from django.shortcuts import render
|
6 | 6 | from django.test import AsyncRequestFactory, RequestFactory
|
7 | 7 |
|
| 8 | +from debug_toolbar.panels.staticfiles import URLMixin |
8 | 9 | from ..base import BaseTestCase
|
9 | 10 |
|
10 | 11 |
|
@@ -76,3 +77,46 @@ def get_response(request):
|
76 | 77 | self.panel.generate_stats(self.request, response)
|
77 | 78 | self.assertEqual(self.panel.num_used, 1)
|
78 | 79 | self.assertIn('"/static/additional_static/base.css"', self.panel.content)
|
| 80 | + |
| 81 | + def test_storage_state_preservation(self): |
| 82 | + """Ensure the URLMixin doesn't affect storage state""" |
| 83 | + original_storage = storage.staticfiles_storage |
| 84 | + original_attrs = dict(original_storage.__dict__) |
| 85 | + |
| 86 | + # Trigger mixin injection |
| 87 | + self.panel.ready() |
| 88 | + |
| 89 | + # Verify all original attributes are preserved |
| 90 | + self.assertEqual(original_attrs, dict(original_storage.__dict__)) |
| 91 | + |
| 92 | + def test_context_variable_lifecycle(self): |
| 93 | + """Test the request_id context variable lifecycle""" |
| 94 | + from debug_toolbar.panels.staticfiles import request_id_context_var |
| 95 | + |
| 96 | + # Should not raise when context not set |
| 97 | + url = storage.staticfiles_storage.url("test.css") |
| 98 | + self.assertTrue(url.startswith("/static/")) |
| 99 | + |
| 100 | + # Should track when context is set |
| 101 | + token = request_id_context_var.set("test-request-id") |
| 102 | + try: |
| 103 | + url = storage.staticfiles_storage.url("test.css") |
| 104 | + self.assertTrue(url.startswith("/static/")) |
| 105 | + # Verify file was tracked |
| 106 | + self.assertIn("test.css", [f.path for f in self.panel.used_paths]) |
| 107 | + finally: |
| 108 | + request_id_context_var.reset(token) |
| 109 | + |
| 110 | + def test_multiple_initialization(self): |
| 111 | + """Ensure multiple panel initializations don't stack URLMixin""" |
| 112 | + storage_class = storage.staticfiles_storage.__class__ |
| 113 | + |
| 114 | + # Initialize panel multiple times |
| 115 | + for _ in range(3): |
| 116 | + self.panel.ready() |
| 117 | + |
| 118 | + # Verify URLMixin appears exactly once in bases |
| 119 | + mixin_count = sum( |
| 120 | + 1 for base in storage_class.__bases__ if base == URLMixin |
| 121 | + ) |
| 122 | + self.assertEqual(mixin_count, 1) |
0 commit comments