test(e2e): Add a static trace lifecycle React Router E2E app - #23840
test(e2e): Add a static trace lifecycle React Router E2E app#23840andreiborza wants to merge 2 commits into
Conversation
| Sentry.startSpan({ name: 'authMiddleware', op: 'middleware.auth' }, async () => { | ||
| const user: User = await getUser(); | ||
| context.set(userContext, user); | ||
| await next(); | ||
| }); |
There was a problem hiding this comment.
Bug: The authMiddleware function doesn't await the Sentry.startSpan call, causing a race condition where the user context is not set before the loader runs.
Severity: CRITICAL
Suggested Fix
The Promise returned by Sentry.startSpan must be awaited to ensure the user context is set before the middleware chain continues. Modify the middleware to return Sentry.startSpan(...) so that the framework correctly awaits the entire asynchronous operation, including the next() call within the span.
Prompt for AI Agent
Review the code at the location below. A potential bug has been identified by an AI
agent. Verify if this is a real issue. If it is, propose a fix; if not, explain why it's
not valid.
Location:
dev-packages/e2e-tests/test-applications/react-router-7-framework-static/app/routes/performance/with-middleware.tsx#L15-L19
Potential issue: In `authMiddleware`, the call to `Sentry.startSpan` is not awaited. The
callback passed to `startSpan` is asynchronous and contains the logic to set the user
context with `context.set(userContext, user)` and proceed to the next middleware with
`await next()`. Because the `startSpan` call is not awaited, the middleware function
returns and resolves before the user context is set. This creates a race condition where
the loader executes before the context is populated, resulting in
`context.get(userContext)` returning `undefined` instead of the fetched user.
Did we get this right? 👍 / 👎 to inform future reviews.
size-limit report 📦
|
There was a problem hiding this comment.
Cursor Bugbot has reviewed your changes and found 1 potential issue.
❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.
Reviewed by Cursor Bugbot for commit 9dd059d. Configure here.
| }); | ||
|
|
||
| await page.goto('/performance'); | ||
| await page.waitForTimeout(1000); |
There was a problem hiding this comment.
Sleep wait can flake filter test
Low Severity
This test sleeps with waitForTimeout after goto instead of waiting on a concrete signal such as the pageload transaction. That matches the testing-conventions flake pattern (timeouts or sleeps in tests) from the review rules, and the delay can expire before the page is ready to navigate.
Triggered by project rule: PR Review Guidelines for Cursor Bot
Reviewed by Cursor Bugbot for commit 9dd059d. Configure here.
Copies `react-router-7-framework` into `react-router-7-framework-static`, which keeps `traceLifecycle: 'static'` and its transaction-based specs. The rest of the React Router group moves to span streaming in the PRs above, so this copy is what keeps the static lifecycle covered. Also re-exports `SerializedStreamedSpan` from `@sentry-internal/test-utils`, which the ported specs need to type their span helpers. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Spans are buffered per trace before they flush, so an earlier page load's spans can still be arriving when a test starts collecting. This resolves with only the spans sharing the matched segment's trace, so tests asserting on one request's children cannot pick up leftovers.
9dd059d to
e4cc238
Compare


What
Adds
react-router-7-framework-static, a copy ofreact-router-7-frameworkthat keepstraceLifecycle: 'static'and its transaction-based specs. Also re-exportsSerializedStreamedSpanfrom@sentry-internal/test-utils.Why
The rest of the React Router E2E group moves to span streaming in the PRs above this one, so this copy is what keeps the static trace lifecycle covered. The copy drops the
latestbuild variant so it costs one CI job rather than two.Part of #23798