Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions flagsmith-core.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1001,6 +1001,10 @@ const Flagsmith = class {
this.log(`Flagsmith: getExperimentFlag called for "${featureName}" which does not exist. No exposure recorded.`);
return null;
}
if (!flag.enabled) {
this.log(`Flagsmith: getExperimentFlag called for "${featureName}" which is disabled. No exposure recorded.`);
return flag;
}
if (!flag.variant) {
this.log(`Flagsmith: getExperimentFlag called for "${featureName}" which has no variant; experiments require a multivariate flag. No exposure recorded.`);
return flag;
Expand Down
10 changes: 10 additions & 0 deletions test/data/identities_test_experiment_identity.json
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,16 @@
"enabled": true,
"feature_state_value": 16,
"variant": "control"
},
{
"feature": {
"id": 80321,
"name": "disabled_experiment",
"type": "MULTIVARIATE"
},
"enabled": false,
"feature_state_value": null,
"variant": "control"
}
],
"traits": []
Expand Down
11 changes: 11 additions & 0 deletions test/events.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -144,6 +144,17 @@ describe('getExperimentFlag', () => {
expect(eventCalls(mockFetch)).toHaveLength(0);
});

test('skips exposure for a disabled flag even when it has a variant, still returns it', async () => {
const { flagsmith, initConfig, mockFetch } = getFlagsmith(eventsConfig({ identity: experimentIdentity }));
await flagsmith.init(initConfig); // identified, source SERVER

const flag = flagsmith.getExperimentFlag('disabled_experiment');
expect(flag).toEqual(expect.objectContaining({ enabled: false, variant: 'control' }));

await flagsmith.flushEvents();
expect(eventCalls(mockFetch)).toHaveLength(0);
});

test('skips exposure and returns null for an absent feature', async () => {
const { flagsmith, initConfig, mockFetch } = getFlagsmith(eventsConfig({ identity: testIdentity }));
await flagsmith.init(initConfig);
Expand Down
Loading