34 lines
2.1 KiB
Markdown
34 lines
2.1 KiB
Markdown
# testing-e2e: async-span + apiContext fixture hardening
|
|
|
|
**Package**: `@suaveplan/testing-e2e`
|
|
**Status**: PROPOSED
|
|
**Type**: bug-fix
|
|
|
|
## Why
|
|
|
|
Two latent defects:
|
|
|
|
1. **`extendedTest.apiContext` requests a browser it never uses.** `src/fixtures/extended-test.ts` destructures `{ browser: _browser }` from Playwright's fixture deps. Playwright's fixture system spins up the requested deps eagerly; declaring `browser` triggers a Chromium launch even for API-only test files. API-only suites pay hundreds of ms per worker for nothing.
|
|
2. **`instrumented()` ends spans synchronously even for async fns.** Same defect as in `@suaveplan/testing-dom`. Every histogram emitted by an async-wrapped helper records ~0 ms.
|
|
|
|
## What changes
|
|
|
|
- MODIFIED: `src/fixtures/extended-test.ts#apiContext` — changes the destructure from `{ browser: _browser }` to `{}` so Playwright doesn't materialise a browser for API-only tests.
|
|
- MODIFIED: `src/observability/instrumented.ts` — detects PromiseLike return values and ends the OTel span (and records the histogram) only after the promise settles.
|
|
- MODIFIED: `openspec/specs/testing-e2e/spec.md` — coverage gate raised from ≥95% to 100% to match `CLAUDE.md`'s pre-publish gate. Path reference updated from `packages/universal/testing-e2e/` to `packages/dev/testing-e2e/`.
|
|
|
|
## Out of scope
|
|
|
|
- Refactoring `instrumented()` away from `tracer.startActiveSpan` — keeping the same OTel surface, only fixing span lifetime.
|
|
- Adding new fixtures to `extendedTest`.
|
|
|
|
## Verification approach
|
|
|
|
- `src/fixtures/extended-test.test.ts` — source-level guard that the apiContext fixture body destructures an empty object, NOT one containing `browser`.
|
|
- `src/observability/instrumented.test.ts::"ends span only after async fn settles (resolved)"` — observable timing assertion (`elapsed >= 10ms`).
|
|
- `src/observability/instrumented.test.ts::"ends span only after async fn settles (rejected)"` and `"… (rejected with non-Error)"` — pin the rejection branch including `recordException` for non-Error throws.
|
|
|
|
## Migration impact
|
|
|
|
None — bug-fix-only behavioural change. Consumers' existing tests continue to pass.
|