chore: merge develop into hare/develop
This commit is contained in:
@@ -0,0 +1,386 @@
|
||||
{
|
||||
"schemaVersion": 1,
|
||||
"id": "hosting-settings-dark",
|
||||
"title": "Hosting settings: synthetic UI conditions on production shell",
|
||||
"baseUrl": "http://127.0.0.1:15378",
|
||||
"colorScheme": "dark",
|
||||
"reducedMotion": "reduce",
|
||||
"personas": [
|
||||
{
|
||||
"id": "fixture",
|
||||
"label": "Synthetic API projection; no real authentication",
|
||||
"auth": {
|
||||
"kind": "anonymous"
|
||||
}
|
||||
}
|
||||
],
|
||||
"viewports": [
|
||||
{
|
||||
"label": "desktop",
|
||||
"width": 1440,
|
||||
"height": 900
|
||||
},
|
||||
{
|
||||
"label": "narrow",
|
||||
"width": 768,
|
||||
"height": 900
|
||||
},
|
||||
{
|
||||
"label": "mobile",
|
||||
"width": 390,
|
||||
"height": 844
|
||||
}
|
||||
],
|
||||
"routes": [
|
||||
{
|
||||
"id": "admin-on",
|
||||
"label": "admin-on",
|
||||
"path": "/hosting/settings?fixture=admin-on",
|
||||
"goal": "Verify production shell UI projection, not server authorization.",
|
||||
"dataState": "Synthetic admin; policy on.",
|
||||
"ready": {
|
||||
"kind": "selector",
|
||||
"selector": "button:has-text(\"Edit registration policy\")"
|
||||
},
|
||||
"capturePoints": [
|
||||
{
|
||||
"id": "initial",
|
||||
"label": "Loaded hosting-wide policy"
|
||||
},
|
||||
{
|
||||
"id": "edit",
|
||||
"label": "Keyboard edit focus",
|
||||
"interaction": [
|
||||
{
|
||||
"action": "press",
|
||||
"selector": "button:has-text(\"Edit registration policy\")",
|
||||
"key": "Enter"
|
||||
}
|
||||
],
|
||||
"ready": {
|
||||
"kind": "selector",
|
||||
"selector": "input[type=\"checkbox\"]:focus"
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "saved",
|
||||
"label": "Confirmed save",
|
||||
"interaction": [
|
||||
{
|
||||
"action": "press",
|
||||
"selector": "input[type=\"checkbox\"]",
|
||||
"key": "Space"
|
||||
},
|
||||
{
|
||||
"action": "click",
|
||||
"selector": "button:has-text(\"Save settings\")"
|
||||
}
|
||||
],
|
||||
"ready": {
|
||||
"kind": "selector",
|
||||
"selector": "[role=\"status\"]:has-text(\"Hosting settings saved.\")"
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "admin-off",
|
||||
"label": "admin-off",
|
||||
"path": "/hosting/settings?fixture=admin-off",
|
||||
"goal": "Verify production shell UI projection, not server authorization.",
|
||||
"dataState": "Synthetic admin; policy off.",
|
||||
"ready": {
|
||||
"kind": "selector",
|
||||
"selector": "button:has-text(\"Edit registration policy\")"
|
||||
},
|
||||
"capturePoints": [
|
||||
{
|
||||
"id": "initial",
|
||||
"label": "Loaded hosting-wide policy"
|
||||
},
|
||||
{
|
||||
"id": "edit",
|
||||
"label": "Keyboard edit focus",
|
||||
"interaction": [
|
||||
{
|
||||
"action": "press",
|
||||
"selector": "button:has-text(\"Edit registration policy\")",
|
||||
"key": "Enter"
|
||||
}
|
||||
],
|
||||
"ready": {
|
||||
"kind": "selector",
|
||||
"selector": "input[type=\"checkbox\"]:focus"
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "saved",
|
||||
"label": "Confirmed save",
|
||||
"interaction": [
|
||||
{
|
||||
"action": "press",
|
||||
"selector": "input[type=\"checkbox\"]",
|
||||
"key": "Space"
|
||||
},
|
||||
{
|
||||
"action": "click",
|
||||
"selector": "button:has-text(\"Save settings\")"
|
||||
}
|
||||
],
|
||||
"ready": {
|
||||
"kind": "selector",
|
||||
"selector": "[role=\"status\"]:has-text(\"Hosting settings saved.\")"
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "ordinary",
|
||||
"label": "ordinary",
|
||||
"path": "/hosting/settings?fixture=ordinary",
|
||||
"goal": "Verify production shell UI projection, not server authorization.",
|
||||
"dataState": "Synthetic authenticated ordinary user, no admin controls.",
|
||||
"ready": {
|
||||
"kind": "selector",
|
||||
"selector": "p:has-text(\"Hosting administrator access is required.\")"
|
||||
},
|
||||
"capturePoints": [
|
||||
{
|
||||
"id": "initial",
|
||||
"label": "Initial state"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "anonymous",
|
||||
"label": "anonymous",
|
||||
"path": "/hosting/settings?fixture=anonymous",
|
||||
"goal": "Verify production shell UI projection, not server authorization.",
|
||||
"dataState": "Synthetic anonymous visitor; sign-in guidance, no controls.",
|
||||
"ready": {
|
||||
"kind": "selector",
|
||||
"selector": "a:has-text(\"Open Account\")"
|
||||
},
|
||||
"capturePoints": [
|
||||
{
|
||||
"id": "initial",
|
||||
"label": "Initial state"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "admin-loading",
|
||||
"label": "admin-loading",
|
||||
"path": "/hosting/settings?fixture=admin-loading",
|
||||
"goal": "Verify production shell UI projection, not server authorization.",
|
||||
"dataState": "Settings GET intentionally held pending; shell remains usable.",
|
||||
"ready": {
|
||||
"kind": "selector",
|
||||
"selector": "[role=\"status\"]:has-text(\"Loading hosting settings\")"
|
||||
},
|
||||
"capturePoints": [
|
||||
{
|
||||
"id": "initial",
|
||||
"label": "Initial state"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "admin-load-error",
|
||||
"label": "admin-load-error",
|
||||
"path": "/hosting/settings?fixture=admin-load-error",
|
||||
"goal": "Verify production shell UI projection, not server authorization.",
|
||||
"dataState": "Intentional HTTP503; expected console resource error and visible alert.",
|
||||
"ready": {
|
||||
"kind": "selector",
|
||||
"selector": "button:has-text(\"Retry loading settings\")"
|
||||
},
|
||||
"capturePoints": [
|
||||
{
|
||||
"id": "initial",
|
||||
"label": "Initial state"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "admin-saving",
|
||||
"label": "admin-saving",
|
||||
"path": "/hosting/settings?fixture=admin-saving",
|
||||
"goal": "Verify production shell UI projection, not server authorization.",
|
||||
"dataState": "PUT held pending; last loaded policy retained, edit controls disabled.",
|
||||
"ready": {
|
||||
"kind": "selector",
|
||||
"selector": "button:has-text(\"Edit registration policy\")"
|
||||
},
|
||||
"capturePoints": [
|
||||
{
|
||||
"id": "saving",
|
||||
"label": "saving",
|
||||
"interaction": [
|
||||
{
|
||||
"action": "click",
|
||||
"selector": "button:has-text(\"Edit registration policy\")"
|
||||
},
|
||||
{
|
||||
"action": "press",
|
||||
"selector": "input[type=\"checkbox\"]",
|
||||
"key": "Space"
|
||||
},
|
||||
{
|
||||
"action": "click",
|
||||
"selector": "button:has-text(\"Save settings\")"
|
||||
}
|
||||
],
|
||||
"ready": {
|
||||
"kind": "selector",
|
||||
"selector": "button:has-text(\"Saving…\")"
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "admin-save-error",
|
||||
"label": "admin-save-error",
|
||||
"path": "/hosting/settings?fixture=admin-save-error",
|
||||
"goal": "Verify production shell UI projection, not server authorization.",
|
||||
"dataState": "Intentional PUT HTTP503; outcome unknown, retry blocked until reload.",
|
||||
"ready": {
|
||||
"kind": "selector",
|
||||
"selector": "button:has-text(\"Edit registration policy\")"
|
||||
},
|
||||
"capturePoints": [
|
||||
{
|
||||
"id": "save-error",
|
||||
"label": "save-error",
|
||||
"interaction": [
|
||||
{
|
||||
"action": "click",
|
||||
"selector": "button:has-text(\"Edit registration policy\")"
|
||||
},
|
||||
{
|
||||
"action": "press",
|
||||
"selector": "input[type=\"checkbox\"]",
|
||||
"key": "Space"
|
||||
},
|
||||
{
|
||||
"action": "click",
|
||||
"selector": "button:has-text(\"Save settings\")"
|
||||
}
|
||||
],
|
||||
"ready": {
|
||||
"kind": "selector",
|
||||
"selector": "[role=\"alert\"]"
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "account-off",
|
||||
"label": "account-off",
|
||||
"path": "/register?fixture=account-off",
|
||||
"goal": "Verify production shell UI projection, not server authorization.",
|
||||
"dataState": "Anonymous policy off; registration disabled and existing login link available.",
|
||||
"ready": {
|
||||
"kind": "selector",
|
||||
"selector": "p:has-text(\"New account registration is disabled.\")"
|
||||
},
|
||||
"capturePoints": [
|
||||
{
|
||||
"id": "initial",
|
||||
"label": "Initial state",
|
||||
"fullPage": true
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "admin-account",
|
||||
"label": "admin-account",
|
||||
"path": "/account?fixture=admin-account",
|
||||
"goal": "Verify production shell UI projection, not server authorization.",
|
||||
"dataState": "Authenticated own account; addition available independently of registration policy. Global navigation remains on Workspace shell.",
|
||||
"ready": {
|
||||
"kind": "selector",
|
||||
"selector": "button:has-text(\"Add passkey to alice\")"
|
||||
},
|
||||
"capturePoints": [
|
||||
{
|
||||
"id": "initial",
|
||||
"label": "Initial state",
|
||||
"fullPage": true
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "ordinary-account-off",
|
||||
"label": "ordinary-account-off",
|
||||
"path": "/account?fixture=ordinary-account-off",
|
||||
"goal": "Verify production shell UI projection, not server authorization.",
|
||||
"dataState": "Authenticated own account; addition available independently of registration policy. Global navigation remains on Workspace shell.",
|
||||
"ready": {
|
||||
"kind": "selector",
|
||||
"selector": "button:has-text(\"Add passkey to alice\")"
|
||||
},
|
||||
"capturePoints": [
|
||||
{
|
||||
"id": "initial",
|
||||
"label": "Initial state",
|
||||
"fullPage": true
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "account-error",
|
||||
"label": "account-error",
|
||||
"path": "/register?fixture=account-error",
|
||||
"goal": "Verify production shell UI projection, not server authorization.",
|
||||
"dataState": "Intentional policy HTTP503; expected console resource error and visible alert; login retained.",
|
||||
"ready": {
|
||||
"kind": "selector",
|
||||
"selector": "button:has-text(\"Retry registration availability\")"
|
||||
},
|
||||
"capturePoints": [
|
||||
{
|
||||
"id": "initial",
|
||||
"label": "Initial state",
|
||||
"fullPage": true
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "account-loading",
|
||||
"label": "account-loading",
|
||||
"path": "/register?fixture=account-loading",
|
||||
"goal": "Verify production shell UI projection, not server authorization.",
|
||||
"dataState": "Policy request held pending; login remains available after session loads.",
|
||||
"ready": {
|
||||
"kind": "selector",
|
||||
"selector": "[role=\"status\"]:has-text(\"Checking registration availability\")"
|
||||
},
|
||||
"capturePoints": [
|
||||
{
|
||||
"id": "initial",
|
||||
"label": "Initial state",
|
||||
"fullPage": true
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"processes": [
|
||||
{
|
||||
"id": "hosting-ui-fixture",
|
||||
"command": "deno",
|
||||
"cwd": "../../..",
|
||||
"args": [
|
||||
"run",
|
||||
"--config",
|
||||
"tools/web-ux/deno.json",
|
||||
"--allow-read",
|
||||
"--allow-net",
|
||||
"web/workspace/test/hosting-browser/fixture-server.ts",
|
||||
"15378",
|
||||
"web/workspace/build"
|
||||
],
|
||||
"readyUrl": "http://127.0.0.1:15378/health"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,386 @@
|
||||
{
|
||||
"schemaVersion": 1,
|
||||
"id": "hosting-settings-light",
|
||||
"title": "Hosting settings: synthetic UI conditions on production shell",
|
||||
"baseUrl": "http://127.0.0.1:15378",
|
||||
"colorScheme": "light",
|
||||
"reducedMotion": "reduce",
|
||||
"personas": [
|
||||
{
|
||||
"id": "fixture",
|
||||
"label": "Synthetic API projection; no real authentication",
|
||||
"auth": {
|
||||
"kind": "anonymous"
|
||||
}
|
||||
}
|
||||
],
|
||||
"viewports": [
|
||||
{
|
||||
"label": "desktop",
|
||||
"width": 1440,
|
||||
"height": 900
|
||||
},
|
||||
{
|
||||
"label": "narrow",
|
||||
"width": 768,
|
||||
"height": 900
|
||||
},
|
||||
{
|
||||
"label": "mobile",
|
||||
"width": 390,
|
||||
"height": 844
|
||||
}
|
||||
],
|
||||
"routes": [
|
||||
{
|
||||
"id": "admin-on",
|
||||
"label": "admin-on",
|
||||
"path": "/hosting/settings?fixture=admin-on",
|
||||
"goal": "Verify production shell UI projection, not server authorization.",
|
||||
"dataState": "Synthetic admin; policy on.",
|
||||
"ready": {
|
||||
"kind": "selector",
|
||||
"selector": "button:has-text(\"Edit registration policy\")"
|
||||
},
|
||||
"capturePoints": [
|
||||
{
|
||||
"id": "initial",
|
||||
"label": "Loaded hosting-wide policy"
|
||||
},
|
||||
{
|
||||
"id": "edit",
|
||||
"label": "Keyboard edit focus",
|
||||
"interaction": [
|
||||
{
|
||||
"action": "press",
|
||||
"selector": "button:has-text(\"Edit registration policy\")",
|
||||
"key": "Enter"
|
||||
}
|
||||
],
|
||||
"ready": {
|
||||
"kind": "selector",
|
||||
"selector": "input[type=\"checkbox\"]:focus"
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "saved",
|
||||
"label": "Confirmed save",
|
||||
"interaction": [
|
||||
{
|
||||
"action": "press",
|
||||
"selector": "input[type=\"checkbox\"]",
|
||||
"key": "Space"
|
||||
},
|
||||
{
|
||||
"action": "click",
|
||||
"selector": "button:has-text(\"Save settings\")"
|
||||
}
|
||||
],
|
||||
"ready": {
|
||||
"kind": "selector",
|
||||
"selector": "[role=\"status\"]:has-text(\"Hosting settings saved.\")"
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "admin-off",
|
||||
"label": "admin-off",
|
||||
"path": "/hosting/settings?fixture=admin-off",
|
||||
"goal": "Verify production shell UI projection, not server authorization.",
|
||||
"dataState": "Synthetic admin; policy off.",
|
||||
"ready": {
|
||||
"kind": "selector",
|
||||
"selector": "button:has-text(\"Edit registration policy\")"
|
||||
},
|
||||
"capturePoints": [
|
||||
{
|
||||
"id": "initial",
|
||||
"label": "Loaded hosting-wide policy"
|
||||
},
|
||||
{
|
||||
"id": "edit",
|
||||
"label": "Keyboard edit focus",
|
||||
"interaction": [
|
||||
{
|
||||
"action": "press",
|
||||
"selector": "button:has-text(\"Edit registration policy\")",
|
||||
"key": "Enter"
|
||||
}
|
||||
],
|
||||
"ready": {
|
||||
"kind": "selector",
|
||||
"selector": "input[type=\"checkbox\"]:focus"
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "saved",
|
||||
"label": "Confirmed save",
|
||||
"interaction": [
|
||||
{
|
||||
"action": "press",
|
||||
"selector": "input[type=\"checkbox\"]",
|
||||
"key": "Space"
|
||||
},
|
||||
{
|
||||
"action": "click",
|
||||
"selector": "button:has-text(\"Save settings\")"
|
||||
}
|
||||
],
|
||||
"ready": {
|
||||
"kind": "selector",
|
||||
"selector": "[role=\"status\"]:has-text(\"Hosting settings saved.\")"
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "ordinary",
|
||||
"label": "ordinary",
|
||||
"path": "/hosting/settings?fixture=ordinary",
|
||||
"goal": "Verify production shell UI projection, not server authorization.",
|
||||
"dataState": "Synthetic authenticated ordinary user, no admin controls.",
|
||||
"ready": {
|
||||
"kind": "selector",
|
||||
"selector": "p:has-text(\"Hosting administrator access is required.\")"
|
||||
},
|
||||
"capturePoints": [
|
||||
{
|
||||
"id": "initial",
|
||||
"label": "Initial state"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "anonymous",
|
||||
"label": "anonymous",
|
||||
"path": "/hosting/settings?fixture=anonymous",
|
||||
"goal": "Verify production shell UI projection, not server authorization.",
|
||||
"dataState": "Synthetic anonymous visitor; sign-in guidance, no controls.",
|
||||
"ready": {
|
||||
"kind": "selector",
|
||||
"selector": "a:has-text(\"Open Account\")"
|
||||
},
|
||||
"capturePoints": [
|
||||
{
|
||||
"id": "initial",
|
||||
"label": "Initial state"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "admin-loading",
|
||||
"label": "admin-loading",
|
||||
"path": "/hosting/settings?fixture=admin-loading",
|
||||
"goal": "Verify production shell UI projection, not server authorization.",
|
||||
"dataState": "Settings GET intentionally held pending; shell remains usable.",
|
||||
"ready": {
|
||||
"kind": "selector",
|
||||
"selector": "[role=\"status\"]:has-text(\"Loading hosting settings\")"
|
||||
},
|
||||
"capturePoints": [
|
||||
{
|
||||
"id": "initial",
|
||||
"label": "Initial state"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "admin-load-error",
|
||||
"label": "admin-load-error",
|
||||
"path": "/hosting/settings?fixture=admin-load-error",
|
||||
"goal": "Verify production shell UI projection, not server authorization.",
|
||||
"dataState": "Intentional HTTP503; expected console resource error and visible alert.",
|
||||
"ready": {
|
||||
"kind": "selector",
|
||||
"selector": "button:has-text(\"Retry loading settings\")"
|
||||
},
|
||||
"capturePoints": [
|
||||
{
|
||||
"id": "initial",
|
||||
"label": "Initial state"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "admin-saving",
|
||||
"label": "admin-saving",
|
||||
"path": "/hosting/settings?fixture=admin-saving",
|
||||
"goal": "Verify production shell UI projection, not server authorization.",
|
||||
"dataState": "PUT held pending; last loaded policy retained, edit controls disabled.",
|
||||
"ready": {
|
||||
"kind": "selector",
|
||||
"selector": "button:has-text(\"Edit registration policy\")"
|
||||
},
|
||||
"capturePoints": [
|
||||
{
|
||||
"id": "saving",
|
||||
"label": "saving",
|
||||
"interaction": [
|
||||
{
|
||||
"action": "click",
|
||||
"selector": "button:has-text(\"Edit registration policy\")"
|
||||
},
|
||||
{
|
||||
"action": "press",
|
||||
"selector": "input[type=\"checkbox\"]",
|
||||
"key": "Space"
|
||||
},
|
||||
{
|
||||
"action": "click",
|
||||
"selector": "button:has-text(\"Save settings\")"
|
||||
}
|
||||
],
|
||||
"ready": {
|
||||
"kind": "selector",
|
||||
"selector": "button:has-text(\"Saving…\")"
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "admin-save-error",
|
||||
"label": "admin-save-error",
|
||||
"path": "/hosting/settings?fixture=admin-save-error",
|
||||
"goal": "Verify production shell UI projection, not server authorization.",
|
||||
"dataState": "Intentional PUT HTTP503; outcome unknown, retry blocked until reload.",
|
||||
"ready": {
|
||||
"kind": "selector",
|
||||
"selector": "button:has-text(\"Edit registration policy\")"
|
||||
},
|
||||
"capturePoints": [
|
||||
{
|
||||
"id": "save-error",
|
||||
"label": "save-error",
|
||||
"interaction": [
|
||||
{
|
||||
"action": "click",
|
||||
"selector": "button:has-text(\"Edit registration policy\")"
|
||||
},
|
||||
{
|
||||
"action": "press",
|
||||
"selector": "input[type=\"checkbox\"]",
|
||||
"key": "Space"
|
||||
},
|
||||
{
|
||||
"action": "click",
|
||||
"selector": "button:has-text(\"Save settings\")"
|
||||
}
|
||||
],
|
||||
"ready": {
|
||||
"kind": "selector",
|
||||
"selector": "[role=\"alert\"]"
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "account-off",
|
||||
"label": "account-off",
|
||||
"path": "/register?fixture=account-off",
|
||||
"goal": "Verify production shell UI projection, not server authorization.",
|
||||
"dataState": "Anonymous policy off; registration disabled and existing login link available.",
|
||||
"ready": {
|
||||
"kind": "selector",
|
||||
"selector": "p:has-text(\"New account registration is disabled.\")"
|
||||
},
|
||||
"capturePoints": [
|
||||
{
|
||||
"id": "initial",
|
||||
"label": "Initial state",
|
||||
"fullPage": true
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "admin-account",
|
||||
"label": "admin-account",
|
||||
"path": "/account?fixture=admin-account",
|
||||
"goal": "Verify production shell UI projection, not server authorization.",
|
||||
"dataState": "Authenticated own account; addition available independently of registration policy. Global navigation remains on Workspace shell.",
|
||||
"ready": {
|
||||
"kind": "selector",
|
||||
"selector": "button:has-text(\"Add passkey to alice\")"
|
||||
},
|
||||
"capturePoints": [
|
||||
{
|
||||
"id": "initial",
|
||||
"label": "Initial state",
|
||||
"fullPage": true
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "ordinary-account-off",
|
||||
"label": "ordinary-account-off",
|
||||
"path": "/account?fixture=ordinary-account-off",
|
||||
"goal": "Verify production shell UI projection, not server authorization.",
|
||||
"dataState": "Authenticated own account; addition available independently of registration policy. Global navigation remains on Workspace shell.",
|
||||
"ready": {
|
||||
"kind": "selector",
|
||||
"selector": "button:has-text(\"Add passkey to alice\")"
|
||||
},
|
||||
"capturePoints": [
|
||||
{
|
||||
"id": "initial",
|
||||
"label": "Initial state",
|
||||
"fullPage": true
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "account-error",
|
||||
"label": "account-error",
|
||||
"path": "/register?fixture=account-error",
|
||||
"goal": "Verify production shell UI projection, not server authorization.",
|
||||
"dataState": "Intentional policy HTTP503; expected console resource error and visible alert; login retained.",
|
||||
"ready": {
|
||||
"kind": "selector",
|
||||
"selector": "button:has-text(\"Retry registration availability\")"
|
||||
},
|
||||
"capturePoints": [
|
||||
{
|
||||
"id": "initial",
|
||||
"label": "Initial state",
|
||||
"fullPage": true
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "account-loading",
|
||||
"label": "account-loading",
|
||||
"path": "/register?fixture=account-loading",
|
||||
"goal": "Verify production shell UI projection, not server authorization.",
|
||||
"dataState": "Policy request held pending; login remains available after session loads.",
|
||||
"ready": {
|
||||
"kind": "selector",
|
||||
"selector": "[role=\"status\"]:has-text(\"Checking registration availability\")"
|
||||
},
|
||||
"capturePoints": [
|
||||
{
|
||||
"id": "initial",
|
||||
"label": "Initial state",
|
||||
"fullPage": true
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"processes": [
|
||||
{
|
||||
"id": "hosting-ui-fixture",
|
||||
"command": "deno",
|
||||
"cwd": "../../..",
|
||||
"args": [
|
||||
"run",
|
||||
"--config",
|
||||
"tools/web-ux/deno.json",
|
||||
"--allow-read",
|
||||
"--allow-net",
|
||||
"web/workspace/test/hosting-browser/fixture-server.ts",
|
||||
"15378",
|
||||
"web/workspace/build"
|
||||
],
|
||||
"readyUrl": "http://127.0.0.1:15378/health"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,178 @@
|
||||
{
|
||||
"schemaVersion": 1,
|
||||
"id": "hosting-setup-dark",
|
||||
"title": "Hosting setup production UI: synthetic HTTP and navigator.credentials boundary only",
|
||||
"baseUrl": "http://127.0.0.1:15378",
|
||||
"colorScheme": "dark",
|
||||
"reducedMotion": "reduce",
|
||||
"personas": [
|
||||
{
|
||||
"id": "fixture",
|
||||
"label": "Synthetic API projection; no real authentication",
|
||||
"auth": {
|
||||
"kind": "anonymous"
|
||||
}
|
||||
}
|
||||
],
|
||||
"viewports": [
|
||||
{
|
||||
"label": "desktop",
|
||||
"width": 1440,
|
||||
"height": 900
|
||||
},
|
||||
{
|
||||
"label": "narrow",
|
||||
"width": 768,
|
||||
"height": 900
|
||||
},
|
||||
{
|
||||
"label": "mobile",
|
||||
"width": 390,
|
||||
"height": 844
|
||||
}
|
||||
],
|
||||
"routes": [
|
||||
{
|
||||
"id": "setup-flow",
|
||||
"label": "Setup enrollment and login UI",
|
||||
"path": "/hosting/setup?fixture=setup-flow",
|
||||
"goal": "Separate host-token enrollment from explicit passkey login and verified settings access.",
|
||||
"dataState": "Synthetic actor, API and non-cryptographic navigator.credentials; no real token/authentication. Test-only bootstrap changes browser API boundary, not production UI modules/styles.",
|
||||
"ready": {
|
||||
"kind": "selector",
|
||||
"selector": "#host-setup-token:enabled"
|
||||
},
|
||||
"capturePoints": [
|
||||
{
|
||||
"id": "initial",
|
||||
"label": "Empty password field; enrollment disabled",
|
||||
"fullPage": true
|
||||
},
|
||||
{
|
||||
"id": "host-help",
|
||||
"label": "Trusted-host instructions expanded",
|
||||
"interaction": [
|
||||
{
|
||||
"action": "press",
|
||||
"selector": "summary",
|
||||
"key": "Enter"
|
||||
}
|
||||
],
|
||||
"ready": {
|
||||
"kind": "selector",
|
||||
"selector": "details[open]"
|
||||
},
|
||||
"fullPage": true
|
||||
},
|
||||
{
|
||||
"id": "masked-entry",
|
||||
"label": "Synthetic input password-masked; action enabled",
|
||||
"interaction": [
|
||||
{
|
||||
"action": "press",
|
||||
"selector": "summary",
|
||||
"key": "Enter"
|
||||
},
|
||||
{
|
||||
"action": "fill",
|
||||
"selector": "#host-setup-token",
|
||||
"value": "${WEB_UX_SYNTHETIC_SETUP_INPUT}"
|
||||
}
|
||||
],
|
||||
"ready": {
|
||||
"kind": "selector",
|
||||
"selector": "button:has-text(\"Add administrator passkey\"):enabled"
|
||||
},
|
||||
"fullPage": true
|
||||
},
|
||||
{
|
||||
"id": "enrolled",
|
||||
"label": "Enrollment is not login; explicit login handoff",
|
||||
"interaction": [
|
||||
{
|
||||
"action": "click",
|
||||
"selector": "button:has-text(\"Add administrator passkey\")"
|
||||
}
|
||||
],
|
||||
"ready": {
|
||||
"kind": "selector",
|
||||
"selector": "button:has-text(\"Sign in with new passkey\"):enabled"
|
||||
},
|
||||
"fullPage": true
|
||||
},
|
||||
{
|
||||
"id": "verified",
|
||||
"label": "Matching actor/session/access projected verified; settings link",
|
||||
"interaction": [
|
||||
{
|
||||
"action": "press",
|
||||
"selector": "button:has-text(\"Sign in with new passkey\")",
|
||||
"key": "Enter"
|
||||
}
|
||||
],
|
||||
"ready": {
|
||||
"kind": "selector",
|
||||
"selector": "a:has-text(\"Open hosting settings\")"
|
||||
},
|
||||
"fullPage": true
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "setup-reject",
|
||||
"label": "Rejected setup enrollment",
|
||||
"path": "/hosting/setup?fixture=setup-reject",
|
||||
"goal": "Show safe unconfirmed-enrollment guidance with empty cleared token and no settings action.",
|
||||
"dataState": "Intentional addition/options HTTP403. Expected console/resource diagnostics; no real authorization exercised.",
|
||||
"ready": {
|
||||
"kind": "selector",
|
||||
"selector": "#host-setup-token:enabled"
|
||||
},
|
||||
"capturePoints": [
|
||||
{
|
||||
"id": "rejected",
|
||||
"label": "Rejected attempt; token cleared",
|
||||
"interaction": [
|
||||
{
|
||||
"action": "fill",
|
||||
"selector": "#host-setup-token",
|
||||
"value": "${WEB_UX_SYNTHETIC_SETUP_INPUT}"
|
||||
},
|
||||
{
|
||||
"action": "click",
|
||||
"selector": "button:has-text(\"Add administrator passkey\")"
|
||||
}
|
||||
],
|
||||
"ready": {
|
||||
"kind": "selector",
|
||||
"selector": "[role=\"alert\"]"
|
||||
},
|
||||
"fullPage": true
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"processes": [
|
||||
{
|
||||
"id": "hosting-ui-fixture",
|
||||
"command": "deno",
|
||||
"cwd": "../../..",
|
||||
"args": [
|
||||
"run",
|
||||
"--config",
|
||||
"tools/web-ux/deno.json",
|
||||
"--allow-read",
|
||||
"--allow-net",
|
||||
"web/workspace/test/hosting-browser/fixture-server.ts",
|
||||
"15378",
|
||||
"web/workspace/build"
|
||||
],
|
||||
"readyUrl": "http://127.0.0.1:15378/health"
|
||||
}
|
||||
],
|
||||
"redact": {
|
||||
"text": [
|
||||
"${WEB_UX_SYNTHETIC_SETUP_INPUT}"
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,178 @@
|
||||
{
|
||||
"schemaVersion": 1,
|
||||
"id": "hosting-setup-light",
|
||||
"title": "Hosting setup production UI: synthetic HTTP and navigator.credentials boundary only",
|
||||
"baseUrl": "http://127.0.0.1:15378",
|
||||
"colorScheme": "light",
|
||||
"reducedMotion": "reduce",
|
||||
"personas": [
|
||||
{
|
||||
"id": "fixture",
|
||||
"label": "Synthetic API projection; no real authentication",
|
||||
"auth": {
|
||||
"kind": "anonymous"
|
||||
}
|
||||
}
|
||||
],
|
||||
"viewports": [
|
||||
{
|
||||
"label": "desktop",
|
||||
"width": 1440,
|
||||
"height": 900
|
||||
},
|
||||
{
|
||||
"label": "narrow",
|
||||
"width": 768,
|
||||
"height": 900
|
||||
},
|
||||
{
|
||||
"label": "mobile",
|
||||
"width": 390,
|
||||
"height": 844
|
||||
}
|
||||
],
|
||||
"routes": [
|
||||
{
|
||||
"id": "setup-flow",
|
||||
"label": "Setup enrollment and login UI",
|
||||
"path": "/hosting/setup?fixture=setup-flow",
|
||||
"goal": "Separate host-token enrollment from explicit passkey login and verified settings access.",
|
||||
"dataState": "Synthetic actor, API and non-cryptographic navigator.credentials; no real token/authentication. Test-only bootstrap changes browser API boundary, not production UI modules/styles.",
|
||||
"ready": {
|
||||
"kind": "selector",
|
||||
"selector": "#host-setup-token:enabled"
|
||||
},
|
||||
"capturePoints": [
|
||||
{
|
||||
"id": "initial",
|
||||
"label": "Empty password field; enrollment disabled",
|
||||
"fullPage": true
|
||||
},
|
||||
{
|
||||
"id": "host-help",
|
||||
"label": "Trusted-host instructions expanded",
|
||||
"interaction": [
|
||||
{
|
||||
"action": "press",
|
||||
"selector": "summary",
|
||||
"key": "Enter"
|
||||
}
|
||||
],
|
||||
"ready": {
|
||||
"kind": "selector",
|
||||
"selector": "details[open]"
|
||||
},
|
||||
"fullPage": true
|
||||
},
|
||||
{
|
||||
"id": "masked-entry",
|
||||
"label": "Synthetic input password-masked; action enabled",
|
||||
"interaction": [
|
||||
{
|
||||
"action": "press",
|
||||
"selector": "summary",
|
||||
"key": "Enter"
|
||||
},
|
||||
{
|
||||
"action": "fill",
|
||||
"selector": "#host-setup-token",
|
||||
"value": "${WEB_UX_SYNTHETIC_SETUP_INPUT}"
|
||||
}
|
||||
],
|
||||
"ready": {
|
||||
"kind": "selector",
|
||||
"selector": "button:has-text(\"Add administrator passkey\"):enabled"
|
||||
},
|
||||
"fullPage": true
|
||||
},
|
||||
{
|
||||
"id": "enrolled",
|
||||
"label": "Enrollment is not login; explicit login handoff",
|
||||
"interaction": [
|
||||
{
|
||||
"action": "click",
|
||||
"selector": "button:has-text(\"Add administrator passkey\")"
|
||||
}
|
||||
],
|
||||
"ready": {
|
||||
"kind": "selector",
|
||||
"selector": "button:has-text(\"Sign in with new passkey\"):enabled"
|
||||
},
|
||||
"fullPage": true
|
||||
},
|
||||
{
|
||||
"id": "verified",
|
||||
"label": "Matching actor/session/access projected verified; settings link",
|
||||
"interaction": [
|
||||
{
|
||||
"action": "press",
|
||||
"selector": "button:has-text(\"Sign in with new passkey\")",
|
||||
"key": "Enter"
|
||||
}
|
||||
],
|
||||
"ready": {
|
||||
"kind": "selector",
|
||||
"selector": "a:has-text(\"Open hosting settings\")"
|
||||
},
|
||||
"fullPage": true
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "setup-reject",
|
||||
"label": "Rejected setup enrollment",
|
||||
"path": "/hosting/setup?fixture=setup-reject",
|
||||
"goal": "Show safe unconfirmed-enrollment guidance with empty cleared token and no settings action.",
|
||||
"dataState": "Intentional addition/options HTTP403. Expected console/resource diagnostics; no real authorization exercised.",
|
||||
"ready": {
|
||||
"kind": "selector",
|
||||
"selector": "#host-setup-token:enabled"
|
||||
},
|
||||
"capturePoints": [
|
||||
{
|
||||
"id": "rejected",
|
||||
"label": "Rejected attempt; token cleared",
|
||||
"interaction": [
|
||||
{
|
||||
"action": "fill",
|
||||
"selector": "#host-setup-token",
|
||||
"value": "${WEB_UX_SYNTHETIC_SETUP_INPUT}"
|
||||
},
|
||||
{
|
||||
"action": "click",
|
||||
"selector": "button:has-text(\"Add administrator passkey\")"
|
||||
}
|
||||
],
|
||||
"ready": {
|
||||
"kind": "selector",
|
||||
"selector": "[role=\"alert\"]"
|
||||
},
|
||||
"fullPage": true
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"processes": [
|
||||
{
|
||||
"id": "hosting-ui-fixture",
|
||||
"command": "deno",
|
||||
"cwd": "../../..",
|
||||
"args": [
|
||||
"run",
|
||||
"--config",
|
||||
"tools/web-ux/deno.json",
|
||||
"--allow-read",
|
||||
"--allow-net",
|
||||
"web/workspace/test/hosting-browser/fixture-server.ts",
|
||||
"15378",
|
||||
"web/workspace/build"
|
||||
],
|
||||
"readyUrl": "http://127.0.0.1:15378/health"
|
||||
}
|
||||
],
|
||||
"redact": {
|
||||
"text": [
|
||||
"${WEB_UX_SYNTHETIC_SETUP_INPUT}"
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,372 @@
|
||||
{
|
||||
"schemaVersion": 1,
|
||||
"id": "public-entry-dark",
|
||||
"title": "Public entry and authenticated Workspace selection",
|
||||
"baseUrl": "http://127.0.0.1:15413",
|
||||
"colorScheme": "dark",
|
||||
"reducedMotion": "reduce",
|
||||
"personas": [
|
||||
{
|
||||
"id": "fixture",
|
||||
"label": "Synthetic HTTP projection; not a real authentication session",
|
||||
"auth": {
|
||||
"kind": "anonymous"
|
||||
}
|
||||
}
|
||||
],
|
||||
"viewports": [
|
||||
{
|
||||
"label": "desktop",
|
||||
"width": 1440,
|
||||
"height": 900
|
||||
},
|
||||
{
|
||||
"label": "narrow",
|
||||
"width": 768,
|
||||
"height": 900
|
||||
},
|
||||
{
|
||||
"label": "mobile",
|
||||
"width": 390,
|
||||
"height": 900
|
||||
}
|
||||
],
|
||||
"routes": [
|
||||
{
|
||||
"id": "anonymous",
|
||||
"label": "anonymous",
|
||||
"path": "/?fixture=anonymous",
|
||||
"goal": "Verify entry, session and Workspace authority remain distinct with reachable actions",
|
||||
"dataState": "Known anonymous; policy allowed; Workspace API would reject",
|
||||
"ready": {
|
||||
"kind": "selector",
|
||||
"selector": "a.entry-primary"
|
||||
},
|
||||
"capturePoints": [
|
||||
{
|
||||
"id": "initial",
|
||||
"label": "Initial state",
|
||||
"fullPage": true
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "policy-disabled",
|
||||
"label": "policy-disabled",
|
||||
"path": "/?fixture=policy-disabled",
|
||||
"goal": "Verify entry, session and Workspace authority remain distinct with reachable actions",
|
||||
"dataState": "Policy disabled; login retained",
|
||||
"ready": {
|
||||
"kind": "selector",
|
||||
"selector": "section p:has-text(\"registration is disabled\")"
|
||||
},
|
||||
"capturePoints": [
|
||||
{
|
||||
"id": "initial",
|
||||
"label": "Initial state",
|
||||
"fullPage": true
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "policy-error",
|
||||
"label": "policy-error",
|
||||
"path": "/?fixture=policy-error",
|
||||
"goal": "Verify entry, session and Workspace authority remain distinct with reachable actions",
|
||||
"dataState": "Intentional public policy HTTP503; login retained, no registration link",
|
||||
"ready": {
|
||||
"kind": "selector",
|
||||
"selector": "section p:has-text(\"availability is unknown\")"
|
||||
},
|
||||
"capturePoints": [
|
||||
{
|
||||
"id": "initial",
|
||||
"label": "Initial state",
|
||||
"fullPage": true
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "policy-loading",
|
||||
"label": "policy-loading",
|
||||
"path": "/?fixture=policy-loading",
|
||||
"goal": "Verify entry, session and Workspace authority remain distinct with reachable actions",
|
||||
"dataState": "Public policy held pending; login retained",
|
||||
"ready": {
|
||||
"kind": "selector",
|
||||
"selector": "[role=status]:has-text(\"Checking registration\")"
|
||||
},
|
||||
"capturePoints": [
|
||||
{
|
||||
"id": "initial",
|
||||
"label": "Initial state",
|
||||
"fullPage": true
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "session-loading",
|
||||
"label": "session-loading",
|
||||
"path": "/?fixture=session-loading",
|
||||
"goal": "Verify entry, session and Workspace authority remain distinct with reachable actions",
|
||||
"dataState": "Whoami held pending; no anonymous or actor actions",
|
||||
"ready": {
|
||||
"kind": "selector",
|
||||
"selector": "[role=status]:has-text(\"Loading session\")"
|
||||
},
|
||||
"capturePoints": [
|
||||
{
|
||||
"id": "initial",
|
||||
"label": "Initial state",
|
||||
"fullPage": true
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "session-error",
|
||||
"label": "session-error",
|
||||
"path": "/?fixture=session-error",
|
||||
"goal": "Verify entry, session and Workspace authority remain distinct with reachable actions",
|
||||
"dataState": "Intentional whoami HTTP503; unknown, not logged out",
|
||||
"ready": {
|
||||
"kind": "selector",
|
||||
"selector": "[role=alert]"
|
||||
},
|
||||
"capturePoints": [
|
||||
{
|
||||
"id": "initial",
|
||||
"label": "Initial state",
|
||||
"fullPage": true
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "account",
|
||||
"label": "account",
|
||||
"path": "/?fixture=account",
|
||||
"goal": "Verify entry, session and Workspace authority remain distinct with reachable actions",
|
||||
"dataState": "Confirmed ordinary actor; no Workspace fetch or automatic navigation",
|
||||
"ready": {
|
||||
"kind": "selector",
|
||||
"selector": "a.entry-primary"
|
||||
},
|
||||
"capturePoints": [
|
||||
{
|
||||
"id": "initial",
|
||||
"label": "Initial state",
|
||||
"fullPage": true
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "admin",
|
||||
"label": "admin",
|
||||
"path": "/?fixture=admin",
|
||||
"goal": "Verify entry, session and Workspace authority remain distinct with reachable actions",
|
||||
"dataState": "Confirmed hosting admin grant independent of Workspace ownership",
|
||||
"ready": {
|
||||
"kind": "selector",
|
||||
"selector": "a[href=\"/hosting/settings\"]"
|
||||
},
|
||||
"capturePoints": [
|
||||
{
|
||||
"id": "initial",
|
||||
"label": "Initial state",
|
||||
"fullPage": true
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "dashboard-zero",
|
||||
"label": "dashboard-zero",
|
||||
"path": "/dashboard?fixture=account",
|
||||
"goal": "Verify entry, session and Workspace authority remain distinct with reachable actions",
|
||||
"dataState": "Confirmed actor; zero Workspaces",
|
||||
"ready": {
|
||||
"kind": "selector",
|
||||
"selector": ".workspace-empty-state"
|
||||
},
|
||||
"capturePoints": [
|
||||
{
|
||||
"id": "initial",
|
||||
"label": "Initial state",
|
||||
"fullPage": true
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "dashboard-one",
|
||||
"label": "dashboard-one",
|
||||
"path": "/dashboard?fixture=workspace-one",
|
||||
"goal": "Verify entry, session and Workspace authority remain distinct with reachable actions",
|
||||
"dataState": "One Workspace requires explicit selection",
|
||||
"ready": {
|
||||
"kind": "selector",
|
||||
"selector": ".workspace-catalog-card"
|
||||
},
|
||||
"capturePoints": [
|
||||
{
|
||||
"id": "initial",
|
||||
"label": "Initial state",
|
||||
"fullPage": true
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "dashboard-many",
|
||||
"label": "dashboard-many",
|
||||
"path": "/dashboard?fixture=workspace-many",
|
||||
"goal": "Verify entry, session and Workspace authority remain distinct with reachable actions",
|
||||
"dataState": "Three Workspaces, long display name, explicit selection",
|
||||
"ready": {
|
||||
"kind": "selector",
|
||||
"selector": ".workspace-catalog-card:nth-child(3)"
|
||||
},
|
||||
"capturePoints": [
|
||||
{
|
||||
"id": "initial",
|
||||
"label": "Initial state",
|
||||
"fullPage": true
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "dashboard-error",
|
||||
"label": "dashboard-error",
|
||||
"path": "/dashboard?fixture=workspace-error",
|
||||
"goal": "Verify entry, session and Workspace authority remain distinct with reachable actions",
|
||||
"dataState": "Intentional catalog HTTP503; not empty; account retained",
|
||||
"ready": {
|
||||
"kind": "selector",
|
||||
"selector": ".workspace-catalog-alert"
|
||||
},
|
||||
"capturePoints": [
|
||||
{
|
||||
"id": "initial",
|
||||
"label": "Initial state",
|
||||
"fullPage": true
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "dashboard-loading",
|
||||
"label": "dashboard-loading",
|
||||
"path": "/dashboard?fixture=workspace-loading",
|
||||
"goal": "Verify entry, session and Workspace authority remain distinct with reachable actions",
|
||||
"dataState": "Catalog held pending; account remains available",
|
||||
"ready": {
|
||||
"kind": "selector",
|
||||
"selector": "[role=status]:has-text(\"Loading Workspaces\")"
|
||||
},
|
||||
"capturePoints": [
|
||||
{
|
||||
"id": "initial",
|
||||
"label": "Initial state",
|
||||
"fullPage": true
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "dashboard-anonymous",
|
||||
"label": "dashboard-anonymous",
|
||||
"path": "/dashboard?fixture=anonymous",
|
||||
"goal": "Verify entry, session and Workspace authority remain distinct with reachable actions",
|
||||
"dataState": "Known anonymous; login returnTo dashboard, no catalog fetch",
|
||||
"ready": {
|
||||
"kind": "selector",
|
||||
"selector": "a.entry-primary"
|
||||
},
|
||||
"capturePoints": [
|
||||
{
|
||||
"id": "initial",
|
||||
"label": "Initial state",
|
||||
"fullPage": true
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "create-denied",
|
||||
"label": "create-denied",
|
||||
"path": "/dashboard?fixture=creation-denied#workspace-create-title",
|
||||
"goal": "Verify entry, session and Workspace authority remain distinct with reachable actions",
|
||||
"dataState": "Intentional creation HTTP403; exact retry, no resources created",
|
||||
"ready": {
|
||||
"kind": "selector",
|
||||
"selector": ".workspace-empty-state"
|
||||
},
|
||||
"capturePoints": [
|
||||
{
|
||||
"id": "initial",
|
||||
"label": "Creation denied",
|
||||
"fullPage": true,
|
||||
"interaction": [
|
||||
{
|
||||
"action": "fill",
|
||||
"selector": "input[autocomplete=off]",
|
||||
"value": "New Workspace"
|
||||
},
|
||||
{
|
||||
"action": "click",
|
||||
"selector": "button[type=submit]"
|
||||
}
|
||||
],
|
||||
"ready": {
|
||||
"kind": "selector",
|
||||
"selector": ".workspace-catalog-alert"
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "login-disabled",
|
||||
"label": "login-disabled",
|
||||
"path": "/login?fixture=policy-disabled",
|
||||
"goal": "Verify entry, session and Workspace authority remain distinct with reachable actions",
|
||||
"dataState": "Login remains usable while registration is disabled",
|
||||
"ready": {
|
||||
"kind": "selector",
|
||||
"selector": "nav p:has-text(\"registration is disabled\")"
|
||||
},
|
||||
"capturePoints": [
|
||||
{
|
||||
"id": "initial",
|
||||
"label": "Initial state",
|
||||
"fullPage": true
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"processes": [
|
||||
{
|
||||
"id": "workspace-fixture",
|
||||
"command": "deno",
|
||||
"cwd": "../../..",
|
||||
"args": [
|
||||
"run",
|
||||
"--allow-read",
|
||||
"--allow-net",
|
||||
"tools/web-ux/browser-tests/workspace_home_fixture_server.ts",
|
||||
"15414",
|
||||
"web/workspace/build"
|
||||
],
|
||||
"readyUrl": "http://127.0.0.1:15414/health"
|
||||
},
|
||||
{
|
||||
"id": "entry-fixture",
|
||||
"command": "deno",
|
||||
"cwd": "../../..",
|
||||
"args": [
|
||||
"run",
|
||||
"--config",
|
||||
"tools/web-ux/deno.json",
|
||||
"--allow-read",
|
||||
"--allow-net",
|
||||
"web/workspace/test/auth-browser/fixture-server.ts",
|
||||
"15413",
|
||||
"web/workspace/build",
|
||||
"http://127.0.0.1:15414"
|
||||
],
|
||||
"readyUrl": "http://127.0.0.1:15413/health"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,372 @@
|
||||
{
|
||||
"schemaVersion": 1,
|
||||
"id": "public-entry-light",
|
||||
"title": "Public entry and authenticated Workspace selection",
|
||||
"baseUrl": "http://127.0.0.1:15413",
|
||||
"colorScheme": "light",
|
||||
"reducedMotion": "reduce",
|
||||
"personas": [
|
||||
{
|
||||
"id": "fixture",
|
||||
"label": "Synthetic HTTP projection; not a real authentication session",
|
||||
"auth": {
|
||||
"kind": "anonymous"
|
||||
}
|
||||
}
|
||||
],
|
||||
"viewports": [
|
||||
{
|
||||
"label": "desktop",
|
||||
"width": 1440,
|
||||
"height": 900
|
||||
},
|
||||
{
|
||||
"label": "narrow",
|
||||
"width": 768,
|
||||
"height": 900
|
||||
},
|
||||
{
|
||||
"label": "mobile",
|
||||
"width": 390,
|
||||
"height": 900
|
||||
}
|
||||
],
|
||||
"routes": [
|
||||
{
|
||||
"id": "anonymous",
|
||||
"label": "anonymous",
|
||||
"path": "/?fixture=anonymous",
|
||||
"goal": "Verify entry, session and Workspace authority remain distinct with reachable actions",
|
||||
"dataState": "Known anonymous; policy allowed; Workspace API would reject",
|
||||
"ready": {
|
||||
"kind": "selector",
|
||||
"selector": "a.entry-primary"
|
||||
},
|
||||
"capturePoints": [
|
||||
{
|
||||
"id": "initial",
|
||||
"label": "Initial state",
|
||||
"fullPage": true
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "policy-disabled",
|
||||
"label": "policy-disabled",
|
||||
"path": "/?fixture=policy-disabled",
|
||||
"goal": "Verify entry, session and Workspace authority remain distinct with reachable actions",
|
||||
"dataState": "Policy disabled; login retained",
|
||||
"ready": {
|
||||
"kind": "selector",
|
||||
"selector": "section p:has-text(\"registration is disabled\")"
|
||||
},
|
||||
"capturePoints": [
|
||||
{
|
||||
"id": "initial",
|
||||
"label": "Initial state",
|
||||
"fullPage": true
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "policy-error",
|
||||
"label": "policy-error",
|
||||
"path": "/?fixture=policy-error",
|
||||
"goal": "Verify entry, session and Workspace authority remain distinct with reachable actions",
|
||||
"dataState": "Intentional public policy HTTP503; login retained, no registration link",
|
||||
"ready": {
|
||||
"kind": "selector",
|
||||
"selector": "section p:has-text(\"availability is unknown\")"
|
||||
},
|
||||
"capturePoints": [
|
||||
{
|
||||
"id": "initial",
|
||||
"label": "Initial state",
|
||||
"fullPage": true
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "policy-loading",
|
||||
"label": "policy-loading",
|
||||
"path": "/?fixture=policy-loading",
|
||||
"goal": "Verify entry, session and Workspace authority remain distinct with reachable actions",
|
||||
"dataState": "Public policy held pending; login retained",
|
||||
"ready": {
|
||||
"kind": "selector",
|
||||
"selector": "[role=status]:has-text(\"Checking registration\")"
|
||||
},
|
||||
"capturePoints": [
|
||||
{
|
||||
"id": "initial",
|
||||
"label": "Initial state",
|
||||
"fullPage": true
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "session-loading",
|
||||
"label": "session-loading",
|
||||
"path": "/?fixture=session-loading",
|
||||
"goal": "Verify entry, session and Workspace authority remain distinct with reachable actions",
|
||||
"dataState": "Whoami held pending; no anonymous or actor actions",
|
||||
"ready": {
|
||||
"kind": "selector",
|
||||
"selector": "[role=status]:has-text(\"Loading session\")"
|
||||
},
|
||||
"capturePoints": [
|
||||
{
|
||||
"id": "initial",
|
||||
"label": "Initial state",
|
||||
"fullPage": true
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "session-error",
|
||||
"label": "session-error",
|
||||
"path": "/?fixture=session-error",
|
||||
"goal": "Verify entry, session and Workspace authority remain distinct with reachable actions",
|
||||
"dataState": "Intentional whoami HTTP503; unknown, not logged out",
|
||||
"ready": {
|
||||
"kind": "selector",
|
||||
"selector": "[role=alert]"
|
||||
},
|
||||
"capturePoints": [
|
||||
{
|
||||
"id": "initial",
|
||||
"label": "Initial state",
|
||||
"fullPage": true
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "account",
|
||||
"label": "account",
|
||||
"path": "/?fixture=account",
|
||||
"goal": "Verify entry, session and Workspace authority remain distinct with reachable actions",
|
||||
"dataState": "Confirmed ordinary actor; no Workspace fetch or automatic navigation",
|
||||
"ready": {
|
||||
"kind": "selector",
|
||||
"selector": "a.entry-primary"
|
||||
},
|
||||
"capturePoints": [
|
||||
{
|
||||
"id": "initial",
|
||||
"label": "Initial state",
|
||||
"fullPage": true
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "admin",
|
||||
"label": "admin",
|
||||
"path": "/?fixture=admin",
|
||||
"goal": "Verify entry, session and Workspace authority remain distinct with reachable actions",
|
||||
"dataState": "Confirmed hosting admin grant independent of Workspace ownership",
|
||||
"ready": {
|
||||
"kind": "selector",
|
||||
"selector": "a[href=\"/hosting/settings\"]"
|
||||
},
|
||||
"capturePoints": [
|
||||
{
|
||||
"id": "initial",
|
||||
"label": "Initial state",
|
||||
"fullPage": true
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "dashboard-zero",
|
||||
"label": "dashboard-zero",
|
||||
"path": "/dashboard?fixture=account",
|
||||
"goal": "Verify entry, session and Workspace authority remain distinct with reachable actions",
|
||||
"dataState": "Confirmed actor; zero Workspaces",
|
||||
"ready": {
|
||||
"kind": "selector",
|
||||
"selector": ".workspace-empty-state"
|
||||
},
|
||||
"capturePoints": [
|
||||
{
|
||||
"id": "initial",
|
||||
"label": "Initial state",
|
||||
"fullPage": true
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "dashboard-one",
|
||||
"label": "dashboard-one",
|
||||
"path": "/dashboard?fixture=workspace-one",
|
||||
"goal": "Verify entry, session and Workspace authority remain distinct with reachable actions",
|
||||
"dataState": "One Workspace requires explicit selection",
|
||||
"ready": {
|
||||
"kind": "selector",
|
||||
"selector": ".workspace-catalog-card"
|
||||
},
|
||||
"capturePoints": [
|
||||
{
|
||||
"id": "initial",
|
||||
"label": "Initial state",
|
||||
"fullPage": true
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "dashboard-many",
|
||||
"label": "dashboard-many",
|
||||
"path": "/dashboard?fixture=workspace-many",
|
||||
"goal": "Verify entry, session and Workspace authority remain distinct with reachable actions",
|
||||
"dataState": "Three Workspaces, long display name, explicit selection",
|
||||
"ready": {
|
||||
"kind": "selector",
|
||||
"selector": ".workspace-catalog-card:nth-child(3)"
|
||||
},
|
||||
"capturePoints": [
|
||||
{
|
||||
"id": "initial",
|
||||
"label": "Initial state",
|
||||
"fullPage": true
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "dashboard-error",
|
||||
"label": "dashboard-error",
|
||||
"path": "/dashboard?fixture=workspace-error",
|
||||
"goal": "Verify entry, session and Workspace authority remain distinct with reachable actions",
|
||||
"dataState": "Intentional catalog HTTP503; not empty; account retained",
|
||||
"ready": {
|
||||
"kind": "selector",
|
||||
"selector": ".workspace-catalog-alert"
|
||||
},
|
||||
"capturePoints": [
|
||||
{
|
||||
"id": "initial",
|
||||
"label": "Initial state",
|
||||
"fullPage": true
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "dashboard-loading",
|
||||
"label": "dashboard-loading",
|
||||
"path": "/dashboard?fixture=workspace-loading",
|
||||
"goal": "Verify entry, session and Workspace authority remain distinct with reachable actions",
|
||||
"dataState": "Catalog held pending; account remains available",
|
||||
"ready": {
|
||||
"kind": "selector",
|
||||
"selector": "[role=status]:has-text(\"Loading Workspaces\")"
|
||||
},
|
||||
"capturePoints": [
|
||||
{
|
||||
"id": "initial",
|
||||
"label": "Initial state",
|
||||
"fullPage": true
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "dashboard-anonymous",
|
||||
"label": "dashboard-anonymous",
|
||||
"path": "/dashboard?fixture=anonymous",
|
||||
"goal": "Verify entry, session and Workspace authority remain distinct with reachable actions",
|
||||
"dataState": "Known anonymous; login returnTo dashboard, no catalog fetch",
|
||||
"ready": {
|
||||
"kind": "selector",
|
||||
"selector": "a.entry-primary"
|
||||
},
|
||||
"capturePoints": [
|
||||
{
|
||||
"id": "initial",
|
||||
"label": "Initial state",
|
||||
"fullPage": true
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "create-denied",
|
||||
"label": "create-denied",
|
||||
"path": "/dashboard?fixture=creation-denied#workspace-create-title",
|
||||
"goal": "Verify entry, session and Workspace authority remain distinct with reachable actions",
|
||||
"dataState": "Intentional creation HTTP403; exact retry, no resources created",
|
||||
"ready": {
|
||||
"kind": "selector",
|
||||
"selector": ".workspace-empty-state"
|
||||
},
|
||||
"capturePoints": [
|
||||
{
|
||||
"id": "initial",
|
||||
"label": "Creation denied",
|
||||
"fullPage": true,
|
||||
"interaction": [
|
||||
{
|
||||
"action": "fill",
|
||||
"selector": "input[autocomplete=off]",
|
||||
"value": "New Workspace"
|
||||
},
|
||||
{
|
||||
"action": "click",
|
||||
"selector": "button[type=submit]"
|
||||
}
|
||||
],
|
||||
"ready": {
|
||||
"kind": "selector",
|
||||
"selector": ".workspace-catalog-alert"
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "login-disabled",
|
||||
"label": "login-disabled",
|
||||
"path": "/login?fixture=policy-disabled",
|
||||
"goal": "Verify entry, session and Workspace authority remain distinct with reachable actions",
|
||||
"dataState": "Login remains usable while registration is disabled",
|
||||
"ready": {
|
||||
"kind": "selector",
|
||||
"selector": "nav p:has-text(\"registration is disabled\")"
|
||||
},
|
||||
"capturePoints": [
|
||||
{
|
||||
"id": "initial",
|
||||
"label": "Initial state",
|
||||
"fullPage": true
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"processes": [
|
||||
{
|
||||
"id": "workspace-fixture",
|
||||
"command": "deno",
|
||||
"cwd": "../../..",
|
||||
"args": [
|
||||
"run",
|
||||
"--allow-read",
|
||||
"--allow-net",
|
||||
"tools/web-ux/browser-tests/workspace_home_fixture_server.ts",
|
||||
"15414",
|
||||
"web/workspace/build"
|
||||
],
|
||||
"readyUrl": "http://127.0.0.1:15414/health"
|
||||
},
|
||||
{
|
||||
"id": "entry-fixture",
|
||||
"command": "deno",
|
||||
"cwd": "../../..",
|
||||
"args": [
|
||||
"run",
|
||||
"--config",
|
||||
"tools/web-ux/deno.json",
|
||||
"--allow-read",
|
||||
"--allow-net",
|
||||
"web/workspace/test/auth-browser/fixture-server.ts",
|
||||
"15413",
|
||||
"web/workspace/build",
|
||||
"http://127.0.0.1:15414"
|
||||
],
|
||||
"readyUrl": "http://127.0.0.1:15413/health"
|
||||
}
|
||||
]
|
||||
}
|
||||
Reference in New Issue
Block a user