summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAymeric Augustin <aymeric.augustin@m4x.org>2015-06-05 00:02:32 +0200
committerAymeric Augustin <aymeric.augustin@m4x.org>2015-09-09 23:01:17 +0200
commitbf2c969eb7d941812993d69bcf7c8ac35bdb7726 (patch)
tree1ae952d9505f1f6e8185563b4a11a63dae5b7914
parent326bc0955b2e9ab6b6cfd62263c9b3fe2fb1d333 (diff)
Prevented staticfiles test from colliding when run in parallel.
This requires that each test never alters files in static directories collected by other tests. The alternative is to add a temporary directory to STATICFILES_DIRS or a new app to INSTALLED_APPS.
-rw-r--r--tests/staticfiles_tests/settings.py2
-rw-r--r--tests/staticfiles_tests/test_management.py81
-rw-r--r--tests/staticfiles_tests/test_storage.py18
3 files changed, 56 insertions, 45 deletions
diff --git a/tests/staticfiles_tests/settings.py b/tests/staticfiles_tests/settings.py
index 1978d6529d..ea20a84c6f 100644
--- a/tests/staticfiles_tests/settings.py
+++ b/tests/staticfiles_tests/settings.py
@@ -6,8 +6,6 @@ from django.utils._os import upath
TEST_ROOT = os.path.dirname(upath(__file__))
-TESTFILES_PATH = os.path.join(TEST_ROOT, 'apps', 'test', 'static', 'test')
-
TEST_SETTINGS = {
'DEBUG': True,
'MEDIA_URL': '/media/',
diff --git a/tests/staticfiles_tests/test_management.py b/tests/staticfiles_tests/test_management.py
index 784e5b74fd..09557185ed 100644
--- a/tests/staticfiles_tests/test_management.py
+++ b/tests/staticfiles_tests/test_management.py
@@ -3,6 +3,7 @@ from __future__ import unicode_literals
import codecs
import os
import shutil
+import tempfile
import unittest
from django.conf import settings
@@ -11,6 +12,7 @@ from django.contrib.staticfiles.management.commands import collectstatic
from django.core.exceptions import ImproperlyConfigured
from django.core.management import call_command
from django.test import override_settings
+from django.test.utils import extend_sys_path
from django.utils import six
from django.utils._os import symlinks_supported
from django.utils.encoding import force_text
@@ -197,31 +199,45 @@ class TestCollectionFilesOverride(CollectionTestCase):
Test overriding duplicated files by ``collectstatic`` management command.
Check for proper handling of apps order in installed apps even if file modification
dates are in different order:
- 'staticfiles_tests.apps.test',
+ 'staticfiles_test_app',
'staticfiles_tests.apps.no_label',
"""
def setUp(self):
- self.orig_path = os.path.join(TEST_ROOT, 'apps', 'no_label', 'static', 'file2.txt')
+ self.temp_dir = tempfile.mkdtemp()
+ self.addCleanup(shutil.rmtree, self.temp_dir)
+
# get modification and access times for no_label/static/file2.txt
+ self.orig_path = os.path.join(TEST_ROOT, 'apps', 'no_label', 'static', 'file2.txt')
self.orig_mtime = os.path.getmtime(self.orig_path)
self.orig_atime = os.path.getatime(self.orig_path)
- # prepare duplicate of file2.txt from no_label app
+ # prepare duplicate of file2.txt from a temporary app
# this file will have modification time older than no_label/static/file2.txt
- # anyway it should be taken to STATIC_ROOT because 'test' app is before
+ # anyway it should be taken to STATIC_ROOT because the temporary app is before
# 'no_label' app in installed apps
- self.testfile_path = os.path.join(TEST_ROOT, 'apps', 'test', 'static', 'file2.txt')
+ self.temp_app_path = os.path.join(self.temp_dir, 'staticfiles_test_app')
+ self.testfile_path = os.path.join(self.temp_app_path, 'static', 'file2.txt')
+
+ os.makedirs(self.temp_app_path)
+ with open(os.path.join(self.temp_app_path, '__init__.py'), 'w+'):
+ pass
+
+ os.makedirs(os.path.dirname(self.testfile_path))
with open(self.testfile_path, 'w+') as f:
f.write('duplicate of file2.txt')
+
os.utime(self.testfile_path, (self.orig_atime - 1, self.orig_mtime - 1))
+
+ self.settings_with_test_app = self.modify_settings(
+ INSTALLED_APPS={'prepend': 'staticfiles_test_app'})
+ with extend_sys_path(self.temp_dir):
+ self.settings_with_test_app.enable()
+
super(TestCollectionFilesOverride, self).setUp()
def tearDown(self):
- if os.path.exists(self.testfile_path):
- os.unlink(self.testfile_path)
- # set back original modification time
- os.utime(self.orig_path, (self.orig_atime, self.orig_mtime))
super(TestCollectionFilesOverride, self).tearDown()
+ self.settings_with_test_app.disable()
def test_ordering_override(self):
"""
@@ -234,22 +250,11 @@ class TestCollectionFilesOverride(CollectionTestCase):
self.assertFileContains('file2.txt', 'duplicate of file2.txt')
- # and now change modification time of no_label/static/file2.txt
- # test app is first in installed apps so file2.txt should remain unmodified
- mtime = os.path.getmtime(self.testfile_path)
- atime = os.path.getatime(self.testfile_path)
- os.utime(self.orig_path, (mtime + 1, atime + 1))
-
- # run collectstatic again
- self.run_collectstatic()
-
- self.assertFileContains('file2.txt', 'duplicate of file2.txt')
-
# The collectstatic test suite already has conflicting files since both
# project/test/file.txt and apps/test/static/test/file.txt are collected. To
# properly test for the warning not happening unless we tell it to explicitly,
-# we only include static files from the default finders.
+# we remove the project directory and will add back a conflicting file later.
@override_settings(STATICFILES_DIRS=[])
class TestCollectionOverwriteWarning(CollectionTestCase):
"""
@@ -268,41 +273,37 @@ class TestCollectionOverwriteWarning(CollectionTestCase):
"""
out = six.StringIO()
call_command('collectstatic', interactive=False, verbosity=3, stdout=out, **kwargs)
- out.seek(0)
- return out.read()
+ return force_text(out.getvalue())
def test_no_warning(self):
"""
There isn't a warning if there isn't a duplicate destination.
"""
output = self._collectstatic_output(clear=True)
- self.assertNotIn(self.warning_string, force_text(output))
+ self.assertNotIn(self.warning_string, output)
def test_warning(self):
"""
There is a warning when there are duplicate destinations.
"""
- # Create new file in the no_label app that also exists in the test app.
- test_dir = os.path.join(TEST_ROOT, 'apps', 'no_label', 'static', 'test')
- if not os.path.exists(test_dir):
- os.mkdir(test_dir)
+ static_dir = tempfile.mkdtemp()
+ self.addCleanup(shutil.rmtree, static_dir)
- try:
- duplicate_path = os.path.join(test_dir, 'file.txt')
- with open(duplicate_path, 'w+') as f:
- f.write('duplicate of file.txt')
+ duplicate = os.path.join(static_dir, 'test', 'file.txt')
+ os.mkdir(os.path.dirname(duplicate))
+ with open(duplicate, 'w+') as f:
+ f.write('duplicate of file.txt')
+
+ with self.settings(STATICFILES_DIRS=[static_dir]):
output = self._collectstatic_output(clear=True)
- self.assertIn(self.warning_string, force_text(output))
- finally:
- if os.path.exists(duplicate_path):
- os.unlink(duplicate_path)
+ self.assertIn(self.warning_string, output)
- if os.path.exists(test_dir):
- os.rmdir(test_dir)
+ os.remove(duplicate)
# Make sure the warning went away again.
- output = self._collectstatic_output(clear=True)
- self.assertNotIn(self.warning_string, force_text(output))
+ with self.settings(STATICFILES_DIRS=[static_dir]):
+ output = self._collectstatic_output(clear=True)
+ self.assertNotIn(self.warning_string, output)
@override_settings(STATICFILES_STORAGE='staticfiles_tests.storage.DummyStorage')
diff --git a/tests/staticfiles_tests/test_storage.py b/tests/staticfiles_tests/test_storage.py
index c3318512f6..b96d9d0f12 100644
--- a/tests/staticfiles_tests/test_storage.py
+++ b/tests/staticfiles_tests/test_storage.py
@@ -1,7 +1,9 @@
from __future__ import unicode_literals
import os
+import shutil
import sys
+import tempfile
import unittest
from django.conf import settings
@@ -18,7 +20,7 @@ from django.utils.encoding import force_text
from .cases import (
BaseCollectionTestCase, BaseStaticFilesTestCase, StaticFilesTestCase,
)
-from .settings import TEST_ROOT, TEST_SETTINGS, TESTFILES_PATH
+from .settings import TEST_ROOT, TEST_SETTINGS
def hashed_file_path(test, path):
@@ -252,15 +254,25 @@ class TestCollectionManifestStorage(TestHashedFiles, BaseCollectionTestCase,
def setUp(self):
super(TestCollectionManifestStorage, self).setUp()
- self._clear_filename = os.path.join(TESTFILES_PATH, 'cleared.txt')
+ 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')
+ self.patched_settings = self.settings(
+ STATICFILES_DIRS=settings.STATICFILES_DIRS + [temp_dir])
+ self.patched_settings.enable()
+ self.addCleanup(shutil.rmtree, six.text_type(temp_dir))
+
def tearDown(self):
- super(TestCollectionManifestStorage, self).tearDown()
+ self.patched_settings.disable()
+
if os.path.exists(self._clear_filename):
os.unlink(self._clear_filename)
+ super(TestCollectionManifestStorage, self).tearDown()
+
def test_manifest_exists(self):
filename = storage.staticfiles_storage.manifest_name
path = storage.staticfiles_storage.path(filename)