diff --git a/src/lib/services/proxy-service.ts b/src/lib/services/proxy-service.ts index b9e9086fbda6..324b1de210a0 100644 --- a/src/lib/services/proxy-service.ts +++ b/src/lib/services/proxy-service.ts @@ -74,12 +74,19 @@ export class ProxyService { const client = await this.clientForProxyToken(token); const definitions = client.getFeatureToggleDefinitions() || []; + const sessionId = context.sessionId || String(Math.random()); + return definitions - .filter((feature) => client.isEnabled(feature.name, context)) + .filter((feature) => + client.isEnabled(feature.name, { ...context, sessionId }), + ) .map((feature) => ({ name: feature.name, enabled: Boolean(feature.enabled), - variant: client.forceGetVariant(feature.name, context), + variant: client.getVariant(feature.name, { + ...context, + sessionId, + }), impressionData: Boolean(feature.impressionData), })); } diff --git a/src/test/e2e/api/proxy/proxy.e2e.test.ts b/src/test/e2e/api/proxy/proxy.e2e.test.ts index 1f9c8955e332..531ce811157c 100644 --- a/src/test/e2e/api/proxy/proxy.e2e.test.ts +++ b/src/test/e2e/api/proxy/proxy.e2e.test.ts @@ -1236,3 +1236,43 @@ test('should return 204 if metrics are disabled', async () => { }) .expect(204); }); + +test('should resolve variable rollout percentage consistently', async () => { + const frontendToken = await createApiToken(ApiTokenType.FRONTEND); + await createFeatureToggle({ + name: 'randomFeature', + enabled: true, + strategies: [ + { + name: 'flexibleRollout', + constraints: [], + parameters: { + rollout: '50', + stickiness: 'default', + groupId: 'some-new', + }, + variants: [ + { + name: 'a', + stickiness: 'default', + weightType: 'variable', + weight: 1000, + }, + ], + }, + ], + }); + + for (let i = 0; i < 10; ++i) { + const { body } = await app.request + .get('/api/frontend') + .set('Authorization', frontendToken.secret) + .expect('Content-Type', /json/) + .expect(200); + + if (body.toggles.length > 0) { + // disabled variant should not be possible for enabled toggles + expect(body.toggles[0].variant.name).toBe('a'); + } + } +});