From edcecaf0dea718a8fb216df478df0d151a9ba04d Mon Sep 17 00:00:00 2001 From: Claude Paroz Date: Sat, 27 Feb 2016 21:30:07 +0100 Subject: Fixed #19670 -- Applied CachedFilesMixin patterns to specific extensions Thanks Simon Meers for the initial patch, and Tim Graham for the review. --- .../project/documents/cached/test.js | 1 + tests/staticfiles_tests/storage.py | 14 +++++++++ tests/staticfiles_tests/test_storage.py | 36 ++++++++++++++++++++++ 3 files changed, 51 insertions(+) create mode 100644 tests/staticfiles_tests/project/documents/cached/test.js (limited to 'tests') diff --git a/tests/staticfiles_tests/project/documents/cached/test.js b/tests/staticfiles_tests/project/documents/cached/test.js new file mode 100644 index 0000000000..3d1c431aff --- /dev/null +++ b/tests/staticfiles_tests/project/documents/cached/test.js @@ -0,0 +1 @@ +myVar = url("import.css"); diff --git a/tests/staticfiles_tests/storage.py b/tests/staticfiles_tests/storage.py index 06caebfcd2..8c474591f3 100644 --- a/tests/staticfiles_tests/storage.py +++ b/tests/staticfiles_tests/storage.py @@ -63,3 +63,17 @@ class SimpleCachedStaticFilesStorage(CachedStaticFilesStorage): def file_hash(self, name, content=None): return 'deploy12345' + + +class ExtraPatternsCachedStaticFilesStorage(CachedStaticFilesStorage): + """ + A storage class to test pattern substitutions with more than one pattern + entry. The added pattern rewrites strings like "url(...)" to JS_URL("..."). + """ + patterns = tuple(CachedStaticFilesStorage.patterns) + ( + ( + "*.js", ( + (r"""(url\(['"]{0,1}\s*(.*?)["']{0,1}\))""", 'JS_URL("%s")'), + ), + ), + ) diff --git a/tests/staticfiles_tests/test_storage.py b/tests/staticfiles_tests/test_storage.py index bd636c4a8c..318b26c635 100644 --- a/tests/staticfiles_tests/test_storage.py +++ b/tests/staticfiles_tests/test_storage.py @@ -237,6 +237,38 @@ class TestCollectionCachedStorage(TestHashedFiles, CollectionTestCase): self.assertEqual(cache_key, 'staticfiles:821ea71ef36f95b3922a77f7364670e7') +@override_settings( + STATICFILES_STORAGE='staticfiles_tests.storage.ExtraPatternsCachedStaticFilesStorage', +) +class TestExtraPatternsCachedStorage(CollectionTestCase): + + def setUp(self): + storage.staticfiles_storage.hashed_files.clear() # avoid cache interference + super(TestExtraPatternsCachedStorage, self).setUp() + + def cached_file_path(self, path): + fullpath = self.render_template(self.static_template_snippet(path)) + return fullpath.replace(settings.STATIC_URL, '') + + def test_multi_extension_patterns(self): + """ + With storage classes having several file extension patterns, only the + files matching a specific file pattern should be affected by the + substitution (#19670). + """ + # CSS files shouldn't be touched by JS patterns. + relpath = self.cached_file_path("cached/import.css") + self.assertEqual(relpath, "cached/import.2b1d40b0bbd4.css") + with storage.staticfiles_storage.open(relpath) as relfile: + self.assertIn(b'import url("styles.bb84a0240107.css")', relfile.read()) + + # Confirm JS patterns have been applied to JS files. + relpath = self.cached_file_path("cached/test.js") + self.assertEqual(relpath, "cached/test.62789ffcd280.js") + with storage.staticfiles_storage.open(relpath) as relfile: + self.assertIn(b'JS_URL("import.2b1d40b0bbd4.css")', relfile.read()) + + @override_settings( STATICFILES_STORAGE='django.contrib.staticfiles.storage.ManifestStaticFilesStorage', ) @@ -320,6 +352,10 @@ class TestCollectionSimpleCachedStorage(CollectionTestCase): """ hashed_file_path = hashed_file_path + def setUp(self): + storage.staticfiles_storage.hashed_files.clear() # avoid cache interference + super(TestCollectionSimpleCachedStorage, self).setUp() + def test_template_tag_return(self): """ Test the CachedStaticFilesStorage backend. -- cgit v1.3