Gunnar

nordisk/gunnar-ui

uitest/Cargo.toml

# gunnar's **UI test**: a detached crate with its own `[workspace]`, the console's
# counterpart to gunnar's `sitetest/` and for the same reasons recorded there — a
# workspace member's dev-dependencies would ride into `cargo test --workspace`,
# and this one spawns a browser.
#
# ## What it is
#
# One re-runnable FUNCTIONAL walk of a LIVE console: every situation is a row,
# and every row is asserted against the SERVER's own state rather than against
# the page's own claim. A repository pushed over SSH must appear in the console;
# a revoked invite must stop working; the admin token must STOP being accepted
# the moment an admin passkey exists.
#
# ## Two layers, deliberately split
#
# The BULK is plain HTTP with `GUNNAR_UI_ADMIN_TOKEN` and no browser at all —
# repos, refs, log, browse, invites, quota, storage. It is fast, it is stable,
# and it covers most of the surface.
#
# The THIN slice is a headless Chrome driven over the DevTools Protocol with a
# **virtual authenticator** (`WebAuthn.addVirtualAuthenticator`), which is the
# only way to exercise register → login → step-up → revoke without a human and a
# YubiKey. It is deliberately separable: delete `cdp.rs` and the API matrix still
# runs, so the browser can never become the thing the suite depends on.
#
# ## Zero dependencies, on purpose
#
# CDP is JSON over one websocket; a client masks its frames and a reader does not
# have to verify `Sec-WebSocket-Accept` for the connection to be correct. That is
# `ws.rs` (about 150 lines) and `json.rs` (about 200). Both are smaller than the
# argument for adding tokio, serde and tungstenite to a test that must build in
# seconds on an appliance with no crates.io.
[package]
name = "gunnar-uitest"
version = "0.0.0"
edition = "2021"
publish = false

[workspace]

[dependencies]

[[bin]]
name = "gunnar-uitest"
path = "src/main.rs"