mirror of
https://github.com/shankar0123/certctl.git
synced 2026-06-07 13:41:30 +00:00
0987e222dd
CI failure on Phase 3 commit (e761ae40):
FAIL src/pages/auth/UsersPage.test.tsx > 8 tests (all)
Error: useLocation() may be used only in the context of a <Router> component.
Root cause:
Phase 3 wired <Breadcrumbs /> into PageHeader (UX-M5 closure). UsersPage
renders PageHeader at the top of its tree. UsersPage.test.tsx was the
only auth-page test file whose renderWithProviders helper lacked a
MemoryRouter wrapper — every other sibling (BreakglassPage, KeysPage,
OIDCProvidersPage, SessionsPage, RolesPage, AuthSettingsPage,
ApprovalsPage, etc.) already wraps in MemoryRouter. The 2026-05-11
MED-11 closure that shipped UsersPage + 8 tests predated Phase 3 and so
predated the need for Router context in test trees.
Fix is two-layered:
(1) Targeted — add MemoryRouter to UsersPage.test.tsx renderWithProviders
so the test tree has the same Router context the production tree gets
from <BrowserRouter> in main.tsx.
(2) Defensive — Breadcrumbs.tsx now gates useLocation() behind
useInRouterContext(). If a future test mounts PageHeader (or any
other Breadcrumbs consumer) without a Router wrapper, the component
renders null instead of crashing. The actual useLocation() + render
work moves into a BreadcrumbsInner sub-component called only after
the Router-context check passes. This prevents the same class of
failure ever happening again — any new auth-page test author who
forgets MemoryRouter will see a missing breadcrumb (cosmetic),
not 8 red test failures.
Verification (sandbox):
• TypeScript clean — npx tsc --noEmit exits 0
• UsersPage suite — 8/8 green (was 0/8 in CI)
• Breadcrumbs suite — 8/8 green
• All sibling auth tests — 72/72 green (BreakglassPage 6 + KeysPage 7
+ OIDCProvidersPage 13 + SessionsPage 11 + RolesPage 6 +
AuthSettingsPage 6 + ApprovalsPage 23). Unchanged because they
already had MemoryRouter; pinned to confirm defensive guard didn't
regress them.
CI expectation: web-test job goes from red to green on next push.
No behavior change to production — Breadcrumbs still renders identically
under <BrowserRouter> at runtime; useInRouterContext returns true and
delegates to BreadcrumbsInner unchanged.
Touches:
web/src/components/Breadcrumbs.tsx (+14 / -2)
web/src/pages/auth/UsersPage.test.tsx (+8 / -1)