"""Executable and static quality gates for the isolated HUX-09 frontend.""" from __future__ import annotations import json from pathlib import Path from hux_node_gate import run_node_coverage ROOT = Path(__file__).resolve().parents[2] ONBOARDING = ROOT / "dockerfiles" / "hermes-webui-hux" / "onboarding" def test_hux_onboarding_node_suite_and_coverage(): """Suggestion validation and transport remain above the repository gate.""" run_node_coverage( [ "dockerfiles/hermes-webui-hux/onboarding/client.ts", "dockerfiles/hermes-webui-hux/onboarding/model.ts", "dockerfiles/hermes-webui-hux/onboarding/security.ts", ], [ "testing/tests/test_hermes_hux_ui_onboarding.mjs", ], {"branches": 95, "functions": 95, "lines": 95}, strip_types=True, ) def test_hux_onboarding_matches_schema_and_is_inert(): """HUX-09 consumes the shared schema without entering a live image.""" schema = json.loads( (ROOT / "services/hermes/contracts/hux/suggestion.schema.json").read_text( encoding="utf-8" ) ) model = (ONBOARDING / "model.ts").read_text(encoding="utf-8") for value in schema["$defs"]["suggestion"]["properties"]["kind"]["enum"]: assert f'"{value}"' in model for value in schema["$defs"]["suggestion"]["properties"]["action"][ "properties" ]["type"]["enum"]: assert f'"{value}"' in model for value in schema["$defs"]["suggestion"]["properties"]["trigger"][ "properties" ]["context"]["enum"]: assert f'"{value}"' in (ONBOARDING / "security.ts").read_text( encoding="utf-8" ) assert "dockerfiles/hermes-webui-hux/onboarding" not in ( ROOT / "dockerfiles/Dockerfile.hermes-webui" ).read_text(encoding="utf-8") def test_hux_onboarding_ui_is_accessible_restrained_and_not_persistent(): """The card stays optional, dismissible, scoped and keyboard accessible.""" component = (ONBOARDING / "OnboardingSuggestions.tsx").read_text( encoding="utf-8" ) client = (ONBOARDING / "client.ts").read_text(encoding="utf-8") contracts = (ONBOARDING / "contracts.ts").read_text(encoding="utf-8") styles = (ONBOARDING / "styles.css").read_text(encoding="utf-8") assert "if (!enabled || !evaluation" in component assert "Optional next step" in component assert "Not now" in component and "Don't suggest this again" in component assert "Why am I seeing this?" in component assert 'role="status"' in component and 'aria-live="polite"' in component assert 'role="alert"' in component assert "dangerouslySetInnerHTML" not in component assert all( token not in client for token in ("localStorage", "sessionStorage", "indexedDB", "document.cookie") ) assert 'credentials: "same-origin"' in client and 'cache: "no-store"' in client assert "seenClaims" in client and "activeClaims" in client assert "MUST NOT be accepted" in contracts and "single-use claim_id" in contracts assert "never_again" in contracts and "cooldown_seconds" in contracts assert ".hux-onboarding" in styles assert "body" not in styles and ":root" not in styles assert "focus-visible" in styles and "prefers-reduced-motion" in styles def test_hux_onboarding_sources_are_bounded_and_endpoint_only(): """The slice defines backend needs but cannot mutate runtime wiring.""" sources = sorted(ONBOARDING.glob("*")) assert {path.name for path in sources} == { "OnboardingSuggestions.tsx", "client.ts", "contracts.ts", "index.ts", "model.ts", "security.ts", "styles.css", "types.ts", } for path in sources: assert len(path.read_text(encoding="utf-8").splitlines()) <= 500 contracts = (ONBOARDING / "contracts.ts").read_text(encoding="utf-8") assert "POST /hux/v1/onboarding/evaluate" in contracts assert ( "POST /hux/v1/onboarding/suggestions/{sug_id}/decisions" in contracts ) assert "MUST NOT write suppression state" in contracts assert "A decision never performs" in contracts