Skip to content

Commit 34af880

Browse files
committed
Fix patching for correct access to
1 parent f1a5574 commit 34af880

File tree

3 files changed

+45
-14
lines changed
  • dev-packages/browser-integration-tests/suites/integrations/featureFlags/unleash
  • packages/browser/src/integrations/featureFlags/unleash

3 files changed

+45
-14
lines changed

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

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -36,12 +36,14 @@ sentryTest('Basic isEnabled test with eviction, update, and no async tasks', asy
3636
const req = await reqPromise;
3737
const event = envelopeRequestParser(req);
3838

39-
const expectedFlags = [{ flag: 'feat2', result: false }];
40-
for (let i = 4; i <= FLAG_BUFFER_SIZE; i++) {
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++) {
4143
expectedFlags.push({ flag: `feat${i}`, result: false });
4244
}
4345
expectedFlags.push({ flag: `feat${FLAG_BUFFER_SIZE + 1}`, result: false });
44-
expectedFlags.push({ flag: 'feat3', result: false });
46+
expectedFlags.push({ flag: 'feat3', result: true });
4547

4648
expect(event.contexts?.flags?.values).toEqual(expectedFlags);
4749
});
@@ -76,12 +78,14 @@ sentryTest('Basic getVariant test with eviction, update, and no async tasks', as
7678
const req = await reqPromise;
7779
const event = envelopeRequestParser(req);
7880

79-
const expectedFlags = [{ flag: 'feat2', result: false }];
80-
for (let i = 4; i <= FLAG_BUFFER_SIZE; i++) {
81+
const expectedFlags = [{ flag: 'feat2', result: true }];
82+
expectedFlags.push({ flag: 'feat4', result: true });
83+
expectedFlags.push({ flag: 'feat5', result: true });
84+
for (let i = 6; i <= FLAG_BUFFER_SIZE; i++) {
8185
expectedFlags.push({ flag: `feat${i}`, result: false });
8286
}
8387
expectedFlags.push({ flag: `feat${FLAG_BUFFER_SIZE + 1}`, result: false });
84-
expectedFlags.push({ flag: 'feat3', result: false });
88+
expectedFlags.push({ flag: 'feat3', result: true });
8589

8690
expect(event.contexts?.flags?.values).toEqual(expectedFlags);
8791
});

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

Lines changed: 32 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,43 @@
11
import * as Sentry from '@sentry/browser';
22

33
window.UnleashClient = class {
4-
isEnabled(_toggleName) {
5-
return false;
6-
}
4+
constructor() {
5+
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': {
9+
name: 'paid-orgs',
10+
enabled: true,
11+
feature_enabled: true,
12+
payload: {
13+
type: 'json',
14+
value: '{"foo": {"bar": "baz"}, "hello": [1, 2, 3]}',
15+
},
16+
},
17+
18+
// Enabled feature with no configured variants.
19+
'feat5': {name: 'disabled', enabled: false, feature_enabled: true},
20+
21+
// Disabled feature.
22+
'feat6': {name: 'disabled', enabled: false, feature_enabled: false},
23+
};
724

8-
getVariant(_toggleName) {
9-
return {
25+
// Variant returned for features that don't exist.
26+
// `feature_enabled` may be defined in prod, but we want to test the undefined case.
27+
this._fallbackVariant = {
1028
name: 'disabled',
1129
enabled: false,
1230
};
1331
}
32+
33+
isEnabled(toggleName) {
34+
const variant = this._featureToVariant[toggleName] || this._fallbackVariant;
35+
return variant.feature_enabled || false;
36+
}
37+
38+
getVariant(toggleName) {
39+
return this._featureToVariant[toggleName] || this._fallbackVariant;
40+
}
1441
};
1542

1643
window.Sentry = Sentry;

packages/browser/src/integrations/featureFlags/unleash/integration.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ export const unleashIntegration = defineIntegration((unleashClientClass: Unleash
5151
return result;
5252
},
5353
};
54-
const originalIsEnabled = unleashClientPrototype.isEnabled.bind(unleashClientPrototype);
54+
const originalIsEnabled = unleashClientPrototype.isEnabled;
5555
unleashClientPrototype.isEnabled = new Proxy(originalIsEnabled, sentryIsEnabled);
5656

5757
const sentryGetVariant = {
@@ -61,12 +61,12 @@ export const unleashIntegration = defineIntegration((unleashClientClass: Unleash
6161
args: [toggleName: string],
6262
) => {
6363
const variant = Reflect.apply(target, thisArg, args);
64-
const result = variant.enabled;
64+
const result = variant.feature_enabled || false; // undefined means the feature does not exist.
6565
insertFlagToScope(args[0], result);
6666
return variant;
6767
},
6868
};
69-
const originalGetVariant = unleashClientPrototype.getVariant.bind(unleashClientPrototype);
69+
const originalGetVariant = unleashClientPrototype.getVariant;
7070
unleashClientPrototype.getVariant = new Proxy(originalGetVariant, sentryGetVariant);
7171
},
7272
};

0 commit comments

Comments
 (0)