From fb0f7edc170d9357976efd44c3345bebd4ddabd9 Mon Sep 17 00:00:00 2001 From: Rechner Fox <659028+rechner@users.noreply.github.com> Date: Mon, 13 Jul 2026 16:17:33 -0700 Subject: [PATCH 1/3] Remove dead validator.js from utility page --- registration/templates/registration/utility_pages.html | 1 - 1 file changed, 1 deletion(-) diff --git a/registration/templates/registration/utility_pages.html b/registration/templates/registration/utility_pages.html index 354e74f8..8366b748 100644 --- a/registration/templates/registration/utility_pages.html +++ b/registration/templates/registration/utility_pages.html @@ -35,7 +35,6 @@ - {% block javascript %} From cabb2083bd2b1175d3cf794de8a9a19103fbcb3f Mon Sep 17 00:00:00 2001 From: Rechner Fox <659028+rechner@users.noreply.github.com> Date: Mon, 13 Jul 2026 16:25:19 -0700 Subject: [PATCH 2/3] Add maintenance mode tests --- registration/tests/test_maintenance_mode.py | 73 +++++++++++++++++++++ 1 file changed, 73 insertions(+) create mode 100644 registration/tests/test_maintenance_mode.py diff --git a/registration/tests/test_maintenance_mode.py b/registration/tests/test_maintenance_mode.py new file mode 100644 index 00000000..d351e9ad --- /dev/null +++ b/registration/tests/test_maintenance_mode.py @@ -0,0 +1,73 @@ +import tempfile +from http import HTTPStatus +from pathlib import Path + +from django.test import SimpleTestCase, override_settings + + +class MaintenanceModeTest(SimpleTestCase): + """Test that django-maintenance-mode works as configured. + + Uses SimpleTestCase (no database) since maintenance mode is purely + middleware-based and doesn't require DB access. + """ + + def setUp(self): + self.state_file = Path(tempfile.mktemp(suffix="_maintenance_mode_state.txt")) + self.state_file.write_text("0") + + def tearDown(self): + self.state_file.unlink(missing_ok=True) + + def _enable_maintenance(self): + self.state_file.write_text("1") + + def _disable_maintenance(self): + self.state_file.write_text("0") + + @override_settings(MAINTENANCE_MODE=True) + def test_maintenance_mode_returns_503(self): + """When maintenance mode is on, normal pages return 503.""" + response = self.client.get("/registration/") + self.assertEqual(response.status_code, HTTPStatus.SERVICE_UNAVAILABLE) + + @override_settings(MAINTENANCE_MODE=True) + def test_maintenance_page_renders_without_error(self): + """The 503 maintenance template renders successfully (no missing static files).""" + response = self.client.get("/registration/") + self.assertEqual(response.status_code, HTTPStatus.SERVICE_UNAVAILABLE) + self.assertIn(b"maintenance", response.content.lower()) + + @override_settings(MAINTENANCE_MODE=False) + def test_normal_mode_does_not_return_503(self): + """When maintenance mode is off, pages are not blocked by maintenance middleware.""" + self.client.raise_request_exception = False + response = self.client.get("/registration/") + self.assertNotEqual(response.status_code, HTTPStatus.SERVICE_UNAVAILABLE) + + @override_settings(MAINTENANCE_MODE=True, MAINTENANCE_MODE_IGNORE_ADMIN_SITE=True) + def test_admin_site_accessible_during_maintenance(self): + """Admin site is reachable even during maintenance (per MAINTENANCE_MODE_IGNORE_ADMIN_SITE).""" + response = self.client.get("/admin/login/") + self.assertNotEqual(response.status_code, HTTPStatus.SERVICE_UNAVAILABLE) + + @override_settings( + MAINTENANCE_MODE=True, MAINTENANCE_MODE_IGNORE_URLS=("^/accounts/",) + ) + def test_ignored_urls_accessible_during_maintenance(self): + """URLs matching MAINTENANCE_MODE_IGNORE_URLS are accessible during maintenance.""" + self.client.raise_request_exception = False + response = self.client.get("/accounts/login/") + self.assertNotEqual(response.status_code, HTTPStatus.SERVICE_UNAVAILABLE) + + def test_state_file_controls_maintenance_mode(self): + """The file-based state backend enables/disables maintenance mode.""" + self.client.raise_request_exception = False + with self.settings(MAINTENANCE_MODE_STATE_FILE_PATH=str(self.state_file)): + self._disable_maintenance() + response = self.client.get("/registration/") + self.assertNotEqual(response.status_code, HTTPStatus.SERVICE_UNAVAILABLE) + + self._enable_maintenance() + response = self.client.get("/registration/") + self.assertEqual(response.status_code, HTTPStatus.SERVICE_UNAVAILABLE) From bf5f2e095d929554cf55fce673268c1c97e40d2d Mon Sep 17 00:00:00 2001 From: Rechner Fox <659028+rechner@users.noreply.github.com> Date: Mon, 13 Jul 2026 16:31:50 -0700 Subject: [PATCH 3/3] Sonarqube feedback --- registration/tests/test_maintenance_mode.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/registration/tests/test_maintenance_mode.py b/registration/tests/test_maintenance_mode.py index d351e9ad..22ffa4b3 100644 --- a/registration/tests/test_maintenance_mode.py +++ b/registration/tests/test_maintenance_mode.py @@ -1,3 +1,4 @@ +import shutil import tempfile from http import HTTPStatus from pathlib import Path @@ -13,11 +14,12 @@ class MaintenanceModeTest(SimpleTestCase): """ def setUp(self): - self.state_file = Path(tempfile.mktemp(suffix="_maintenance_mode_state.txt")) + self._tmp_dir = tempfile.mkdtemp() + self.state_file = Path(self._tmp_dir) / "maintenance_mode_state.txt" self.state_file.write_text("0") def tearDown(self): - self.state_file.unlink(missing_ok=True) + shutil.rmtree(self._tmp_dir, ignore_errors=True) def _enable_maintenance(self): self.state_file.write_text("1")