From ea6a9d43c283727a3d99539c1311ce8f590f513d Mon Sep 17 00:00:00 2001 From: Onur Temizkan Date: Fri, 4 Feb 2022 13:07:25 +0000 Subject: [PATCH 1/3] test(browser): Add integration tests for sessions. --- .../integration-tests/suites/sessions/init.js | 7 ++ .../suites/sessions/start-session/subject.js | 11 +++ .../sessions/start-session/template.hbs | 13 +++ .../suites/sessions/start-session/test.ts | 79 +++++++++++++++++++ .../suites/sessions/update-session/subject.js | 7 ++ .../sessions/update-session/template.hbs | 12 +++ .../suites/sessions/update-session/test.ts | 48 +++++++++++ packages/integration-tests/utils/helpers.ts | 20 ++++- 8 files changed, 196 insertions(+), 1 deletion(-) create mode 100644 packages/integration-tests/suites/sessions/init.js create mode 100644 packages/integration-tests/suites/sessions/start-session/subject.js create mode 100644 packages/integration-tests/suites/sessions/start-session/template.hbs create mode 100644 packages/integration-tests/suites/sessions/start-session/test.ts create mode 100644 packages/integration-tests/suites/sessions/update-session/subject.js create mode 100644 packages/integration-tests/suites/sessions/update-session/template.hbs create mode 100644 packages/integration-tests/suites/sessions/update-session/test.ts diff --git a/packages/integration-tests/suites/sessions/init.js b/packages/integration-tests/suites/sessions/init.js new file mode 100644 index 000000000000..d8c94f36fdd0 --- /dev/null +++ b/packages/integration-tests/suites/sessions/init.js @@ -0,0 +1,7 @@ +import * as Sentry from '@sentry/browser'; + +window.Sentry = Sentry; + +Sentry.init({ + dsn: 'https://public@dsn.ingest.sentry.io/1337', +}); diff --git a/packages/integration-tests/suites/sessions/start-session/subject.js b/packages/integration-tests/suites/sessions/start-session/subject.js new file mode 100644 index 000000000000..c34b6218287f --- /dev/null +++ b/packages/integration-tests/suites/sessions/start-session/subject.js @@ -0,0 +1,11 @@ +document.getElementById('start-session').addEventListener('click', () => { + Sentry.getCurrentHub().startSession(); +}); + +document.getElementById('start-session-with-context').addEventListener('click', () => { + Sentry.getCurrentHub().startSession({ + sid: 'test_sid', + init: false, + status: 'custom', + }); +}); diff --git a/packages/integration-tests/suites/sessions/start-session/template.hbs b/packages/integration-tests/suites/sessions/start-session/template.hbs new file mode 100644 index 000000000000..7d168f4097c1 --- /dev/null +++ b/packages/integration-tests/suites/sessions/start-session/template.hbs @@ -0,0 +1,13 @@ + + + + + + + + + + Navigate + + + diff --git a/packages/integration-tests/suites/sessions/start-session/test.ts b/packages/integration-tests/suites/sessions/start-session/test.ts new file mode 100644 index 000000000000..c74960e2f06e --- /dev/null +++ b/packages/integration-tests/suites/sessions/start-session/test.ts @@ -0,0 +1,79 @@ +import { expect, Route } from '@playwright/test'; + +import { sentryTest } from '../../../utils/fixtures'; +import { getCurrentSession } from '../../../utils/helpers'; + +sentryTest('should start a new session on pageload.', async ({ getLocalTestPath, page }) => { + const url = await getLocalTestPath({ testDir: __dirname }); + + const session = await getCurrentSession(page, url); + + expect(session).toBeDefined(); + expect(session.init).toBe(true); + expect(session.errors).toBe(0); + expect(session.status).toBe('ok'); +}); + +sentryTest('should start a new session using `startSession`.', async ({ getLocalTestPath, page }) => { + const url = await getLocalTestPath({ testDir: __dirname }); + + const pageloadSession = await getCurrentSession(page, url); + + expect(pageloadSession).toBeDefined(); + expect(pageloadSession.sid).toBeDefined(); + + await page.click('#start-session'); + const newSession = await getCurrentSession(page); + + expect(newSession.init).toBe(true); + expect(newSession.errors).toBe(0); + expect(newSession.status).toBe('ok'); + expect(pageloadSession.sid).not.toBe(newSession.sid); +}); + +sentryTest( + 'should start a new session with custom context using `startSession`.', + async ({ getLocalTestPath, page }) => { + const url = await getLocalTestPath({ testDir: __dirname }); + + const pageloadSession = await getCurrentSession(page, url); + + expect(pageloadSession).toBeDefined(); + expect(pageloadSession.sid).toBeDefined(); + + await page.click('#start-session-with-context'); + const newSession = await getCurrentSession(page); + + expect(newSession.init).toBe(false); + expect(newSession.status).toBe('custom'); + + // `sid` should not be accepted as a context argument. + expect(newSession.sid).not.toBe('test_sid'); + expect(pageloadSession.sid).not.toBe(newSession.sid); + }, +); + +sentryTest('should start a new session with navigation.', async ({ getLocalTestPath, page, browserName }) => { + // This navigation logic only works on Chromium at the moment. + // To extensively test this logic, we may need to use a web-server instead of using `file://` protocol. + if (browserName !== 'chromium') { + sentryTest.skip(); + } + + const url = await getLocalTestPath({ testDir: __dirname }); + await page.route('**/foo.html', (route: Route) => route.fulfill({ path: `${__dirname}/dist/index.html` })); + + const pageloadSession = await getCurrentSession(page, url); + + expect(pageloadSession).toBeDefined(); + expect(pageloadSession.sid).toBeDefined(); + + await page.click('#navigate'); + const newSession = await getCurrentSession(page); + + expect(newSession.init).toBe(true); + expect(newSession.errors).toBe(0); + expect(newSession.status).toBe('ok'); + expect(newSession.sid).toBeDefined(); + expect(pageloadSession.sid).not.toBe(newSession.sid); +}); diff --git a/packages/integration-tests/suites/sessions/update-session/subject.js b/packages/integration-tests/suites/sessions/update-session/subject.js new file mode 100644 index 000000000000..04575f47e1bd --- /dev/null +++ b/packages/integration-tests/suites/sessions/update-session/subject.js @@ -0,0 +1,7 @@ +document.getElementById('throw-error').addEventListener('click', () => { + throw new Error('test'); +}); + +document.getElementById('capture-exception').addEventListener('click', () => { + Sentry.captureException('test'); +}); diff --git a/packages/integration-tests/suites/sessions/update-session/template.hbs b/packages/integration-tests/suites/sessions/update-session/template.hbs new file mode 100644 index 000000000000..114ce1f75f83 --- /dev/null +++ b/packages/integration-tests/suites/sessions/update-session/template.hbs @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/packages/integration-tests/suites/sessions/update-session/test.ts b/packages/integration-tests/suites/sessions/update-session/test.ts new file mode 100644 index 000000000000..5c718e9d03ff --- /dev/null +++ b/packages/integration-tests/suites/sessions/update-session/test.ts @@ -0,0 +1,48 @@ +import { expect } from '@playwright/test'; + +import { sentryTest } from '../../../utils/fixtures'; +import { getCurrentSession } from '../../../utils/helpers'; + +sentryTest('should update session when an error is thrown.', async ({ getLocalTestPath, page }) => { + const url = await getLocalTestPath({ testDir: __dirname }); + + const pageloadSession = await getCurrentSession(page, url); + + expect(pageloadSession).toBeDefined(); + expect(pageloadSession.init).toBe(true); + expect(pageloadSession.errors).toBe(0); + expect(pageloadSession.status).toBe('ok'); + + await page.click('#throw-error'); + + const updatedSession = await getCurrentSession(page); + + expect(pageloadSession.sid).toBe(updatedSession.sid); + + expect(updatedSession).toBeDefined(); + expect(updatedSession.init).toBe(true); + expect(updatedSession.errors).toBe(1); + expect(updatedSession.status).toBe('ok'); +}); + +sentryTest('should update session when an exception is captured.', async ({ getLocalTestPath, page }) => { + const url = await getLocalTestPath({ testDir: __dirname }); + + const pageloadSession = await getCurrentSession(page, url); + + expect(pageloadSession).toBeDefined(); + expect(pageloadSession.init).toBe(true); + expect(pageloadSession.errors).toBe(0); + expect(pageloadSession.status).toBe('ok'); + + await page.click('#capture-exception'); + + const updatedSession = await getCurrentSession(page); + + expect(pageloadSession.sid).toBe(updatedSession.sid); + + expect(updatedSession).toBeDefined(); + expect(updatedSession.init).toBe(true); + expect(updatedSession.errors).toBe(1); + expect(updatedSession.status).toBe('ok'); +}); diff --git a/packages/integration-tests/utils/helpers.ts b/packages/integration-tests/utils/helpers.ts index 90365b11228d..6a6e250026f2 100644 --- a/packages/integration-tests/utils/helpers.ts +++ b/packages/integration-tests/utils/helpers.ts @@ -1,5 +1,5 @@ import { Page, Request } from '@playwright/test'; -import { Event } from '@sentry/types'; +import { Event, Session } from '@sentry/types'; const storeUrlRegex = /\.sentry\.io\/api\/\d+\/store\//; const envelopeUrlRegex = /\.sentry\.io\/api\/\d+\/envelope\//; @@ -146,6 +146,23 @@ async function getMultipleSentryTransactionRequests(page: Page, count: number, u return getMultipleRequests(page, count, envelopeUrlRegex, envelopeRequestParser, url); } +/** + * Get current Sentry session at the given URL, or the current page + * + * @param {Page} page + * @param {string} [url] + * @return {*} {Promise} + */ +async function getCurrentSession(page: Page, url?: string): Promise { + if (url) { + await page.goto(url); + } + + const session = await page.evaluateHandle('window.Sentry.getCurrentHub().getScope().getSession()'); + + return session.jsonValue(); +} + /** * Manually inject a script into the page of given URL. * This function is useful to create more complex test subjects that can't be achieved by pre-built pages. @@ -170,5 +187,6 @@ export { getSentryRequest, getSentryTransactionRequest, getSentryEvents, + getCurrentSession, injectScriptAndGetEvents, }; From d58b36aa04f36ffef4d4c5aa477cb2bcfe008e32 Mon Sep 17 00:00:00 2001 From: Onur Temizkan Date: Sun, 6 Feb 2022 20:04:06 +0000 Subject: [PATCH 2/3] Address suggestions. --- .../integration-tests/suites/sessions/init.js | 1 + .../suites/sessions/start-session/subject.js | 11 ---- .../sessions/start-session/template.hbs | 4 +- .../suites/sessions/start-session/test.ts | 54 +++---------------- .../suites/sessions/update-session/test.ts | 25 +++------ packages/integration-tests/utils/helpers.ts | 30 +++++------ 6 files changed, 26 insertions(+), 99 deletions(-) delete mode 100644 packages/integration-tests/suites/sessions/start-session/subject.js diff --git a/packages/integration-tests/suites/sessions/init.js b/packages/integration-tests/suites/sessions/init.js index d8c94f36fdd0..af2df91a7ceb 100644 --- a/packages/integration-tests/suites/sessions/init.js +++ b/packages/integration-tests/suites/sessions/init.js @@ -4,4 +4,5 @@ window.Sentry = Sentry; Sentry.init({ dsn: 'https://public@dsn.ingest.sentry.io/1337', + release: '0.1', }); diff --git a/packages/integration-tests/suites/sessions/start-session/subject.js b/packages/integration-tests/suites/sessions/start-session/subject.js deleted file mode 100644 index c34b6218287f..000000000000 --- a/packages/integration-tests/suites/sessions/start-session/subject.js +++ /dev/null @@ -1,11 +0,0 @@ -document.getElementById('start-session').addEventListener('click', () => { - Sentry.getCurrentHub().startSession(); -}); - -document.getElementById('start-session-with-context').addEventListener('click', () => { - Sentry.getCurrentHub().startSession({ - sid: 'test_sid', - init: false, - status: 'custom', - }); -}); diff --git a/packages/integration-tests/suites/sessions/start-session/template.hbs b/packages/integration-tests/suites/sessions/start-session/template.hbs index 7d168f4097c1..49ff0beab214 100644 --- a/packages/integration-tests/suites/sessions/start-session/template.hbs +++ b/packages/integration-tests/suites/sessions/start-session/template.hbs @@ -5,9 +5,7 @@ - - - Navigate + Navigate diff --git a/packages/integration-tests/suites/sessions/start-session/test.ts b/packages/integration-tests/suites/sessions/start-session/test.ts index c74960e2f06e..55a14247f148 100644 --- a/packages/integration-tests/suites/sessions/start-session/test.ts +++ b/packages/integration-tests/suites/sessions/start-session/test.ts @@ -5,7 +5,6 @@ import { getCurrentSession } from '../../../utils/helpers'; sentryTest('should start a new session on pageload.', async ({ getLocalTestPath, page }) => { const url = await getLocalTestPath({ testDir: __dirname }); - const session = await getCurrentSession(page, url); expect(session).toBeDefined(); @@ -14,66 +13,25 @@ sentryTest('should start a new session on pageload.', async ({ getLocalTestPath, expect(session.status).toBe('ok'); }); -sentryTest('should start a new session using `startSession`.', async ({ getLocalTestPath, page }) => { - const url = await getLocalTestPath({ testDir: __dirname }); - - const pageloadSession = await getCurrentSession(page, url); - - expect(pageloadSession).toBeDefined(); - expect(pageloadSession.sid).toBeDefined(); - - await page.click('#start-session'); - const newSession = await getCurrentSession(page); - - expect(newSession.init).toBe(true); - expect(newSession.errors).toBe(0); - expect(newSession.status).toBe('ok'); - expect(pageloadSession.sid).not.toBe(newSession.sid); -}); - -sentryTest( - 'should start a new session with custom context using `startSession`.', - async ({ getLocalTestPath, page }) => { - const url = await getLocalTestPath({ testDir: __dirname }); - - const pageloadSession = await getCurrentSession(page, url); - - expect(pageloadSession).toBeDefined(); - expect(pageloadSession.sid).toBeDefined(); - - await page.click('#start-session-with-context'); - const newSession = await getCurrentSession(page); - - expect(newSession.init).toBe(false); - expect(newSession.status).toBe('custom'); - - // `sid` should not be accepted as a context argument. - expect(newSession.sid).not.toBe('test_sid'); - expect(pageloadSession.sid).not.toBe(newSession.sid); - }, -); - sentryTest('should start a new session with navigation.', async ({ getLocalTestPath, page, browserName }) => { - // This navigation logic only works on Chromium at the moment. - // To extensively test this logic, we may need to use a web-server instead of using `file://` protocol. + // Navigations get CORS error on Firefox and WebKit as we're using `file://` protocol. if (browserName !== 'chromium') { sentryTest.skip(); } const url = await getLocalTestPath({ testDir: __dirname }); - await page.route('**/foo.html', (route: Route) => route.fulfill({ path: `${__dirname}/dist/index.html` })); + await page.route('**/foo', (route: Route) => route.fulfill({ path: `${__dirname}/dist/index.html` })); - const pageloadSession = await getCurrentSession(page, url); - - expect(pageloadSession).toBeDefined(); - expect(pageloadSession.sid).toBeDefined(); + const initSession = await getCurrentSession(page, url); await page.click('#navigate'); + const newSession = await getCurrentSession(page); + expect(newSession).toBeDefined(); expect(newSession.init).toBe(true); expect(newSession.errors).toBe(0); expect(newSession.status).toBe('ok'); expect(newSession.sid).toBeDefined(); - expect(pageloadSession.sid).not.toBe(newSession.sid); + expect(initSession.sid).not.toBe(newSession.sid); }); diff --git a/packages/integration-tests/suites/sessions/update-session/test.ts b/packages/integration-tests/suites/sessions/update-session/test.ts index 5c718e9d03ff..bdcf32dda1b4 100644 --- a/packages/integration-tests/suites/sessions/update-session/test.ts +++ b/packages/integration-tests/suites/sessions/update-session/test.ts @@ -5,44 +5,31 @@ import { getCurrentSession } from '../../../utils/helpers'; sentryTest('should update session when an error is thrown.', async ({ getLocalTestPath, page }) => { const url = await getLocalTestPath({ testDir: __dirname }); - const pageloadSession = await getCurrentSession(page, url); + const updatedSession = (await Promise.all([page.click('#throw-error'), getCurrentSession(page)]))[1]; expect(pageloadSession).toBeDefined(); expect(pageloadSession.init).toBe(true); expect(pageloadSession.errors).toBe(0); - expect(pageloadSession.status).toBe('ok'); - - await page.click('#throw-error'); - - const updatedSession = await getCurrentSession(page); - - expect(pageloadSession.sid).toBe(updatedSession.sid); - expect(updatedSession).toBeDefined(); - expect(updatedSession.init).toBe(true); + expect(updatedSession.init).toBe(false); expect(updatedSession.errors).toBe(1); expect(updatedSession.status).toBe('ok'); + expect(pageloadSession.sid).toBe(updatedSession.sid); }); sentryTest('should update session when an exception is captured.', async ({ getLocalTestPath, page }) => { const url = await getLocalTestPath({ testDir: __dirname }); const pageloadSession = await getCurrentSession(page, url); + const updatedSession = (await Promise.all([page.click('#capture-exception'), getCurrentSession(page)]))[1]; expect(pageloadSession).toBeDefined(); expect(pageloadSession.init).toBe(true); expect(pageloadSession.errors).toBe(0); - expect(pageloadSession.status).toBe('ok'); - - await page.click('#capture-exception'); - - const updatedSession = await getCurrentSession(page); - - expect(pageloadSession.sid).toBe(updatedSession.sid); - expect(updatedSession).toBeDefined(); - expect(updatedSession.init).toBe(true); + expect(updatedSession.init).toBe(false); expect(updatedSession.errors).toBe(1); expect(updatedSession.status).toBe('ok'); + expect(pageloadSession.sid).toBe(updatedSession.sid); }); diff --git a/packages/integration-tests/utils/helpers.ts b/packages/integration-tests/utils/helpers.ts index 6a6e250026f2..b1d87fcc2a57 100644 --- a/packages/integration-tests/utils/helpers.ts +++ b/packages/integration-tests/utils/helpers.ts @@ -1,5 +1,5 @@ import { Page, Request } from '@playwright/test'; -import { Event, Session } from '@sentry/types'; +import { Event, SessionContext } from '@sentry/types'; const storeUrlRegex = /\.sentry\.io\/api\/\d+\/store\//; const envelopeUrlRegex = /\.sentry\.io\/api\/\d+\/envelope\//; @@ -46,6 +46,17 @@ async function getSentryTransactionRequest(page: Page, url?: string): Promise} + */ +async function getCurrentSession(page: Page, url?: string): Promise { + return (await getMultipleSentryTransactionRequests(page, 1, url))[0]; +} + /** * Get Sentry events at the given URL, or the current page. * @@ -146,23 +157,6 @@ async function getMultipleSentryTransactionRequests(page: Page, count: number, u return getMultipleRequests(page, count, envelopeUrlRegex, envelopeRequestParser, url); } -/** - * Get current Sentry session at the given URL, or the current page - * - * @param {Page} page - * @param {string} [url] - * @return {*} {Promise} - */ -async function getCurrentSession(page: Page, url?: string): Promise { - if (url) { - await page.goto(url); - } - - const session = await page.evaluateHandle('window.Sentry.getCurrentHub().getScope().getSession()'); - - return session.jsonValue(); -} - /** * Manually inject a script into the page of given URL. * This function is useful to create more complex test subjects that can't be achieved by pre-built pages. From 306bac7cab6dbe98f4ca54e70db9153310fba7f6 Mon Sep 17 00:00:00 2001 From: Onur Temizkan Date: Thu, 10 Feb 2022 17:25:14 +0000 Subject: [PATCH 3/3] Convert `transactionRequest` to `envelopeRequest`. --- .../suites/sessions/start-session/test.ts | 9 ++-- .../suites/sessions/update-session/test.ts | 15 ++++--- packages/integration-tests/utils/helpers.ts | 43 +++++++++++-------- 3 files changed, 39 insertions(+), 28 deletions(-) diff --git a/packages/integration-tests/suites/sessions/start-session/test.ts b/packages/integration-tests/suites/sessions/start-session/test.ts index 55a14247f148..e4469bd369c1 100644 --- a/packages/integration-tests/suites/sessions/start-session/test.ts +++ b/packages/integration-tests/suites/sessions/start-session/test.ts @@ -1,11 +1,12 @@ import { expect, Route } from '@playwright/test'; +import { SessionContext } from '@sentry/types'; import { sentryTest } from '../../../utils/fixtures'; -import { getCurrentSession } from '../../../utils/helpers'; +import { getFirstSentryEnvelopeRequest } from '../../../utils/helpers'; sentryTest('should start a new session on pageload.', async ({ getLocalTestPath, page }) => { const url = await getLocalTestPath({ testDir: __dirname }); - const session = await getCurrentSession(page, url); + const session = await getFirstSentryEnvelopeRequest(page, url); expect(session).toBeDefined(); expect(session.init).toBe(true); @@ -22,11 +23,11 @@ sentryTest('should start a new session with navigation.', async ({ getLocalTestP const url = await getLocalTestPath({ testDir: __dirname }); await page.route('**/foo', (route: Route) => route.fulfill({ path: `${__dirname}/dist/index.html` })); - const initSession = await getCurrentSession(page, url); + const initSession = await getFirstSentryEnvelopeRequest(page, url); await page.click('#navigate'); - const newSession = await getCurrentSession(page); + const newSession = await getFirstSentryEnvelopeRequest(page, url); expect(newSession).toBeDefined(); expect(newSession.init).toBe(true); diff --git a/packages/integration-tests/suites/sessions/update-session/test.ts b/packages/integration-tests/suites/sessions/update-session/test.ts index bdcf32dda1b4..9634e66c360e 100644 --- a/packages/integration-tests/suites/sessions/update-session/test.ts +++ b/packages/integration-tests/suites/sessions/update-session/test.ts @@ -1,12 +1,15 @@ import { expect } from '@playwright/test'; +import { SessionContext } from '@sentry/types'; import { sentryTest } from '../../../utils/fixtures'; -import { getCurrentSession } from '../../../utils/helpers'; +import { getFirstSentryEnvelopeRequest } from '../../../utils/helpers'; sentryTest('should update session when an error is thrown.', async ({ getLocalTestPath, page }) => { const url = await getLocalTestPath({ testDir: __dirname }); - const pageloadSession = await getCurrentSession(page, url); - const updatedSession = (await Promise.all([page.click('#throw-error'), getCurrentSession(page)]))[1]; + const pageloadSession = await getFirstSentryEnvelopeRequest(page, url); + const updatedSession = ( + await Promise.all([page.click('#throw-error'), getFirstSentryEnvelopeRequest(page)]) + )[1]; expect(pageloadSession).toBeDefined(); expect(pageloadSession.init).toBe(true); @@ -21,8 +24,10 @@ sentryTest('should update session when an error is thrown.', async ({ getLocalTe sentryTest('should update session when an exception is captured.', async ({ getLocalTestPath, page }) => { const url = await getLocalTestPath({ testDir: __dirname }); - const pageloadSession = await getCurrentSession(page, url); - const updatedSession = (await Promise.all([page.click('#capture-exception'), getCurrentSession(page)]))[1]; + const pageloadSession = await getFirstSentryEnvelopeRequest(page, url); + const updatedSession = ( + await Promise.all([page.click('#capture-exception'), getFirstSentryEnvelopeRequest(page)]) + )[1]; expect(pageloadSession).toBeDefined(); expect(pageloadSession.init).toBe(true); diff --git a/packages/integration-tests/utils/helpers.ts b/packages/integration-tests/utils/helpers.ts index b1d87fcc2a57..84ee3f8b3ddc 100644 --- a/packages/integration-tests/utils/helpers.ts +++ b/packages/integration-tests/utils/helpers.ts @@ -1,5 +1,5 @@ import { Page, Request } from '@playwright/test'; -import { Event, SessionContext } from '@sentry/types'; +import { Event } from '@sentry/types'; const storeUrlRegex = /\.sentry\.io\/api\/\d+\/store\//; const envelopeUrlRegex = /\.sentry\.io\/api\/\d+\/envelope\//; @@ -43,18 +43,8 @@ async function getSentryRequest(page: Page, url?: string): Promise { * @return {*} {Promise} */ async function getSentryTransactionRequest(page: Page, url?: string): Promise { - return (await getMultipleSentryTransactionRequests(page, 1, url))[0]; -} - -/** - * Get current Sentry session at the given URL, or the current page - * - * @param {Page} page - * @param {string} [url] - * @return {*} {Promise} - */ -async function getCurrentSession(page: Page, url?: string): Promise { - return (await getMultipleSentryTransactionRequests(page, 1, url))[0]; + // TODO: Remove this and update all usages in favour of `getFirstSentryEnvelopeRequest` and `getMultipleSentryEnvelopeRequests` + return (await getMultipleSentryEnvelopeRequests(page, 1, url))[0]; } /** @@ -146,15 +136,30 @@ async function getMultipleSentryRequests(page: Page, count: number, url?: string } /** - * Wait and get multiple transaction requests at the given URL, or the current page + * Wait and get multiple envelope requests at the given URL, or the current page * + * @template T * @param {Page} page * @param {number} count * @param {string} [url] - * @return {*} {Promise} + * @return {*} {Promise} + */ +async function getMultipleSentryEnvelopeRequests(page: Page, count: number, url?: string): Promise { + // TODO: This is not currently checking the type of envelope, just casting for now. + // We can update this to include optional type-guarding when we have types for Envelope. + return getMultipleRequests(page, count, envelopeUrlRegex, envelopeRequestParser, url) as Promise; +} + +/** + * Wait and get the first envelope request at the given URL, or the current page + * + * @template T + * @param {Page} page + * @param {string} [url] + * @return {*} {Promise} */ -async function getMultipleSentryTransactionRequests(page: Page, count: number, url?: string): Promise { - return getMultipleRequests(page, count, envelopeUrlRegex, envelopeRequestParser, url); +async function getFirstSentryEnvelopeRequest(page: Page, url?: string): Promise { + return (await getMultipleSentryEnvelopeRequests(page, 1, url))[0]; } /** @@ -177,10 +182,10 @@ async function injectScriptAndGetEvents(page: Page, url: string, scriptPath: str export { runScriptInSandbox, getMultipleSentryRequests, - getMultipleSentryTransactionRequests, + getMultipleSentryEnvelopeRequests, + getFirstSentryEnvelopeRequest, getSentryRequest, getSentryTransactionRequest, getSentryEvents, - getCurrentSession, injectScriptAndGetEvents, };