Skip to content

Commit e0476a3

Browse files
committed
live_server: override settings only per test
This fixes settings to be restored after a test using the ``live_server`` fixture. Previously all tests afterwards were using the overridden settings. Closes #612.
1 parent 9996d43 commit e0476a3

File tree

4 files changed

+37
-4
lines changed

4 files changed

+37
-4
lines changed

docs/changelog.rst

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@ Bug fixes
1717

1818
* Fixed test for classmethod with Django TestCases (#597, #598).
1919
* Fixed RemovedInPytest4Warning: MarkInfo objects are deprecated (#596, #603)
20+
* Fixed scope of overridden settings with live_server fixture: previously they
21+
were visible to following tests (#612).
2022

2123
3.2.1
2224
-----

pytest_django/fixtures.py

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -340,9 +340,17 @@ def _live_server_helper(request):
340340
The separate helper is required since live_server can not request
341341
transactional_db directly since it is session scoped instead of
342342
function-scoped.
343+
344+
It will also override settings only for the duration of the test.
343345
"""
344-
if 'live_server' in request.funcargnames:
345-
getfixturevalue(request, 'transactional_db')
346+
if 'live_server' not in request.funcargnames:
347+
return
348+
349+
getfixturevalue(request, 'transactional_db')
350+
351+
live_server = getfixturevalue(request, 'live_server')
352+
live_server._live_server_modified_settings.enable()
353+
request.addfinalizer(live_server._live_server_modified_settings.disable)
346354

347355

348356
@pytest.fixture(scope='function')

pytest_django/live_server_helper.py

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,6 @@ def __init__(self, addr):
4949
self._live_server_modified_settings = modify_settings(
5050
ALLOWED_HOSTS={'append': host},
5151
)
52-
self._live_server_modified_settings.enable()
5352

5453
self.thread.daemon = True
5554
self.thread.start()
@@ -62,7 +61,6 @@ def stop(self):
6261
"""Stop the server"""
6362
self.thread.terminate()
6463
self.thread.join()
65-
self._live_server_modified_settings.disable()
6664

6765
@property
6866
def url(self):

tests/test_fixtures.py

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -223,9 +223,34 @@ def test_set_non_existent(settings):
223223

224224

225225
class TestLiveServer:
226+
def test_settings_before(self):
227+
from django.conf import settings
228+
229+
assert '%s.%s' % (
230+
settings.__class__.__module__,
231+
settings.__class__.__name__) == 'django.conf.Settings'
232+
TestLiveServer._test_settings_before_run = True
233+
226234
def test_url(self, live_server):
227235
assert live_server.url == force_text(live_server)
228236

237+
def test_change_settings(self, live_server, settings):
238+
assert live_server.url == force_text(live_server)
239+
240+
def test_settings_restored(self):
241+
"""Ensure that settings are restored after test_settings_before."""
242+
import django
243+
from django.conf import settings
244+
245+
assert TestLiveServer._test_settings_before_run is True
246+
assert '%s.%s' % (
247+
settings.__class__.__module__,
248+
settings.__class__.__name__) == 'django.conf.Settings'
249+
if django.VERSION >= (1, 11):
250+
assert settings.ALLOWED_HOSTS == ['testserver']
251+
else:
252+
assert settings.ALLOWED_HOSTS == ['*']
253+
229254
def test_transactions(self, live_server):
230255
if not connections_support_transactions():
231256
pytest.skip('transactions required for this test')

0 commit comments

Comments
 (0)