File: test_staticfiles.py

package info (click to toggle)
python-django-debug-toolbar 1%3A6.0.0-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 2,052 kB
  • sloc: python: 7,555; javascript: 636; makefile: 67; sh: 16
file content (131 lines) | stat: -rw-r--r-- 5,074 bytes parent folder | download
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)