Skip to content

test(55): live UAT automation + wire fixtures (B2+B4)#52

Merged
ChrisPelatari merged 4 commits into
developfrom
claude/55-live-uat
Jun 12, 2026
Merged

test(55): live UAT automation + wire fixtures (B2+B4)#52
ChrisPelatari merged 4 commits into
developfrom
claude/55-live-uat

Conversation

@ChrisPelatari

Copy link
Copy Markdown
Member

Summary

  • B2 — Live wire fixtures: captures real Fizzy API responses as .json fixtures; one decode test verifies verbatim wire shape end-to-end
  • B4 — UAT Item 4 (golden-flag pull): syncFirst replaceLocal propagates isGolden == true from remote to local Core Data; sacrificial [itest] card created and cleaned up via defer
  • B4 — UAT Item 6 (401 recovery): garbage-token sync throws FizzyError.unauthorized and FizzyAuthState is cleared post-throw; read-only (no mutation gate)
  • B4 — UAT Item 7 (re-pair merge, zero remote creates): sign-out → re-pair → mergeIfNoConflicts creates zero remote cards; all [itest] cards cleaned up; [itest] prefix enforces read-only guarantee on the 32 genuine Sandbox-2 cards
  • In-memory auth fix for clone sims: FizzyAuthState(useKeychain: false) bypasses Keychain (unavailable on xcodebuild clone sims); production default unchanged (useKeychain: true)
  • Keychain accessibility: kSecAttrAccessibleAfterFirstUnlock added so items survive the simulated-lock state on test-runner clones
  • Mutation gate at @Test level: suites appear as skipped (not missing) on no-creds runs; .enabled(if: allowsMutation) moved from @Suite to @Test
  • column.board predicate fix: UAT7 re-pair verify used board == %@Card has no direct board relationship; fixed to column.board == %@
  • #require(authState.isConfigured) pre-flight guard in Items 4, 6, 7 to catch silent Keychain write failure early

Test plan

  • Live smoke (LiveSmokeTests) PASSED with real token — GET /my/identity returned account slug
  • Live UAT with creds + mutation=1: LiveUAT401RecoveryTests, LiveUATPullGoldenTests, LiveUATRePairMergeTests — all 3 suites PASSED (2026-06-12)
  • No-creds run of same suites — all 3 suites SKIP cleanly (0.000s each)
  • macOS build: BUILD SUCCEEDED (zero errors, one pre-existing warning in StepRepository.swift)
  • iOS unit suite: build succeeds; pre-existing Keychain-on-clone-sim flakes confirmed unchanged vs baseline (same test names fail identically before/after our changes)
  • [itest] card cleanup verified — defer blocks fire on both success and failure; Sandbox-2 board still has exactly 32 genuine cards post-run

Mission: #28 · Status log: #55 · Closes Phase 5 UAT ledger items 4–7

🤖 Generated with Claude Code

ChrisPelatari and others added 4 commits June 12, 2026 06:15
- playground_columns.json: GET /1/boards/<playground>/columns (3 cols)
- playground_column_cards.json: GET .../columns/<ready>/cards merged
  both pages into a single 32-element array (verbatim wire bytes)
- playground_card_detail.json: GET /1/cards/100 (single-card shape
  with column, steps, closed, assignees present)
- FizzyDTOTests: playgroundColumnCards — RED-first decode test;
  asserts 32 FizzyCards, each carrying a non-empty column.id (GREEN
  after make generate embeds the fixtures in the test bundle)
- Fixtures/fizzy/README.md: "Live captures (2026-06-12)" section

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
LiveUATTests.swift — three new suites in
  FenixKanbanTests/Services/Fizzy/Live/:

• LiveUAT401RecoveryTests (Item 6, isConfigured-only):
  garbage-token sync throws .unauthorized; authState cleared
  PASS on live server 2026-06-12

• LiveUATPullGoldenTests (Item 4, mutation-gated):
  POST [itest] card → triage → markCardGolden → replaceLocal sync
  → assert isGolden==true locally; defer-DELETE cleanup
  PASS on live server 2026-06-12

• LiveUATRePairMergeTests (Item 7, mutation-gated):
  replaceLocal → mapping.clear() (mirrors changePairing) →
  re-pair → mergeIfNoConflicts → assert zero remote cards
  created, zero local duplicates
  Suite written 2026-06-12 (sim timeout issues under investigation)

.planning/HANDOFF.md: UAT ledger updated — 4/5/6/7 now automated

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- FizzyAuthState: add useKeychain:false in-memory mode for clone-sim tests;
  production Keychain path unchanged (default useKeychain:true)
- AuthenticationService/KeychainHelper: add kSecAttrAccessibleAfterFirstUnlock
  so items survive the simulated-lock state on test-runner clones
- LiveUATTests: three suites (401 recovery, golden-flag pull, re-pair merge)
  all PASS against live Fizzy server with real token + mutation=1
- Push mutation gate to @test level (.enabled(if:)) so suites appear in
  no-creds runs as skipped, not missing
- Fix column.board predicate crash in UAT7 re-pair merge verify
- Add #require(authState.isConfigured) pre-flight guard in Items 4/6/7

Live run evidence (2026-06-12): 3/3 suites passed, [itest] cards cleaned up.
No-creds run: all 3 suites skip cleanly (0.000s each).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
# Conflicts:
#	FenixKanban.xcodeproj/project.pbxproj
@ChrisPelatari ChrisPelatari merged commit a0d7b2d into develop Jun 12, 2026
1 check passed
@ChrisPelatari ChrisPelatari deleted the claude/55-live-uat branch June 12, 2026 16:57
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.

1 participant