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 %}
diff --git a/registration/tests/test_maintenance_mode.py b/registration/tests/test_maintenance_mode.py
new file mode 100644
index 00000000..22ffa4b3
--- /dev/null
+++ b/registration/tests/test_maintenance_mode.py
@@ -0,0 +1,75 @@
+import shutil
+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._tmp_dir = tempfile.mkdtemp()
+ self.state_file = Path(self._tmp_dir) / "maintenance_mode_state.txt"
+ self.state_file.write_text("0")
+
+ def tearDown(self):
+ shutil.rmtree(self._tmp_dir, ignore_errors=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)