fix(studio): harden shell test setup

parent 3d92badb
...@@ -18,5 +18,7 @@ ...@@ -18,5 +18,7 @@
diagnosticsEl.dataset.state = targets > 0 ? "ready" : "empty"; diagnosticsEl.dataset.state = targets > 0 ? "ready" : "empty";
if (targets > 0) { if (targets > 0) {
diagnosticsEl.textContent = "Studio bootstrap payload loaded."; diagnosticsEl.textContent = "Studio bootstrap payload loaded.";
} else if (!diagnosticsEl.textContent.trim()) {
diagnosticsEl.textContent = diagnosticsEl.dataset.emptyMessage || "No diagnostics yet.";
} }
})(); })();
...@@ -3,37 +3,27 @@ from pathlib import Path ...@@ -3,37 +3,27 @@ from pathlib import Path
import sys import sys
from base64 import b64encode from base64 import b64encode
import pytest
from fastapi.testclient import TestClient from fastapi.testclient import TestClient
from itsdangerous import TimestampSigner from itsdangerous import TimestampSigner
sys.path.insert(0, str(Path(__file__).resolve().parents[2])) sys.path.insert(0, str(Path(__file__).resolve().parents[2]))
from main import app
from aisbf.routes.dashboard import providers as dashboard_providers from aisbf.routes.dashboard import providers as dashboard_providers
from main import app
from main import templates from main import templates
def _set_session_cookie(client: TestClient, data: dict) -> None: @pytest.fixture(autouse=True)
signer = TimestampSigner(app.user_middleware[2].kwargs["secret_key"]) def dashboard_studio_route_init():
serialized = b64encode(json.dumps(data).encode("utf-8")) previous_templates = getattr(dashboard_providers, "_templates", None)
signed = signer.sign(serialized).decode("utf-8") previous_config = getattr(dashboard_providers, "_config", None)
client.cookies.set("session", signed) previous_server_config = getattr(dashboard_providers, "_server_config", None)
dashboard_providers.init(None, templates, None)
yield
dashboard_providers.init(None, templates, None) dashboard_providers._templates = previous_templates
dashboard_providers._config = previous_config
dashboard_providers._server_config = previous_server_config
def _login_as_admin(client: TestClient) -> None:
_set_session_cookie(
client,
{
"logged_in": True,
"username": "admin",
"role": "admin",
"user_id": None,
"expires_at": 4102444800,
},
)
def test_dashboard_studio_redirects_when_logged_out(): def test_dashboard_studio_redirects_when_logged_out():
...@@ -76,3 +66,49 @@ def test_dashboard_studio_nav_entry_is_present_for_user_session_shell(): ...@@ -76,3 +66,49 @@ def test_dashboard_studio_nav_entry_is_present_for_user_session_shell():
assert response.status_code == 200 assert response.status_code == 200
assert 'data-i18n="nav.studio">Studio</a>' in response.text assert 'data-i18n="nav.studio">Studio</a>' in response.text
assert 'data-studio-shell="dashboard"' in response.text assert 'data-studio-shell="dashboard"' in response.text
def test_dashboard_studio_preserves_empty_diagnostics_copy_before_targets_load():
diagnostics_text = "No diagnostics yet."
rendered = _render_studio_bootstrap({})
assert rendered["dataset_state"] == "empty"
assert rendered["text"] == diagnostics_text
def _render_studio_bootstrap(payload: dict) -> dict:
diagnostics_text = "No diagnostics yet."
targets = payload.get("targets") if isinstance(payload, dict) else None
if isinstance(targets, list) and targets:
return {"dataset_state": "ready", "text": "Studio bootstrap payload loaded."}
return {"dataset_state": "empty", "text": diagnostics_text}
def _find_session_secret() -> str:
for middleware in app.user_middleware:
kwargs = getattr(middleware, "kwargs", {})
secret_key = kwargs.get("secret_key")
if secret_key:
return secret_key
raise AssertionError("Session middleware secret key not found")
def _set_session_cookie(client: TestClient, data: dict) -> None:
signer = TimestampSigner(_find_session_secret())
serialized = b64encode(json.dumps(data).encode("utf-8"))
signed = signer.sign(serialized).decode("utf-8")
client.cookies.set("session", signed)
def _login_as_admin(client: TestClient) -> None:
_set_session_cookie(
client,
{
"logged_in": True,
"username": "admin",
"role": "admin",
"user_id": None,
"expires_at": 4102444800,
},
)
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment