Skip to content

Commit 7a332e4

Browse files
authored
Merge pull request #7096 from getsentry/lms-replay-pw-add-bundles
test(replay): Test against full and errors+replay CDN bundles
2 parents ee301c3 + 7bec22f commit 7a332e4

File tree

12 files changed

+54
-44
lines changed

12 files changed

+54
-44
lines changed

.github/workflows/build.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -533,6 +533,8 @@ jobs:
533533
- bundle_es5_min
534534
- bundle_es6
535535
- bundle_es6_min
536+
- bundle_replay_es6
537+
- bundle_replay_es6_min
536538
tracing_only:
537539
- true
538540
- false

packages/integration-tests/suites/replay/captureReplay/test.ts

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,10 @@ import type { ReplayEvent } from '@sentry/types';
44

55
import { sentryTest } from '../../../utils/fixtures';
66
import { envelopeRequestParser } from '../../../utils/helpers';
7-
import { waitForReplayRequest } from '../../../utils/replayHelpers';
7+
import { shouldSkipReplayTest, waitForReplayRequest } from '../../../utils/replayHelpers';
88

99
sentryTest('should capture replays', async ({ getLocalTestPath, page }) => {
10-
// Replay bundles are es6 only
11-
if (process.env.PW_BUNDLE && process.env.PW_BUNDLE.startsWith('bundle_es5')) {
10+
if (shouldSkipReplayTest()) {
1211
sentryTest.skip();
1312
}
1413

packages/integration-tests/suites/replay/compression/init.js

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
11
import * as Sentry from '@sentry/browser';
2-
import { Replay } from '@sentry/replay';
32

43
window.Sentry = Sentry;
5-
window.Replay = new Replay({
4+
window.Replay = new Sentry.Replay({
65
flushMinDelay: 500,
76
flushMaxDelay: 500,
87
useCompression: true,

packages/integration-tests/suites/replay/compression/test.ts

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

33
import { sentryTest } from '../../../utils/fixtures';
44
import { getExpectedReplayEvent } from '../../../utils/replayEventTemplates';
5-
import { getFullRecordingSnapshots, getReplayEvent, waitForReplayRequest } from '../../../utils/replayHelpers';
5+
import {
6+
getFullRecordingSnapshots,
7+
getReplayEvent,
8+
shouldSkipReplayTest,
9+
waitForReplayRequest,
10+
} from '../../../utils/replayHelpers';
611

712
sentryTest('replay recording should be compressed by default', async ({ getLocalTestPath, page }) => {
8-
// Replay bundles are es6 only
9-
if (process.env.PW_BUNDLE && process.env.PW_BUNDLE.startsWith('bundle_es5')) {
13+
if (shouldSkipReplayTest()) {
1014
sentryTest.skip();
1115
}
1216

packages/integration-tests/suites/replay/customEvents/init.js

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
11
import * as Sentry from '@sentry/browser';
2-
import { Replay } from '@sentry/replay';
32

43
window.Sentry = Sentry;
5-
window.Replay = new Replay({
4+
window.Replay = new Sentry.Replay({
65
flushMinDelay: 500,
76
flushMaxDelay: 500,
87
useCompression: false,

packages/integration-tests/suites/replay/customEvents/test.ts

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,19 @@ import {
1010
expectedNavigationPerformanceSpan,
1111
getExpectedReplayEvent,
1212
} from '../../../utils/replayEventTemplates';
13-
import { getCustomRecordingEvents, getReplayEvent, waitForReplayRequest } from '../../../utils/replayHelpers';
13+
import {
14+
getCustomRecordingEvents,
15+
getReplayEvent,
16+
shouldSkipReplayTest,
17+
waitForReplayRequest,
18+
} from '../../../utils/replayHelpers';
1419

1520
sentryTest(
1621
'replay recording should contain default performance spans',
1722
async ({ getLocalTestPath, page, browserName }) => {
18-
// Replay bundles are es6 only and most performance entries are only available in chromium
19-
if ((process.env.PW_BUNDLE && process.env.PW_BUNDLE.startsWith('bundle_es5')) || browserName !== 'chromium') {
23+
// We only test this against the NPM package and replay bundles
24+
// and only on chromium as most performance entries are only available in chromium
25+
if (shouldSkipReplayTest() || browserName !== 'chromium') {
2026
sentryTest.skip();
2127
}
2228

@@ -68,8 +74,7 @@ sentryTest(
6874
sentryTest(
6975
'replay recording should contain a click breadcrumb when a button is clicked',
7076
async ({ getLocalTestPath, page }) => {
71-
// Replay bundles are es6 only
72-
if (process.env.PW_BUNDLE && process.env.PW_BUNDLE.startsWith('bundle_es5')) {
77+
if (shouldSkipReplayTest()) {
7378
sentryTest.skip();
7479
}
7580

packages/integration-tests/suites/replay/errorResponse/test.ts

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

33
import { sentryTest } from '../../../utils/fixtures';
4-
import { getReplaySnapshot, REPLAY_DEFAULT_FLUSH_MAX_DELAY, waitForReplayRequest } from '../../../utils/replayHelpers';
4+
import {
5+
getReplaySnapshot,
6+
REPLAY_DEFAULT_FLUSH_MAX_DELAY,
7+
shouldSkipReplayTest,
8+
waitForReplayRequest,
9+
} from '../../../utils/replayHelpers';
510

611
sentryTest('should stop recording after receiving an error response', async ({ getLocalTestPath, page }) => {
7-
// Currently bundle tests are not supported for replay
8-
if (process.env.PW_BUNDLE && process.env.PW_BUNDLE.startsWith('bundle_es5')) {
12+
if (shouldSkipReplayTest()) {
913
sentryTest.skip();
1014
}
11-
1215
let called = 0;
1316

1417
await page.route('https://dsn.ingest.sentry.io/**/*', route => {

packages/integration-tests/suites/replay/init.js

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
11
import * as Sentry from '@sentry/browser';
2-
import { Replay } from '@sentry/replay';
32

43
window.Sentry = Sentry;
5-
window.Replay = new Replay({
4+
window.Replay = new Sentry.Replay({
65
flushMinDelay: 200,
76
flushMaxDelay: 200,
87
});

packages/integration-tests/suites/replay/sampling/init.js

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
11
import * as Sentry from '@sentry/browser';
2-
import { Replay } from '@sentry/replay';
32

43
window.Sentry = Sentry;
5-
window.Replay = new Replay({
4+
window.Replay = new Sentry.Replay({
65
flushMinDelay: 200,
76
flushMaxDelay: 200,
87
});

packages/integration-tests/suites/replay/sampling/test.ts

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

33
import { sentryTest } from '../../../utils/fixtures';
4-
import { getReplaySnapshot } from '../../../utils/replayHelpers';
4+
import { getReplaySnapshot, shouldSkipReplayTest } from '../../../utils/replayHelpers';
55

66
sentryTest('should not send replays if both sample rates are 0', async ({ getLocalTestPath, page }) => {
7-
// Replay bundles are es6 only
8-
if (process.env.PW_BUNDLE && process.env.PW_BUNDLE.startsWith('bundle_es5')) {
7+
if (shouldSkipReplayTest()) {
98
sentryTest.skip();
109
}
1110

packages/integration-tests/utils/generatePlugin.ts

Lines changed: 8 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import type { Compiler } from 'webpack';
77
const PACKAGES_DIR = '../../packages';
88

99
const tracingOnly = process.env.PW_TRACING_ONLY === 'true';
10+
1011
const bundleKey = process.env.PW_BUNDLE;
1112

1213
// `esm` and `cjs` builds are modules that can be imported / aliased by webpack
@@ -23,6 +24,8 @@ const BUNDLE_PATHS: Record<string, Record<string, string>> = {
2324
bundle_es5_min: 'build/bundles/bundle.es5.min.js',
2425
bundle_es6: 'build/bundles/bundle.js',
2526
bundle_es6_min: 'build/bundles/bundle.min.js',
27+
bundle_replay_es6: 'build/bundles/bundle.replay.js',
28+
bundle_replay_es6_min: 'build/bundles/bundle.replay.min.js',
2629
},
2730
tracing: {
2831
cjs: 'build/npm/cjs/index.js',
@@ -31,6 +34,8 @@ const BUNDLE_PATHS: Record<string, Record<string, string>> = {
3134
bundle_es5_min: 'build/bundles/bundle.tracing.es5.min.js',
3235
bundle_es6: 'build/bundles/bundle.tracing.js',
3336
bundle_es6_min: 'build/bundles/bundle.tracing.min.js',
37+
bundle_replay_es6: 'build/bundles/bundle.tracing.replay.js',
38+
bundle_replay_es6_min: 'build/bundles/bundle.tracing.replay.min.js',
3439
},
3540
integrations: {
3641
cjs: 'build/npm/cjs/index.js',
@@ -39,12 +44,8 @@ const BUNDLE_PATHS: Record<string, Record<string, string>> = {
3944
bundle_es5_min: 'build/bundles/[INTEGRATION_NAME].es5.min.js',
4045
bundle_es6: 'build/bundles/[INTEGRATION_NAME].js',
4146
bundle_es6_min: 'build/bundles/[INTEGRATION_NAME].min.js',
42-
},
43-
replay: {
44-
cjs: 'build/npm/cjs/index.js',
45-
esm: 'build/npm/esm/index.js',
46-
bundle_es6: 'build/bundles/replay.js',
47-
bundle_es6_min: 'build/bundles/replay.min.js',
47+
bundle_replay_es6: 'build/bundles/[INTEGRATION_NAME].js',
48+
bundle_replay_es6_min: 'build/bundles/[INTEGRATION_NAME].min.js',
4849
},
4950
};
5051

@@ -93,7 +94,6 @@ function generateSentryAlias(): Record<string, string> {
9394
class SentryScenarioGenerationPlugin {
9495
public requiresTracing: boolean = false;
9596
public requiredIntegrations: string[] = [];
96-
public requiresReplay = false;
9797

9898
private _name: string = 'SentryScenarioGenerationPlugin';
9999

@@ -106,7 +106,7 @@ class SentryScenarioGenerationPlugin {
106106
'@sentry/browser': 'Sentry',
107107
'@sentry/tracing': 'Sentry',
108108
'@sentry/integrations': 'Sentry.Integrations',
109-
'@sentry/replay': 'Sentry.Integrations',
109+
'@sentry/replay': 'Sentry',
110110
}
111111
: {};
112112

@@ -121,8 +121,6 @@ class SentryScenarioGenerationPlugin {
121121
this.requiresTracing = true;
122122
} else if (source === '@sentry/integrations') {
123123
this.requiredIntegrations.push(statement.specifiers[0].imported.name.toLowerCase());
124-
} else if (source === '@sentry/replay') {
125-
this.requiresReplay = true;
126124
}
127125
},
128126
);
@@ -150,14 +148,6 @@ class SentryScenarioGenerationPlugin {
150148
data.assetTags.scripts.unshift(integrationObject);
151149
});
152150

153-
if (this.requiresReplay && BUNDLE_PATHS['replay'][bundleKey]) {
154-
const replayObject = createHtmlTagObject('script', {
155-
src: path.resolve(PACKAGES_DIR, 'replay', BUNDLE_PATHS['replay'][bundleKey]),
156-
});
157-
158-
data.assetTags.scripts.unshift(replayObject);
159-
}
160-
161151
data.assetTags.scripts.unshift(bundleObject);
162152
}
163153

packages/integration-tests/utils/replayHelpers.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -177,3 +177,15 @@ const replayEnvelopeParser = (request: Request | null): unknown[] => {
177177

178178
return lines;
179179
};
180+
181+
/**
182+
* We can only test replay tests in certain bundles/packages:
183+
* - NPM (ESM, CJS)
184+
* - CDN bundles that contain the Replay integration
185+
*
186+
* @returns `true` if we should skip the replay test
187+
*/
188+
export function shouldSkipReplayTest(): boolean {
189+
const bundle = process.env.PW_BUNDLE as string | undefined;
190+
return bundle != null && !bundle.includes('replay') && !bundle.includes('esm') && !bundle.includes('cjs');
191+
}

0 commit comments

Comments
 (0)