Files
clide/docs/testing/README.md
T
jpmschweitzerandClaude Opus 4.8 62f9975b06 docs: correct stale architecture references
Found by a docs/ staleness audit:
- architecture.md: Claude no longer runs under tmux — it's driven over
  the stream-json control protocol with --resume (D-75/D-77/D-78); and
  the IPC socket server is implemented, not "currently unimplemented".
- testing/README.md + claude-ui-workflow.md: drop the dissolved app/
  two-package paths (D-56) — tests live at test/ and the web build at
  build/web/.
- design/multitab-pane.md: the Claude pane spawns a stream-json session,
  not a tmux one; ClaudeSessionRef carries the session id.

Frozen historical snapshots (initial-plan.md, the HISTORICAL pty docs,
dated spikes/audits) left as-is.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-10 17:39:31 +02:00

2.6 KiB

Testing clide

Every layer of the test pyramid is wired. The suite is intentionally designed to run client-side only — git clone && make push-check works on any Linux or macOS dev box without network access or shared state.

Layers

layer location runner time when
unit (Flutter-free core) test/ipc/, test/daemon/, test/pty/ dart test ~5s make test-core
unit + widget + golden test/ flutter test ~30s make test
a11y contract test/a11y/ flutter test ~5s make test-a11y
integration (startup gate) integration_test/ flutter test integration_test/ ~60s make test-integration
daemon E2E + web WASM smoke test/daemon/ + tools/ui/tests/ dart test + Playwright ~60s make test-e2e
startup bundle smoke ci/smoke_bundle.sh xvfb-run, 5s timeout ~30s make smoke-bundle

Dev loop

make push-check        # gate before `git push` (~90s)
make test-all          # full pyramid (~3-5min)

A11y + i18n

A11y is a day-one contract, not a Tier-6 polish. Every interactive widget emits a Semantics node with label + hint. The a11y suite enforces:

  • semantic_coverage_test.dart — every built-in declares title + version and every interactive contribution carries the fields needed to build a Semantics node.
  • contrast_test.dart — every bundled theme meets WCAG-AA on the token pairs in lib/kernel/src/theme/contrast.dart. Catches token-pair regressions (foreground-on-background, tab.active-on-bg, etc.).
  • i18n_coverage_test.dart — every i18n key referenced by Tier-0 built-ins exists in its en_US catalog. Asserts key presence directly (not "returned value == key" — that's ambiguous for keys that happen to equal their English translation).
  • keyboard_traversal_test.dart — interactive widgets are focusable and expose tap actions to a11y.

See a11y-manual.md for the 15-minute manual screen-reader checklist run at every tier cut.

Interacting with the app (Claude + humans)

Claude Code drives the Flutter WASM build through a Playwright harness — not via screenshots. Semantics are the contract. See claude-ui-workflow.md for the loop.

CI

.gitea/workflows/test.yml is ready to run but Gitea Actions is not enabled on the instance yet. When the user flips it, four jobs kick off per push: unit, integration, startup-bundle, e2e. The workflow file is GitHub-Actions compatible — copying it to .github/workflows/ is the entire migration if the repo moves to GitHub.