|
| 1 | +import { expect, test } from '@playwright/test'; |
| 2 | +import { getSpanOp, waitForStreamedSpan } from '@sentry-internal/test-utils'; |
| 3 | + |
| 4 | +test.skip(!process.env.E2E_TEST_TUNNEL, 'Only runs in the tunnel variant'); |
| 5 | + |
| 6 | +const TUNNEL_PATH = /^\/app\/[a-z0-9]{1,7}$/; |
| 7 | + |
| 8 | +test('serves the managed tunnel from the Worker under the base path', async ({ page }) => { |
| 9 | + const pageloadSpanPromise = waitForStreamedSpan( |
| 10 | + 'sveltekit-3-cloudflare-workers', |
| 11 | + span => getSpanOp(span) === 'pageload' && span.is_segment, |
| 12 | + ); |
| 13 | + const tunnelServerSpanPromise = waitForStreamedSpan( |
| 14 | + 'sveltekit-3-cloudflare-workers', |
| 15 | + span => getSpanOp(span) === 'http.server' && TUNNEL_PATH.test(String(span.attributes['url.path']?.value ?? '')), |
| 16 | + ); |
| 17 | + const tunnelResponsePromise = page.waitForResponse( |
| 18 | + response => response.request().method() === 'POST' && TUNNEL_PATH.test(new URL(response.url()).pathname), |
| 19 | + ); |
| 20 | + |
| 21 | + await page.goto('/app/'); |
| 22 | + const tunnelResponse = await tunnelResponsePromise; |
| 23 | + |
| 24 | + expect(tunnelResponse.status()).toBe(200); |
| 25 | + expect(new URL(tunnelResponse.url()).origin).toBe(new URL(page.url()).origin); |
| 26 | + await expect(pageloadSpanPromise).resolves.toBeDefined(); |
| 27 | + |
| 28 | + // Anchor on a regular server span requested after the tunnel traffic: spans flush in order, so a tunnel span |
| 29 | + // would arrive first. |
| 30 | + const anchorSpanPromise = waitForStreamedSpan( |
| 31 | + 'sveltekit-3-cloudflare-workers', |
| 32 | + span => |
| 33 | + getSpanOp(span) === 'http.server' && |
| 34 | + String(span.attributes['url.path']?.value ?? '').startsWith('/app/server-load-error'), |
| 35 | + ); |
| 36 | + await page.request.get('/app/server-load-error'); |
| 37 | + |
| 38 | + const winner = await Promise.race([ |
| 39 | + tunnelServerSpanPromise.then(() => 'tunnel' as const), |
| 40 | + anchorSpanPromise.then(() => 'anchor' as const), |
| 41 | + ]); |
| 42 | + expect(winner).toBe('anchor'); |
| 43 | +}); |
0 commit comments