diff options
Diffstat (limited to 'tests/staticfiles_tests/test_storage.py')
| -rw-r--r-- | tests/staticfiles_tests/test_storage.py | 295 |
1 files changed, 165 insertions, 130 deletions
diff --git a/tests/staticfiles_tests/test_storage.py b/tests/staticfiles_tests/test_storage.py index 62484205b7..513d0cf010 100644 --- a/tests/staticfiles_tests/test_storage.py +++ b/tests/staticfiles_tests/test_storage.py @@ -22,7 +22,7 @@ from .settings import TEST_ROOT def hashed_file_path(test, path): fullpath = test.render_template(test.static_template_snippet(path)) - return fullpath.replace(settings.STATIC_URL, '') + return fullpath.replace(settings.STATIC_URL, "") class TestHashedFiles: @@ -40,10 +40,16 @@ class TestHashedFiles: pass def test_template_tag_return(self): - self.assertStaticRaises(ValueError, "does/not/exist.png", "/static/does/not/exist.png") + self.assertStaticRaises( + ValueError, "does/not/exist.png", "/static/does/not/exist.png" + ) self.assertStaticRenders("test/file.txt", "/static/test/file.dad0999e4f8f.txt") - self.assertStaticRenders("test/file.txt", "/static/test/file.dad0999e4f8f.txt", asvar=True) - self.assertStaticRenders("cached/styles.css", "/static/cached/styles.5e0040571e1a.css") + self.assertStaticRenders( + "test/file.txt", "/static/test/file.dad0999e4f8f.txt", asvar=True + ) + self.assertStaticRenders( + "cached/styles.css", "/static/cached/styles.5e0040571e1a.css" + ) self.assertStaticRenders("path/", "/static/path/") self.assertStaticRenders("path/?query", "/static/path/?query") self.assertPostCondition() @@ -62,18 +68,20 @@ class TestHashedFiles: self.assertEqual(relpath, "cached/css/ignored.554da52152af.css") with storage.staticfiles_storage.open(relpath) as relfile: content = relfile.read() - self.assertIn(b'#foobar', content) - self.assertIn(b'http:foobar', content) - self.assertIn(b'https:foobar', content) - self.assertIn(b'data:foobar', content) - self.assertIn(b'chrome:foobar', content) - self.assertIn(b'//foobar', content) + self.assertIn(b"#foobar", content) + self.assertIn(b"http:foobar", content) + self.assertIn(b"https:foobar", content) + self.assertIn(b"data:foobar", content) + self.assertIn(b"chrome:foobar", content) + self.assertIn(b"//foobar", content) self.assertPostCondition() def test_path_with_querystring(self): relpath = self.hashed_file_path("cached/styles.css?spam=eggs") self.assertEqual(relpath, "cached/styles.5e0040571e1a.css?spam=eggs") - with storage.staticfiles_storage.open("cached/styles.5e0040571e1a.css") as relfile: + with storage.staticfiles_storage.open( + "cached/styles.5e0040571e1a.css" + ) as relfile: content = relfile.read() self.assertNotIn(b"cached/other.css", content) self.assertIn(b"other.d41d8cd98f00.css", content) @@ -82,7 +90,9 @@ class TestHashedFiles: def test_path_with_fragment(self): relpath = self.hashed_file_path("cached/styles.css#eggs") self.assertEqual(relpath, "cached/styles.5e0040571e1a.css#eggs") - with storage.staticfiles_storage.open("cached/styles.5e0040571e1a.css") as relfile: + with storage.staticfiles_storage.open( + "cached/styles.5e0040571e1a.css" + ) as relfile: content = relfile.read() self.assertNotIn(b"cached/other.css", content) self.assertIn(b"other.d41d8cd98f00.css", content) @@ -93,11 +103,16 @@ class TestHashedFiles: self.assertEqual(relpath, "cached/css/fragments.a60c0e74834f.css") with storage.staticfiles_storage.open(relpath) as relfile: content = relfile.read() - self.assertIn(b'fonts/font.b9b105392eb8.eot?#iefix', content) - self.assertIn(b'fonts/font.b8d603e42714.svg#webfontIyfZbseF', content) - self.assertIn(b'fonts/font.b8d603e42714.svg#path/to/../../fonts/font.svg', content) - self.assertIn(b'data:font/woff;charset=utf-8;base64,d09GRgABAAAAADJoAA0AAAAAR2QAAQAAAAAAAAAAAAA', content) - self.assertIn(b'#default#VML', content) + self.assertIn(b"fonts/font.b9b105392eb8.eot?#iefix", content) + self.assertIn(b"fonts/font.b8d603e42714.svg#webfontIyfZbseF", content) + self.assertIn( + b"fonts/font.b8d603e42714.svg#path/to/../../fonts/font.svg", content + ) + self.assertIn( + b"data:font/woff;charset=utf-8;base64,d09GRgABAAAAADJoAA0AAAAAR2QAAQAAAAAAAAAAAAA", + content, + ) + self.assertIn(b"#default#VML", content) self.assertPostCondition() def test_template_tag_absolute(self): @@ -109,7 +124,7 @@ class TestHashedFiles: self.assertIn(b"/static/cached/styles.5e0040571e1a.css", content) self.assertNotIn(b"/static/styles_root.css", content) self.assertIn(b"/static/styles_root.401f2509a628.css", content) - self.assertIn(b'/static/cached/img/relative.acae32e4532b.png', content) + self.assertIn(b"/static/cached/img/relative.acae32e4532b.png", content) self.assertPostCondition() def test_template_tag_absolute_root(self): @@ -131,7 +146,7 @@ class TestHashedFiles: content = relfile.read() self.assertNotIn(b"../cached/styles.css", content) self.assertNotIn(b'@import "styles.css"', content) - self.assertNotIn(b'url(img/relative.png)', content) + self.assertNotIn(b"url(img/relative.png)", content) self.assertIn(b'url("img/relative.acae32e4532b.png")', content) self.assertIn(b"../cached/styles.5e0040571e1a.css", content) self.assertPostCondition() @@ -149,7 +164,7 @@ class TestHashedFiles: self.assertEqual(relpath, "cached/css/window.5d5c10836967.css") with storage.staticfiles_storage.open(relpath) as relfile: content = relfile.read() - self.assertNotIn(b'url(img/window.png)', content) + self.assertNotIn(b"url(img/window.png)", content) self.assertIn(b'url("img/window.acae32e4532b.png")', content) self.assertPostCondition() @@ -161,14 +176,14 @@ class TestHashedFiles: self.assertPostCondition() @override_settings( - STATICFILES_DIRS=[os.path.join(TEST_ROOT, 'project', 'loop')], - STATICFILES_FINDERS=['django.contrib.staticfiles.finders.FileSystemFinder'], + STATICFILES_DIRS=[os.path.join(TEST_ROOT, "project", "loop")], + STATICFILES_FINDERS=["django.contrib.staticfiles.finders.FileSystemFinder"], ) def test_import_loop(self): finders.get_finder.cache_clear() err = StringIO() - with self.assertRaisesMessage(RuntimeError, 'Max post-process passes exceeded'): - call_command('collectstatic', interactive=False, verbosity=0, stderr=err) + with self.assertRaisesMessage(RuntimeError, "Max post-process passes exceeded"): + call_command("collectstatic", interactive=False, verbosity=0, stderr=err) self.assertEqual("Post-processing 'All' failed!\n\n", err.getvalue()) self.assertPostCondition() @@ -183,24 +198,28 @@ class TestHashedFiles: therefore we check by verifying behavior on a second run. """ collectstatic_args = { - 'interactive': False, - 'verbosity': 0, - 'link': False, - 'clear': False, - 'dry_run': False, - 'post_process': True, - 'use_default_ignore_patterns': True, - 'ignore_patterns': ['*.ignoreme'], + "interactive": False, + "verbosity": 0, + "link": False, + "clear": False, + "dry_run": False, + "post_process": True, + "use_default_ignore_patterns": True, + "ignore_patterns": ["*.ignoreme"], } collectstatic_cmd = CollectstaticCommand() collectstatic_cmd.set_options(**collectstatic_args) stats = collectstatic_cmd.collect() - self.assertIn(os.path.join('cached', 'css', 'window.css'), stats['post_processed']) - self.assertIn(os.path.join('cached', 'css', 'img', 'window.png'), stats['unmodified']) - self.assertIn(os.path.join('test', 'nonascii.css'), stats['post_processed']) + self.assertIn( + os.path.join("cached", "css", "window.css"), stats["post_processed"] + ) + self.assertIn( + os.path.join("cached", "css", "img", "window.png"), stats["unmodified"] + ) + self.assertIn(os.path.join("test", "nonascii.css"), stats["post_processed"]) # No file should be yielded twice. - self.assertCountEqual(stats['post_processed'], set(stats['post_processed'])) + self.assertCountEqual(stats["post_processed"], set(stats["post_processed"])) self.assertPostCondition() def test_css_import_case_insensitive(self): @@ -213,56 +232,56 @@ class TestHashedFiles: self.assertPostCondition() def test_css_source_map(self): - relpath = self.hashed_file_path('cached/source_map.css') - self.assertEqual(relpath, 'cached/source_map.b2fceaf426aa.css') + relpath = self.hashed_file_path("cached/source_map.css") + self.assertEqual(relpath, "cached/source_map.b2fceaf426aa.css") with storage.staticfiles_storage.open(relpath) as relfile: content = relfile.read() - self.assertNotIn(b'/*# sourceMappingURL=source_map.css.map */', content) + self.assertNotIn(b"/*# sourceMappingURL=source_map.css.map */", content) self.assertIn( - b'/*# sourceMappingURL=source_map.css.99914b932bd3.map */', + b"/*# sourceMappingURL=source_map.css.99914b932bd3.map */", content, ) self.assertPostCondition() def test_css_source_map_sensitive(self): - relpath = self.hashed_file_path('cached/source_map_sensitive.css') - self.assertEqual(relpath, 'cached/source_map_sensitive.456683f2106f.css') + relpath = self.hashed_file_path("cached/source_map_sensitive.css") + self.assertEqual(relpath, "cached/source_map_sensitive.456683f2106f.css") with storage.staticfiles_storage.open(relpath) as relfile: content = relfile.read() - self.assertIn(b'/*# sOuRcEMaPpInGURL=source_map.css.map */', content) + self.assertIn(b"/*# sOuRcEMaPpInGURL=source_map.css.map */", content) self.assertNotIn( - b'/*# sourceMappingURL=source_map.css.99914b932bd3.map */', + b"/*# sourceMappingURL=source_map.css.99914b932bd3.map */", content, ) self.assertPostCondition() def test_js_source_map(self): - relpath = self.hashed_file_path('cached/source_map.js') - self.assertEqual(relpath, 'cached/source_map.cd45b8534a87.js') + relpath = self.hashed_file_path("cached/source_map.js") + self.assertEqual(relpath, "cached/source_map.cd45b8534a87.js") with storage.staticfiles_storage.open(relpath) as relfile: content = relfile.read() - self.assertNotIn(b'//# sourceMappingURL=source_map.js.map', content) + self.assertNotIn(b"//# sourceMappingURL=source_map.js.map", content) self.assertIn( - b'//# sourceMappingURL=source_map.js.99914b932bd3.map', + b"//# sourceMappingURL=source_map.js.99914b932bd3.map", content, ) self.assertPostCondition() def test_js_source_map_sensitive(self): - relpath = self.hashed_file_path('cached/source_map_sensitive.js') - self.assertEqual(relpath, 'cached/source_map_sensitive.5da96fdd3cb3.js') + relpath = self.hashed_file_path("cached/source_map_sensitive.js") + self.assertEqual(relpath, "cached/source_map_sensitive.5da96fdd3cb3.js") with storage.staticfiles_storage.open(relpath) as relfile: content = relfile.read() - self.assertIn(b'//# sOuRcEMaPpInGURL=source_map.js.map', content) + self.assertIn(b"//# sOuRcEMaPpInGURL=source_map.js.map", content) self.assertNotIn( - b'//# sourceMappingURL=source_map.js.99914b932bd3.map', + b"//# sourceMappingURL=source_map.js.99914b932bd3.map", content, ) self.assertPostCondition() @override_settings( - STATICFILES_DIRS=[os.path.join(TEST_ROOT, 'project', 'faulty')], - STATICFILES_FINDERS=['django.contrib.staticfiles.finders.FileSystemFinder'], + STATICFILES_DIRS=[os.path.join(TEST_ROOT, "project", "faulty")], + STATICFILES_FINDERS=["django.contrib.staticfiles.finders.FileSystemFinder"], ) def test_post_processing_failure(self): """ @@ -271,21 +290,20 @@ class TestHashedFiles: finders.get_finder.cache_clear() err = StringIO() with self.assertRaises(Exception): - call_command('collectstatic', interactive=False, verbosity=0, stderr=err) + call_command("collectstatic", interactive=False, verbosity=0, stderr=err) self.assertEqual("Post-processing 'faulty.css' failed!\n\n", err.getvalue()) self.assertPostCondition() -@override_settings(STATICFILES_STORAGE='staticfiles_tests.storage.ExtraPatternsStorage') +@override_settings(STATICFILES_STORAGE="staticfiles_tests.storage.ExtraPatternsStorage") class TestExtraPatternsStorage(CollectionTestCase): - def setUp(self): storage.staticfiles_storage.hashed_files.clear() # avoid cache interference super().setUp() def cached_file_path(self, path): fullpath = self.render_template(self.static_template_snippet(path)) - return fullpath.replace(settings.STATIC_URL, '') + return fullpath.replace(settings.STATIC_URL, "") def test_multi_extension_patterns(self): """ @@ -307,20 +325,21 @@ class TestExtraPatternsStorage(CollectionTestCase): @override_settings( - STATICFILES_STORAGE='django.contrib.staticfiles.storage.ManifestStaticFilesStorage', + STATICFILES_STORAGE="django.contrib.staticfiles.storage.ManifestStaticFilesStorage", ) class TestCollectionManifestStorage(TestHashedFiles, CollectionTestCase): """ Tests for the Cache busting storage """ + def setUp(self): super().setUp() temp_dir = tempfile.mkdtemp() - os.makedirs(os.path.join(temp_dir, 'test')) - self._clear_filename = os.path.join(temp_dir, 'test', 'cleared.txt') - with open(self._clear_filename, 'w') as f: - f.write('to be deleted in one test') + os.makedirs(os.path.join(temp_dir, "test")) + self._clear_filename = os.path.join(temp_dir, "test", "cleared.txt") + with open(self._clear_filename, "w") as f: + f.write("to be deleted in one test") self.patched_settings = self.settings( STATICFILES_DIRS=settings.STATICFILES_DIRS + [temp_dir], @@ -352,11 +371,11 @@ class TestCollectionManifestStorage(TestHashedFiles, CollectionTestCase): self.assertTrue(os.path.exists(path)) def test_manifest_does_not_exist(self): - storage.staticfiles_storage.manifest_name = 'does.not.exist.json' + storage.staticfiles_storage.manifest_name = "does.not.exist.json" self.assertIsNone(storage.staticfiles_storage.read_manifest()) def test_manifest_does_not_ignore_permission_error(self): - with mock.patch('builtins.open', side_effect=PermissionError): + with mock.patch("builtins.open", side_effect=PermissionError): with self.assertRaises(PermissionError): storage.staticfiles_storage.read_manifest() @@ -365,7 +384,7 @@ class TestCollectionManifestStorage(TestHashedFiles, CollectionTestCase): manifest_content = storage.staticfiles_storage.read_manifest() self.assertIn( '"version": "%s"' % storage.staticfiles_storage.manifest_version, - manifest_content + manifest_content, ) def test_parse_cache(self): @@ -374,7 +393,9 @@ class TestCollectionManifestStorage(TestHashedFiles, CollectionTestCase): self.assertEqual(hashed_files, manifest) def test_clear_empties_manifest(self): - cleared_file_name = storage.staticfiles_storage.clean_name(os.path.join('test', 'cleared.txt')) + cleared_file_name = storage.staticfiles_storage.clean_name( + os.path.join("test", "cleared.txt") + ) # collect the additional file self.run_collectstatic() @@ -400,50 +421,58 @@ class TestCollectionManifestStorage(TestHashedFiles, CollectionTestCase): self.assertNotIn(cleared_file_name, manifest_content) def test_missing_entry(self): - missing_file_name = 'cached/missing.css' + missing_file_name = "cached/missing.css" configured_storage = storage.staticfiles_storage self.assertNotIn(missing_file_name, configured_storage.hashed_files) # File name not found in manifest - with self.assertRaisesMessage(ValueError, "Missing staticfiles manifest entry for '%s'" % missing_file_name): + with self.assertRaisesMessage( + ValueError, + "Missing staticfiles manifest entry for '%s'" % missing_file_name, + ): self.hashed_file_path(missing_file_name) configured_storage.manifest_strict = False # File doesn't exist on disk - err_msg = "The file '%s' could not be found with %r." % (missing_file_name, configured_storage._wrapped) + err_msg = "The file '%s' could not be found with %r." % ( + missing_file_name, + configured_storage._wrapped, + ) with self.assertRaisesMessage(ValueError, err_msg): self.hashed_file_path(missing_file_name) content = StringIO() - content.write('Found') + content.write("Found") configured_storage.save(missing_file_name, content) # File exists on disk self.hashed_file_path(missing_file_name) def test_intermediate_files(self): - cached_files = os.listdir(os.path.join(settings.STATIC_ROOT, 'cached')) + cached_files = os.listdir(os.path.join(settings.STATIC_ROOT, "cached")) # Intermediate files shouldn't be created for reference. self.assertEqual( - len([ - cached_file - for cached_file in cached_files - if cached_file.startswith('relative.') - ]), + len( + [ + cached_file + for cached_file in cached_files + if cached_file.startswith("relative.") + ] + ), 2, ) -@override_settings(STATICFILES_STORAGE='staticfiles_tests.storage.NoneHashStorage') +@override_settings(STATICFILES_STORAGE="staticfiles_tests.storage.NoneHashStorage") class TestCollectionNoneHashStorage(CollectionTestCase): hashed_file_path = hashed_file_path def test_hashed_name(self): - relpath = self.hashed_file_path('cached/styles.css') - self.assertEqual(relpath, 'cached/styles.css') + relpath = self.hashed_file_path("cached/styles.css") + self.assertEqual(relpath, "cached/styles.css") @override_settings( - STATICFILES_STORAGE='staticfiles_tests.storage.NoPostProcessReplacedPathStorage' + STATICFILES_STORAGE="staticfiles_tests.storage.NoPostProcessReplacedPathStorage" ) class TestCollectionNoPostProcessReplacedPaths(CollectionTestCase): run_collectstatic_in_setUp = False @@ -451,10 +480,10 @@ class TestCollectionNoPostProcessReplacedPaths(CollectionTestCase): def test_collectstatistic_no_post_process_replaced_paths(self): stdout = StringIO() self.run_collectstatic(verbosity=1, stdout=stdout) - self.assertIn('post-processed', stdout.getvalue()) + self.assertIn("post-processed", stdout.getvalue()) -@override_settings(STATICFILES_STORAGE='staticfiles_tests.storage.SimpleStorage') +@override_settings(STATICFILES_STORAGE="staticfiles_tests.storage.SimpleStorage") class TestCollectionSimpleStorage(CollectionTestCase): hashed_file_path = hashed_file_path @@ -463,9 +492,13 @@ class TestCollectionSimpleStorage(CollectionTestCase): super().setUp() def test_template_tag_return(self): - self.assertStaticRaises(ValueError, "does/not/exist.png", "/static/does/not/exist.png") + self.assertStaticRaises( + ValueError, "does/not/exist.png", "/static/does/not/exist.png" + ) self.assertStaticRenders("test/file.txt", "/static/test/file.deploy12345.txt") - self.assertStaticRenders("cached/styles.css", "/static/cached/styles.deploy12345.css") + self.assertStaticRenders( + "cached/styles.css", "/static/cached/styles.deploy12345.css" + ) self.assertStaticRenders("path/", "/static/path/") self.assertStaticRenders("path/?query", "/static/path/?query") @@ -481,7 +514,7 @@ class TestCollectionSimpleStorage(CollectionTestCase): class CustomManifestStorage(storage.ManifestStaticFilesStorage): def __init__(self, *args, manifest_storage=None, **kwargs): manifest_storage = storage.StaticFilesStorage( - location=kwargs.pop('manifest_location'), + location=kwargs.pop("manifest_location"), ) super().__init__(*args, manifest_storage=manifest_storage, **kwargs) @@ -496,8 +529,8 @@ class TestCustomManifestStorage(SimpleTestCase): ) self.manifest_file = self.manifest_path / self.staticfiles_storage.manifest_name # Manifest without paths. - self.manifest = {'version': self.staticfiles_storage.manifest_version} - with self.manifest_file.open('w') as manifest_file: + self.manifest = {"version": self.staticfiles_storage.manifest_version} + with self.manifest_file.open("w") as manifest_file: json.dump(self.manifest, manifest_file) def test_read_manifest(self): @@ -515,7 +548,7 @@ class TestCustomManifestStorage(SimpleTestCase): self.staticfiles_storage.save_manifest() self.assertIs(self.manifest_file.exists(), True) new_manifest = json.loads(self.staticfiles_storage.read_manifest()) - self.assertIn('paths', new_manifest) + self.assertIn("paths", new_manifest) self.assertNotEqual(new_manifest, self.manifest) def test_save_manifest_create(self): @@ -523,7 +556,7 @@ class TestCustomManifestStorage(SimpleTestCase): self.staticfiles_storage.save_manifest() self.assertIs(self.manifest_file.exists(), True) new_manifest = json.loads(self.staticfiles_storage.read_manifest()) - self.assertIn('paths', new_manifest) + self.assertIn("paths", new_manifest) self.assertNotEqual(new_manifest, self.manifest) @@ -531,19 +564,20 @@ class CustomStaticFilesStorage(storage.StaticFilesStorage): """ Used in TestStaticFilePermissions """ + def __init__(self, *args, **kwargs): - kwargs['file_permissions_mode'] = 0o640 - kwargs['directory_permissions_mode'] = 0o740 + kwargs["file_permissions_mode"] = 0o640 + kwargs["directory_permissions_mode"] = 0o740 super().__init__(*args, **kwargs) -@unittest.skipIf(sys.platform == 'win32', "Windows only partially supports chmod.") +@unittest.skipIf(sys.platform == "win32", "Windows only partially supports chmod.") class TestStaticFilePermissions(CollectionTestCase): command_params = { - 'interactive': False, - 'verbosity': 0, - 'ignore_patterns': ['*.ignoreme'], + "interactive": False, + "verbosity": 0, + "ignore_patterns": ["*.ignoreme"], } def setUp(self): @@ -564,15 +598,15 @@ class TestStaticFilePermissions(CollectionTestCase): FILE_UPLOAD_DIRECTORY_PERMISSIONS=0o765, ) def test_collect_static_files_permissions(self): - call_command('collectstatic', **self.command_params) + call_command("collectstatic", **self.command_params) static_root = Path(settings.STATIC_ROOT) - test_file = static_root / 'test.txt' + test_file = static_root / "test.txt" file_mode = test_file.stat().st_mode & 0o777 self.assertEqual(file_mode, 0o655) tests = [ - static_root / 'subdir', - static_root / 'nested', - static_root / 'nested' / 'css', + static_root / "subdir", + static_root / "nested", + static_root / "nested" / "css", ] for directory in tests: with self.subTest(directory=directory): @@ -584,15 +618,15 @@ class TestStaticFilePermissions(CollectionTestCase): FILE_UPLOAD_DIRECTORY_PERMISSIONS=None, ) def test_collect_static_files_default_permissions(self): - call_command('collectstatic', **self.command_params) + call_command("collectstatic", **self.command_params) static_root = Path(settings.STATIC_ROOT) - test_file = static_root / 'test.txt' + test_file = static_root / "test.txt" file_mode = test_file.stat().st_mode & 0o777 self.assertEqual(file_mode, 0o666 & ~self.umask) tests = [ - static_root / 'subdir', - static_root / 'nested', - static_root / 'nested' / 'css', + static_root / "subdir", + static_root / "nested", + static_root / "nested" / "css", ] for directory in tests: with self.subTest(directory=directory): @@ -602,18 +636,18 @@ class TestStaticFilePermissions(CollectionTestCase): @override_settings( FILE_UPLOAD_PERMISSIONS=0o655, FILE_UPLOAD_DIRECTORY_PERMISSIONS=0o765, - STATICFILES_STORAGE='staticfiles_tests.test_storage.CustomStaticFilesStorage', + STATICFILES_STORAGE="staticfiles_tests.test_storage.CustomStaticFilesStorage", ) def test_collect_static_files_subclass_of_static_storage(self): - call_command('collectstatic', **self.command_params) + call_command("collectstatic", **self.command_params) static_root = Path(settings.STATIC_ROOT) - test_file = static_root / 'test.txt' + test_file = static_root / "test.txt" file_mode = test_file.stat().st_mode & 0o777 self.assertEqual(file_mode, 0o640) tests = [ - static_root / 'subdir', - static_root / 'nested', - static_root / 'nested' / 'css', + static_root / "subdir", + static_root / "nested", + static_root / "nested" / "css", ] for directory in tests: with self.subTest(directory=directory): @@ -622,56 +656,57 @@ class TestStaticFilePermissions(CollectionTestCase): @override_settings( - STATICFILES_STORAGE='django.contrib.staticfiles.storage.ManifestStaticFilesStorage', + STATICFILES_STORAGE="django.contrib.staticfiles.storage.ManifestStaticFilesStorage", ) class TestCollectionHashedFilesCache(CollectionTestCase): """ Files referenced from CSS use the correct final hashed name regardless of the order in which the files are post-processed. """ + hashed_file_path = hashed_file_path def setUp(self): super().setUp() self._temp_dir = temp_dir = tempfile.mkdtemp() - os.makedirs(os.path.join(temp_dir, 'test')) + os.makedirs(os.path.join(temp_dir, "test")) self.addCleanup(shutil.rmtree, temp_dir) def _get_filename_path(self, filename): - return os.path.join(self._temp_dir, 'test', filename) + return os.path.join(self._temp_dir, "test", filename) def test_file_change_after_collectstatic(self): # Create initial static files. file_contents = ( - ('foo.png', 'foo'), - ('bar.css', 'url("foo.png")\nurl("xyz.png")'), - ('xyz.png', 'xyz'), + ("foo.png", "foo"), + ("bar.css", 'url("foo.png")\nurl("xyz.png")'), + ("xyz.png", "xyz"), ) for filename, content in file_contents: - with open(self._get_filename_path(filename), 'w') as f: + with open(self._get_filename_path(filename), "w") as f: f.write(content) - with self.modify_settings(STATICFILES_DIRS={'append': self._temp_dir}): + with self.modify_settings(STATICFILES_DIRS={"append": self._temp_dir}): finders.get_finder.cache_clear() err = StringIO() # First collectstatic run. - call_command('collectstatic', interactive=False, verbosity=0, stderr=err) - relpath = self.hashed_file_path('test/bar.css') + call_command("collectstatic", interactive=False, verbosity=0, stderr=err) + relpath = self.hashed_file_path("test/bar.css") with storage.staticfiles_storage.open(relpath) as relfile: content = relfile.read() - self.assertIn(b'foo.acbd18db4cc2.png', content) - self.assertIn(b'xyz.d16fb36f0911.png', content) + self.assertIn(b"foo.acbd18db4cc2.png", content) + self.assertIn(b"xyz.d16fb36f0911.png", content) # Change the contents of the png files. - for filename in ('foo.png', 'xyz.png'): - with open(self._get_filename_path(filename), 'w+b') as f: + for filename in ("foo.png", "xyz.png"): + with open(self._get_filename_path(filename), "w+b") as f: f.write(b"new content of file to change its hash") # The hashes of the png files in the CSS file are updated after # a second collectstatic. - call_command('collectstatic', interactive=False, verbosity=0, stderr=err) - relpath = self.hashed_file_path('test/bar.css') + call_command("collectstatic", interactive=False, verbosity=0, stderr=err) + relpath = self.hashed_file_path("test/bar.css") with storage.staticfiles_storage.open(relpath) as relfile: content = relfile.read() - self.assertIn(b'foo.57a5cb9ba68d.png', content) - self.assertIn(b'xyz.57a5cb9ba68d.png', content) + self.assertIn(b"foo.57a5cb9ba68d.png", content) + self.assertIn(b"xyz.57a5cb9ba68d.png", content) |
