From 1aa296c45c2d01cca1bcf860b69688cd665845cd Mon Sep 17 00:00:00 2001 From: Asger Geel Weirsoee Date: Sun, 1 Mar 2026 11:14:32 +0000 Subject: [PATCH] feat(spa): add USE_SPA_UI cutover flag with legacy fallback --- docs/spa-cutover-flag.md | 18 +++++++++++++++ lobby/feature_flags.py | 6 +++++ lobby/templates/lobby/spa_shell.html | 12 ++++++++++ lobby/tests.py | 34 +++++++++++++++++++++++++++- lobby/ui_views.py | 20 ++++++++++++++++ partyhub/settings.py | 8 +++++++ 6 files changed, 97 insertions(+), 1 deletion(-) create mode 100644 docs/spa-cutover-flag.md create mode 100644 lobby/feature_flags.py create mode 100644 lobby/templates/lobby/spa_shell.html diff --git a/docs/spa-cutover-flag.md b/docs/spa-cutover-flag.md new file mode 100644 index 0000000..a0f5801 --- /dev/null +++ b/docs/spa-cutover-flag.md @@ -0,0 +1,18 @@ +# SPA cutover feature flag (`USE_SPA_UI`) + +## Formål +`USE_SPA_UI` styrer om host/player UI routes serverer Angular SPA shell eller legacy Django templates. + +## Miljø-toggle (uden kodeændring) +Sæt env var pr. miljø: + +- `USE_SPA_UI=true` -> `/lobby/ui/host` og `/lobby/ui/player` returnerer SPA shell +- `USE_SPA_UI=false` (default) -> legacy template-flow bruges uændret + +Backward compatibility under cutover: +- Hvis `USE_SPA_UI` ikke er sat, bruges `WPP_SPA_ENABLED` som fallback. + +## Verifikation +- Flag OFF: `UiScreenTests.test_legacy_templates_are_used_when_spa_flag_is_off` +- Flag ON (host): `UiScreenTests.test_host_screen_can_render_angular_shell_when_feature_flag_enabled` +- Flag ON (player): `UiScreenTests.test_player_screen_can_render_angular_shell_when_feature_flag_enabled` diff --git a/lobby/feature_flags.py b/lobby/feature_flags.py new file mode 100644 index 0000000..83ae495 --- /dev/null +++ b/lobby/feature_flags.py @@ -0,0 +1,6 @@ +from django.conf import settings + + +def use_spa_ui() -> bool: + """Central read-point for SPA cutover flag.""" + return bool(getattr(settings, "USE_SPA_UI", False)) diff --git a/lobby/templates/lobby/spa_shell.html b/lobby/templates/lobby/spa_shell.html new file mode 100644 index 0000000..c57da0a --- /dev/null +++ b/lobby/templates/lobby/spa_shell.html @@ -0,0 +1,12 @@ + + + + + + WPP SPA + + + + + + diff --git a/lobby/tests.py b/lobby/tests.py index 84fefca..896b596 100644 --- a/lobby/tests.py +++ b/lobby/tests.py @@ -5,7 +5,7 @@ from pathlib import Path from django.contrib.auth import get_user_model from django.core.management import call_command -from django.test import TestCase +from django.test import TestCase, override_settings from django.urls import reverse from django.utils import timezone @@ -973,6 +973,38 @@ class UiScreenTests(TestCase): self.assertContains(response, "player_shell_runtime_error") self.assertContains(response, "window.addEventListener(\"error\"") + @override_settings(USE_SPA_UI=False) + def test_legacy_templates_are_used_when_spa_flag_is_off(self): + self.client.login(username="host_ui", password="secret123") + + host_response = self.client.get(reverse("lobby:host_screen")) + player_response = self.client.get(reverse("lobby:player_screen")) + + self.assertContains(host_response, "Host panel") + self.assertContains(player_response, "Player panel") + self.assertNotContains(host_response, "