import os
import brotli
from django.core.files.base import ContentFile
from django.core.files.storage import get_storage_class
from django.test import TestCase
from django.test.utils import override_settings
from django.utils.functional import LazyObject
from compressor import storage
from compressor.conf import settings
from compressor.tests.test_base import css_tag
from compressor.tests.test_templatetags import render
class GzipStorage(LazyObject):
def _setup(self):
self._wrapped = get_storage_class(
"compressor.storage.GzipCompressorFileStorage"
)()
class BrotliStorage(LazyObject):
def _setup(self):
self._wrapped = get_storage_class(
"compressor.storage.BrotliCompressorFileStorage"
)()
@override_settings(COMPRESS_ENABLED=True)
class StorageTestCase(TestCase):
def setUp(self):
self.default_storage = storage.default_storage
storage.default_storage = GzipStorage()
storage.brotli_storage = BrotliStorage()
def tearDown(self):
storage.default_storage = self.default_storage
def test_gzip_storage(self):
storage.default_storage.save("test.txt", ContentFile("yeah yeah"))
self.assertTrue(
os.path.exists(os.path.join(settings.COMPRESS_ROOT, "test.txt"))
)
self.assertTrue(
os.path.exists(os.path.join(settings.COMPRESS_ROOT, "test.txt.gz"))
)
def test_brotli_storage(self):
payload = ",".join([str(i) for i in range(1000)]).encode()
chunk_size = 1024
storage.brotli_storage.save("test.txt", ContentFile(payload))
self.assertTrue(
os.path.exists(os.path.join(settings.COMPRESS_ROOT, "test.txt"))
)
self.assertTrue(
os.path.exists(os.path.join(settings.COMPRESS_ROOT, "test.txt.br"))
)
decompressed_data = b""
br_decompressor = brotli.Decompressor()
with open(os.path.join(settings.COMPRESS_ROOT, "test.txt.br"), "rb") as f:
for data in iter(lambda: f.read(chunk_size), b""):
decompressed_data += br_decompressor.process(data)
self.assertEqual(payload, decompressed_data)
def test_css_tag_with_storage(self):
template = """{% load compress %}{% compress css %}
{% endcompress %}
"""
context = {"STATIC_URL": settings.COMPRESS_URL}
out = css_tag("/static/CACHE/css/output.e701f86c6430.css")
self.assertEqual(out, render(template, context))
def test_duplicate_save_overwrites_same_file(self):
filename1 = self.default_storage.save("test.txt", ContentFile("yeah yeah"))
filename2 = self.default_storage.save("test.txt", ContentFile("yeah yeah"))
self.assertEqual(filename1, filename2)
self.assertNotIn("_", filename2)
def test_offline_manifest_storage(self):
storage.default_offline_manifest_storage.save(
"test.txt", ContentFile("yeah yeah")
)
self.assertTrue(
os.path.exists(os.path.join(settings.COMPRESS_ROOT, "CACHE", "test.txt"))
)
# Check that the file is stored at the same default location as before the new manifest storage.
self.assertTrue(self.default_storage.exists(os.path.join("CACHE", "test.txt")))