add test for response with Vary headers case

This commit is contained in:
Ramiro Juan Nocelli 2025-10-14 00:49:07 +02:00
parent ec6612b7bc
commit 951d78a5d2
2 changed files with 46 additions and 10 deletions

View file

@ -20,7 +20,7 @@ from collections import defaultdict
from hashlib import md5
from django.conf import settings
from django.core.cache import cache, caches
from django.core.cache import caches
from django.http import HttpResponse, HttpResponseNotModified
from django.test import RequestFactory
from django.utils.http import http_date, parse_etags, parse_http_date_safe, quote_etag
@ -449,10 +449,7 @@ def _to_tuple(s):
def invalidate_view_cache(
path=None,
request=None,
vary_headers=None,
key_prefix=None,
path=None, request=None, vary_headers=None, key_prefix=None, cache=None
):
"""
This function first creates a fake WSGIRequest to compute the cache key.
@ -479,7 +476,12 @@ def invalidate_view_cache(
if vary_headers:
request.META.update(vary_headers)
cache_key = get_cache_key(request, key_prefix=key_prefix, ignore_headers=True)
if cache is None:
cache = caches[settings.CACHE_MIDDLEWARE_ALIAS]
cache_key = get_cache_key(
request, key_prefix=key_prefix, ignore_headers=True, cache=cache
)
if cache_key is None:
return 0

42
tests/cache/tests.py vendored
View file

@ -63,6 +63,7 @@ from django.utils.cache import (
patch_vary_headers,
)
from django.views.decorators.cache import cache_control, cache_page
from django.views.decorators.vary import vary_on_headers
from .models import Poll, expensive_calculation
@ -2631,14 +2632,16 @@ class CacheMiddlewareTest(SimpleTestCase):
view = cache_page(10)(hello_world_view)
request = self.factory.get("/view/")
_ = view(request, "0")
cache_key = get_cache_key(request=request, key_prefix="", ignore_headers=True)
cache_key = get_cache_key(
request=request, key_prefix="", ignore_headers=True, cache=cache
)
cached_response = cache.get(cache_key)
# Verify request.content has been chached
self.assertEqual(cached_response.content, b"Hello World 0")
# Delete cache key/value
invalidate_view_cache(request=request, key_prefix="")
invalidate_view_cache(request=request, key_prefix="", cache=cache)
cached_response = cache.get(cache_key)
# Confirm key/value has been deleted from cache
@ -2650,14 +2653,45 @@ class CacheMiddlewareTest(SimpleTestCase):
path = "/view/"
request = self.factory.get(path)
_ = view(request, "0")
cache_key = get_cache_key(request=request, key_prefix="", ignore_headers=True)
cache_key = get_cache_key(
request=request, key_prefix="", ignore_headers=True, cache=cache
)
cached_response = cache.get(cache_key)
# Verify request.content has been chached
self.assertEqual(cached_response.content, b"Hello World 0")
# Delete cache key/value
invalidate_view_cache(path=path, key_prefix="")
invalidate_view_cache(path=path, key_prefix="", cache=cache)
cached_response = cache.get(cache_key)
# Confirm key/value has been deleted from cache
self.assertIsNone(cached_response)
def test_invalidate_view_decorator_cache_from_path_with_vary_headers(self):
"""Invalidate cache key/value from path with Vary headers"""
# Cache view and inject Vary headers to Response object
view = cache_page(10, key_prefix="")(
vary_on_headers("Accept-Encoding")(hello_world_view)
)
path = "/view/"
request = self.factory.get(path)
response = view(request, "0")
# Check response headers
self.assertTrue(response.has_header("Vary"))
cache_key = get_cache_key(
request=request, key_prefix="", ignore_headers=False, cache=cache
)
cached_response = cache.get(cache_key)
# Verify request.content has been chached
self.assertEqual(cached_response.content, b"Hello World 0")
# Delete cache key/value
invalidate_view_cache(path=path, key_prefix="", cache=cache)
cached_response = cache.get(cache_key)
# Confirm key/value has been deleted from cache