Skip to content

Commit b972f6e

Browse files
committed
Add withScope test
1 parent 2898386 commit b972f6e

File tree

3 files changed

+86
-12
lines changed
  • dev-packages/browser-integration-tests/suites/integrations/featureFlags/unleash

3 files changed

+86
-12
lines changed

dev-packages/browser-integration-tests/suites/integrations/featureFlags/unleash/basic/test.ts

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -24,26 +24,35 @@ sentryTest('Basic test with eviction, update, and no async tasks', async ({ getL
2424

2525
await page.evaluate(bufferSize => {
2626
const client = new (window as any).UnleashClient();
27-
for (let i = 1; i <= bufferSize; i++) {
27+
28+
client.isEnabled('feat1');
29+
client.isEnabled('strFeat');
30+
client.isEnabled('noPayloadFeat');
31+
client.isEnabled('jsonFeat');
32+
client.isEnabled('noVariantFeat');
33+
client.isEnabled('disabledFeat');
34+
35+
for (let i = 7; i <= bufferSize; i++) {
2836
client.isEnabled(`feat${i}`);
2937
}
3038
client.isEnabled(`feat${bufferSize + 1}`); // eviction
31-
client.isEnabled('feat3'); // update
39+
client.isEnabled('noPayloadFeat'); // update (move to tail)
3240
}, FLAG_BUFFER_SIZE);
3341

3442
const reqPromise = waitForErrorRequest(page);
3543
await page.locator('#error').click();
3644
const req = await reqPromise;
3745
const event = envelopeRequestParser(req);
3846

39-
const expectedFlags = [{ flag: 'feat2', result: true }];
40-
expectedFlags.push({ flag: 'feat4', result: true });
41-
expectedFlags.push({ flag: 'feat5', result: true });
42-
for (let i = 6; i <= FLAG_BUFFER_SIZE; i++) {
47+
const expectedFlags = [{ flag: 'strFeat', result: true }];
48+
expectedFlags.push({ flag: 'jsonFeat', result: true });
49+
expectedFlags.push({ flag: 'noVariantFeat', result: true });
50+
expectedFlags.push({ flag: 'disabledFeat', result: false });
51+
for (let i = 7; i <= FLAG_BUFFER_SIZE; i++) {
4352
expectedFlags.push({ flag: `feat${i}`, result: false });
4453
}
4554
expectedFlags.push({ flag: `feat${FLAG_BUFFER_SIZE + 1}`, result: false });
46-
expectedFlags.push({ flag: 'feat3', result: true });
55+
expectedFlags.push({ flag: 'noPayloadFeat', result: true });
4756

4857
expect(event.contexts?.flags?.values).toEqual(expectedFlags);
4958
});

dev-packages/browser-integration-tests/suites/integrations/featureFlags/unleash/init.js

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,9 @@ import * as Sentry from '@sentry/browser';
33
window.UnleashClient = class {
44
constructor() {
55
this._featureToVariant = {
6-
feat2: { name: 'variant1', enabled: true, feature_enabled: true, payload: { type: 'string', value: 'test' } },
7-
feat3: { name: 'eu-west', enabled: true, feature_enabled: true },
8-
feat4: {
6+
strFeat: { name: 'variant1', enabled: true, feature_enabled: true, payload: { type: 'string', value: 'test' } },
7+
noPayloadFeat: { name: 'eu-west', enabled: true, feature_enabled: true },
8+
jsonFeat: {
99
name: 'paid-orgs',
1010
enabled: true,
1111
feature_enabled: true,
@@ -16,10 +16,10 @@ window.UnleashClient = class {
1616
},
1717

1818
// Enabled feature with no configured variants.
19-
feat5: { name: 'disabled', enabled: false, feature_enabled: true },
19+
noVariantFeat: { name: 'disabled', enabled: false, feature_enabled: true },
2020

2121
// Disabled feature.
22-
feat6: { name: 'disabled', enabled: false, feature_enabled: false },
22+
disabledFeat: { name: 'disabled', enabled: false, feature_enabled: false },
2323
};
2424

2525
// Variant returned for features that don't exist.
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
import { expect } from '@playwright/test';
2+
3+
import { sentryTest } from '../../../../../utils/fixtures';
4+
5+
import { envelopeRequestParser, shouldSkipFeatureFlagsTest, waitForErrorRequest } from '../../../../../utils/helpers';
6+
7+
import type { Scope } from '@sentry/browser';
8+
9+
sentryTest('Flag evaluations in forked scopes are stored separately.', async ({ getLocalTestUrl, page }) => {
10+
if (shouldSkipFeatureFlagsTest()) {
11+
sentryTest.skip();
12+
}
13+
14+
await page.route('https://dsn.ingest.sentry.io/**/*', route => {
15+
return route.fulfill({
16+
status: 200,
17+
contentType: 'application/json',
18+
body: JSON.stringify({ id: 'test-id' }),
19+
});
20+
});
21+
22+
const url = await getLocalTestUrl({ testDir: __dirname, skipDsnRouteHandler: true });
23+
await page.goto(url);
24+
25+
const forkedReqPromise = waitForErrorRequest(page, event => !!event.tags && event.tags.isForked === true);
26+
const mainReqPromise = waitForErrorRequest(page, event => !!event.tags && event.tags.isForked === false);
27+
28+
await page.evaluate(() => {
29+
const Sentry = (window as any).Sentry;
30+
const errorButton = document.querySelector('#error') as HTMLButtonElement;
31+
const unleash = new (window as any).UnleashClient();
32+
33+
unleash.isEnabled('strFeat');
34+
35+
Sentry.withScope((scope: Scope) => {
36+
unleash.isEnabled('disabledFeat');
37+
unleash.isEnabled('strFeat');
38+
scope.setTag('isForked', true);
39+
if (errorButton) {
40+
errorButton.click();
41+
}
42+
});
43+
44+
unleash.isEnabled('noPayloadFeat');
45+
Sentry.getCurrentScope().setTag('isForked', false);
46+
errorButton.click();
47+
return true;
48+
});
49+
50+
const forkedReq = await forkedReqPromise;
51+
const forkedEvent = envelopeRequestParser(forkedReq);
52+
53+
const mainReq = await mainReqPromise;
54+
const mainEvent = envelopeRequestParser(mainReq);
55+
56+
expect(forkedEvent.contexts?.flags?.values).toEqual([
57+
{ flag: 'disabledFeat', result: false },
58+
{ flag: 'strFeat', result: true },
59+
]);
60+
61+
expect(mainEvent.contexts?.flags?.values).toEqual([
62+
{ flag: 'strFeat', result: true },
63+
{ flag: 'noPayloadFeat', result: true },
64+
]);
65+
});

0 commit comments

Comments
 (0)