Skip to content

feat(pi-board): keyboard-accessible card moves + integration tests - #3

Merged
nicpozent merged 1 commit into
mainfrom
claude/code-examination-qx719b
Jul 12, 2026
Merged

feat(pi-board): keyboard-accessible card moves + integration tests#3
nicpozent merged 1 commit into
mainfrom
claude/code-examination-qx719b

Conversation

@nicpozent

Copy link
Copy Markdown
Owner

Follow-ups to #1/#2 — closes two more items from the gap analysis.

♿ Accessibility — keyboard-accessible card moves

The board's only way to move a card between iterations was drag-and-drop, which is mouse-only and fails the ADR-0025 accessibility baseline.

  • Each card now has a native <select> (keyboard-operable, screen-reader labelled Move "<title>" to iteration) to move it to any iteration or back to Unscheduled.
  • Mouse users can still drag; both paths call the same placement mutation, so behaviour and the live server broadcast are identical.

🧪 Integration tests — server/Atlas.Tests/PiBoardAndSettingsTests.cs

The endpoints added in #1/#2 had no automated coverage. New tests (on the existing AtlasApiFactory in-memory host):

  • Settings redactionGET /settings omits secret-valued keys (teams.webhookUrl) but still returns non-secret toggles. Regression guard for the fix(security): redact setting secrets + make the PI board live server-side #2 leak fix.
  • Board placement roundtrip — place → appears in the map; clear (null) → drops out; an objective from another increment → 400 (not 500).
  • Teams status masking — status returns only the masked host and the raw webhook URL's path/token never appear in the response.

Verification

  • Frontend build + eslint + 72 tests pass locally.
  • The new .NET tests are compiled and executed by the API (build · test) CI job (no SDK in the authoring env — CI is the gate).

Scope notes

🤖 Generated with Claude Code

https://claude.ai/code/session_01F1g44VLAeYdf3FAoXsXRu7


Generated by Claude Code

Addresses two of the remaining follow-ups from #1/#2.

Accessibility (ADR-0025 baseline)
- The board's only way to move a card between iterations was drag-and-drop
  (mouse-only). Add a native <select> on each card — fully keyboard-operable and
  screen-reader labelled — to move it to any iteration (or Unscheduled). Mouse
  users can still drag; both paths call the same placement mutation.

Integration tests (new server/Atlas.Tests/PiBoardAndSettingsTests.cs)
- GET /settings redacts secret-valued keys (teams.webhookUrl) while still
  returning non-secret toggles — regression guard for the #2 leak fix.
- PI board placement roundtrip: place → appears in the map; clear (null) →
  drops out; cross-increment objective → 400 (not 500).
- Teams status returns only the masked host, never the raw webhook (asserts the
  secret path/token never appear in the response).

Frontend build, lint and the 72-test suite pass. The .NET tests are compiled
and run by the API (build · test) CI job (no SDK in the authoring env).

Note: item #2 from the gap list (broadcast from Jira/ADO sync) is N/A — those
services write project tasks/sprints, not PI objectives/dependencies/iterations,
so they don't change board state. The IterationId migration still needs a
dotnet-ef environment.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01F1g44VLAeYdf3FAoXsXRu7
@nicpozent
nicpozent merged commit 1ac36ab into main Jul 12, 2026
6 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants