diff options
author | Chris Jerdonek <chris.jerdonek@gmail.com> | 2021-02-11 05:43:36 -0800 |
---|---|---|
committer | Mariusz Felisiak <felisiak.mariusz@gmail.com> | 2021-02-12 09:39:48 +0100 |
commit | 694deff82f86e025561dfa724425f67e2ff7cbb7 (patch) | |
tree | 2a47c00ab27de75b5152aa3b28d72fc168dc6d40 /tests/servers | |
parent | e412b288455dd3ea6f1d65c8ec5d01751e489976 (diff) | |
download | django-694deff82f86e025561dfa724425f67e2ff7cbb7.tar.gz |
Fixed #32437 -- Fixed cleaning up ALLOWED_HOSTS in LiveServerTestCase on setUpClass() failure.
Diffstat (limited to 'tests/servers')
-rw-r--r-- | tests/servers/tests.py | 37 |
1 files changed, 37 insertions, 0 deletions
diff --git a/tests/servers/tests.py b/tests/servers/tests.py index 8183d5dbf5..8b6e372419 100644 --- a/tests/servers/tests.py +++ b/tests/servers/tests.py @@ -9,6 +9,7 @@ from urllib.error import HTTPError from urllib.parse import urlencode from urllib.request import urlopen +from django.conf import settings from django.core.servers.basehttp import WSGIServer from django.test import LiveServerTestCase, override_settings from django.test.testcases import LiveServerThread, QuietWSGIRequestHandler @@ -39,6 +40,42 @@ class LiveServerBase(LiveServerTestCase): return urlopen(self.live_server_url + url) +class FailingLiveServerThread(LiveServerThread): + def _create_server(self): + raise RuntimeError('Error creating server.') + + +class LiveServerTestCaseSetupTest(LiveServerBase): + server_thread_class = FailingLiveServerThread + + @classmethod + def check_allowed_hosts(cls, expected): + if settings.ALLOWED_HOSTS != expected: + raise RuntimeError(f'{settings.ALLOWED_HOSTS} != {expected}') + + @classmethod + def setUpClass(cls): + cls.check_allowed_hosts(['testserver']) + try: + super().setUpClass() + except RuntimeError: + # LiveServerTestCase's change to ALLOWED_HOSTS should be reverted. + cls.check_allowed_hosts(['testserver']) + else: + raise RuntimeError('Server did not fail.') + cls.set_up_called = True + + @classmethod + def tearDownClass(cls): + # Make tearDownClass() a no-op because setUpClass() was already cleaned + # up, and because the error inside setUpClass() was handled, which will + # cause tearDownClass() to be called when it normally wouldn't. + pass + + def test_set_up_class(self): + self.assertIs(self.set_up_called, True) + + class LiveServerAddress(LiveServerBase): @classmethod |