Skip to content

Commit da07542

Browse files
authored
fix(tests): Update loader integration tests to avoid flakes. (#8601)
Playwright's event listeners and `page.goto` functions can occasionally end up in race condition, even when they are invoked in the correct order. The workaround is to invoke them in `Promise.all`, unless there's a specific need to separate them.
1 parent 67c3b6a commit da07542

File tree

13 files changed

+58
-61
lines changed

13 files changed

+58
-61
lines changed
Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,13 @@
11
import { expect } from '@playwright/test';
22

33
import { sentryTest } from '../../../../utils/fixtures';
4-
import { envelopeRequestParser, waitForErrorRequest } from '../../../../utils/helpers';
4+
import { envelopeRequestParser, waitForErrorRequestOnUrl } from '../../../../utils/helpers';
55

66
sentryTest('captureException works', async ({ getLocalTestUrl, page }) => {
7-
const req = waitForErrorRequest(page);
8-
97
const url = await getLocalTestUrl({ testDir: __dirname });
10-
await page.goto(url);
8+
const req = await waitForErrorRequestOnUrl(page, url);
119

12-
const eventData = envelopeRequestParser(await req);
10+
const eventData = envelopeRequestParser(req);
1311

1412
expect(eventData.message).toBe('Test exception');
1513
});
Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,13 @@
11
import { expect } from '@playwright/test';
22

33
import { sentryTest } from '../../../../utils/fixtures';
4-
import { envelopeRequestParser, waitForErrorRequest } from '../../../../utils/helpers';
4+
import { envelopeRequestParser, waitForErrorRequestOnUrl } from '../../../../utils/helpers';
55

66
sentryTest('error handler works with a recursive custom error handler', async ({ getLocalTestUrl, page }) => {
7-
const req = waitForErrorRequest(page);
8-
97
const url = await getLocalTestUrl({ testDir: __dirname });
10-
await page.goto(url);
8+
const req = await waitForErrorRequestOnUrl(page, url);
119

12-
const eventData = envelopeRequestParser(await req);
10+
const eventData = envelopeRequestParser(req);
1311
expect(eventData.exception?.values?.length).toBe(1);
1412
expect(eventData.exception?.values?.[0]?.value).toBe('window.doSomethingWrong is not a function');
1513
});
Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,13 @@
11
import { expect } from '@playwright/test';
22

33
import { sentryTest } from '../../../../utils/fixtures';
4-
import { envelopeRequestParser,waitForErrorRequest } from '../../../../utils/helpers';
4+
import { envelopeRequestParser, waitForErrorRequestOnUrl } from '../../../../utils/helpers';
55

66
sentryTest('error handler works', async ({ getLocalTestUrl, page }) => {
7-
const req = waitForErrorRequest(page);
8-
97
const url = await getLocalTestUrl({ testDir: __dirname });
10-
await page.goto(url);
8+
const req = await waitForErrorRequestOnUrl(page, url);
119

12-
const eventData = envelopeRequestParser(await req);
10+
const eventData = envelopeRequestParser(req);
1311
expect(eventData.exception?.values?.length).toBe(1);
1412
expect(eventData.exception?.values?.[0]?.value).toBe('window.doSomethingWrong is not a function');
1513
});

packages/browser-integration-tests/loader-suites/loader/noOnLoad/errorHandlerLater/test.ts

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,13 @@
11
import { expect } from '@playwright/test';
22

33
import { sentryTest } from '../../../../utils/fixtures';
4-
import { envelopeRequestParser,waitForErrorRequest } from '../../../../utils/helpers';
4+
import { envelopeRequestParser, waitForErrorRequestOnUrl } from '../../../../utils/helpers';
55

66
sentryTest('error handler works for later errors', async ({ getLocalTestUrl, page }) => {
7-
const req = waitForErrorRequest(page);
8-
97
const url = await getLocalTestUrl({ testDir: __dirname });
10-
await page.goto(url);
8+
const req = await waitForErrorRequestOnUrl(page, url);
119

12-
const eventData = envelopeRequestParser(await req);
10+
const eventData = envelopeRequestParser(req);
1311

1412
expect(eventData.exception?.values?.length).toBe(1);
1513
expect(eventData.exception?.values?.[0]?.value).toBe('window.doSomethingWrong is not a function');

packages/browser-integration-tests/loader-suites/loader/noOnLoad/pageloadTransaction/test.ts

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,21 @@
11
import { expect } from '@playwright/test';
22

33
import { sentryTest } from '../../../../utils/fixtures';
4-
import { envelopeRequestParser,shouldSkipTracingTest, waitForTransactionRequest } from '../../../../utils/helpers';
4+
import {
5+
envelopeRequestParser,
6+
shouldSkipTracingTest,
7+
waitForTransactionRequestOnUrl,
8+
} from '../../../../utils/helpers';
59

610
sentryTest('should create a pageload transaction', async ({ getLocalTestUrl, page }) => {
711
if (shouldSkipTracingTest()) {
812
sentryTest.skip();
913
}
1014

11-
const req = waitForTransactionRequest(page);
12-
1315
const url = await getLocalTestUrl({ testDir: __dirname });
14-
await page.goto(url);
16+
const req = await waitForTransactionRequestOnUrl(page, url);
1517

16-
const eventData = envelopeRequestParser(await req);
18+
const eventData = envelopeRequestParser(req);
1719
const timeOrigin = await page.evaluate<number>('window._testBaseTimestamp');
1820

1921
const { start_timestamp: startTimestamp } = eventData;

packages/browser-integration-tests/loader-suites/loader/noOnLoad/sdkLoadedInMeanwhile/test.ts

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import path from 'path';
44

55
import { sentryTest, TEST_HOST } from '../../../../utils/fixtures';
66
import { LOADER_CONFIGS } from '../../../../utils/generatePlugin';
7-
import { envelopeRequestParser, waitForErrorRequest } from '../../../../utils/helpers';
7+
import { envelopeRequestParser, waitForErrorRequestOnUrl } from '../../../../utils/helpers';
88

99
const bundle = process.env.PW_BUNDLE || '';
1010
const isLazy = LOADER_CONFIGS[bundle]?.lazy;
@@ -40,13 +40,10 @@ sentryTest('it does not download the SDK if the SDK was loaded in the meanwhile'
4040
return fs.existsSync(filePath) ? route.fulfill({ path: filePath }) : route.continue();
4141
});
4242

43-
const req = waitForErrorRequest(page);
44-
4543
const url = await getLocalTestUrl({ testDir: __dirname, skipRouteHandler: true });
44+
const req = await waitForErrorRequestOnUrl(page, url);
4645

47-
await page.goto(url);
48-
49-
const eventData = envelopeRequestParser(await req);
46+
const eventData = envelopeRequestParser(req);
5047

5148
await waitForFunction(() => cdnLoadedCount === 2);
5249

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,13 @@
11
import { expect } from '@playwright/test';
22

33
import { sentryTest } from '../../../../utils/fixtures';
4-
import { envelopeRequestParser, waitForErrorRequest } from '../../../../utils/helpers';
4+
import { envelopeRequestParser, waitForErrorRequestOnUrl } from '../../../../utils/helpers';
55

66
sentryTest('captureException works', async ({ getLocalTestUrl, page }) => {
7-
const req = waitForErrorRequest(page);
8-
97
const url = await getLocalTestUrl({ testDir: __dirname });
10-
await page.goto(url);
8+
const req = await waitForErrorRequestOnUrl(page, url);
119

12-
const eventData = envelopeRequestParser(await req);
10+
const eventData = envelopeRequestParser(req);
1311

1412
expect(eventData.message).toBe('Test exception');
1513
});
Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,13 @@
11
import { expect } from '@playwright/test';
22

33
import { sentryTest } from '../../../../utils/fixtures';
4-
import { envelopeRequestParser, waitForErrorRequest } from '../../../../utils/helpers';
4+
import { envelopeRequestParser, waitForErrorRequestOnUrl } from '../../../../utils/helpers';
55

66
sentryTest('captureException works inside of onLoad', async ({ getLocalTestUrl, page }) => {
7-
const req = waitForErrorRequest(page);
8-
97
const url = await getLocalTestUrl({ testDir: __dirname });
10-
await page.goto(url);
8+
const req = await waitForErrorRequestOnUrl(page, url);
119

12-
const eventData = envelopeRequestParser(await req);
10+
const eventData = envelopeRequestParser(req);
1311

1412
expect(eventData.message).toBe('Test exception');
1513
});

packages/browser-integration-tests/loader-suites/loader/onLoad/customBrowserTracing/test.ts

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,21 @@
11
import { expect } from '@playwright/test';
22

33
import { sentryTest } from '../../../../utils/fixtures';
4-
import { envelopeRequestParser, shouldSkipTracingTest, waitForTransactionRequest } from '../../../../utils/helpers';
4+
import {
5+
envelopeRequestParser,
6+
shouldSkipTracingTest,
7+
waitForTransactionRequestOnUrl,
8+
} from '../../../../utils/helpers';
59

610
sentryTest('should handle custom added BrowserTracing integration', async ({ getLocalTestUrl, page }) => {
711
if (shouldSkipTracingTest()) {
812
sentryTest.skip();
913
}
1014

11-
const req = waitForTransactionRequest(page);
12-
1315
const url = await getLocalTestUrl({ testDir: __dirname });
14-
await page.goto(url);
16+
const req = await waitForTransactionRequestOnUrl(page, url);
1517

16-
const eventData = envelopeRequestParser(await req);
18+
const eventData = envelopeRequestParser(req);
1719
const timeOrigin = await page.evaluate<number>('window._testBaseTimestamp');
1820

1921
const { start_timestamp: startTimestamp } = eventData;

packages/browser-integration-tests/loader-suites/loader/onLoad/errorHandler/test.ts

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,13 @@
11
import { expect } from '@playwright/test';
22

33
import { sentryTest } from '../../../../utils/fixtures';
4-
import { envelopeRequestParser, waitForErrorRequest } from '../../../../utils/helpers';
4+
import { envelopeRequestParser, waitForErrorRequestOnUrl } from '../../../../utils/helpers';
55

66
sentryTest('error handler works', async ({ getLocalTestUrl, page }) => {
7-
const req = waitForErrorRequest(page);
8-
97
const url = await getLocalTestUrl({ testDir: __dirname });
10-
await page.goto(url);
8+
const req = await waitForErrorRequestOnUrl(page, url);
119

12-
const eventData = envelopeRequestParser(await req);
10+
const eventData = envelopeRequestParser(req);
1311

1412
expect(eventData.exception?.values?.length).toBe(1);
1513
expect(eventData.exception?.values?.[0]?.value).toBe('window.doSomethingWrong is not a function');

packages/browser-integration-tests/loader-suites/loader/onLoad/errorHandlerLater/test.ts

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,13 @@
11
import { expect } from '@playwright/test';
22

33
import { sentryTest } from '../../../../utils/fixtures';
4-
import { envelopeRequestParser,waitForErrorRequest } from '../../../../utils/helpers';
4+
import { envelopeRequestParser, waitForErrorRequestOnUrl } from '../../../../utils/helpers';
55

66
sentryTest('error handler works for later errors', async ({ getLocalTestUrl, page }) => {
7-
const req = waitForErrorRequest(page);
8-
97
const url = await getLocalTestUrl({ testDir: __dirname });
10-
await page.goto(url);
8+
const req = await waitForErrorRequestOnUrl(page, url);
119

12-
const eventData = envelopeRequestParser(await req);
10+
const eventData = envelopeRequestParser(req);
1311

1412
expect(eventData.exception?.values?.length).toBe(1);
1513
expect(eventData.exception?.values?.[0]?.value).toBe('window.doSomethingWrong is not a function');

packages/browser-integration-tests/loader-suites/loader/onLoad/pageloadTransaction/test.ts

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,21 @@
11
import { expect } from '@playwright/test';
22

33
import { sentryTest } from '../../../../utils/fixtures';
4-
import { envelopeRequestParser,shouldSkipTracingTest, waitForTransactionRequest } from '../../../../utils/helpers';
4+
import {
5+
envelopeRequestParser,
6+
shouldSkipTracingTest,
7+
waitForTransactionRequestOnUrl,
8+
} from '../../../../utils/helpers';
59

610
sentryTest('should create a pageload transaction', async ({ getLocalTestUrl, page }) => {
711
if (shouldSkipTracingTest()) {
812
sentryTest.skip();
913
}
1014

11-
const req = waitForTransactionRequest(page);
12-
1315
const url = await getLocalTestUrl({ testDir: __dirname });
14-
await page.goto(url);
16+
const req = await waitForTransactionRequestOnUrl(page, url);
1517

16-
const eventData = envelopeRequestParser(await req);
18+
const eventData = envelopeRequestParser(req);
1719
const timeOrigin = await page.evaluate<number>('window._testBaseTimestamp');
1820

1921
const { start_timestamp: startTimestamp } = eventData;

packages/browser-integration-tests/utils/helpers.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,16 @@ async function getSentryEvents(page: Page, url?: string): Promise<Array<Event>>
108108
return eventsHandle.jsonValue();
109109
}
110110

111+
export async function waitForErrorRequestOnUrl(page: Page, url: string): Promise<Request> {
112+
const [req] = await Promise.all([waitForErrorRequest(page), page.goto(url)]);
113+
return req;
114+
}
115+
116+
export async function waitForTransactionRequestOnUrl(page: Page, url: string): Promise<Request> {
117+
const [req] = await Promise.all([waitForTransactionRequest(page), page.goto(url)]);
118+
return req;
119+
}
120+
111121
export function waitForErrorRequest(page: Page): Promise<Request> {
112122
return page.waitForRequest(req => {
113123
const postData = req.postData();

0 commit comments

Comments
 (0)