From 689b46c5179ae837ca19801d37325c8fcee1f43b Mon Sep 17 00:00:00 2001 From: andreas-unleash Date: Thu, 2 Mar 2023 16:44:08 +0200 Subject: [PATCH] fix: Return all toggles when env var is set and flag is on Signed-off-by: andreas-unleash --- src/lib/routes/proxy-api/index.ts | 6 +- src/lib/services/proxy-service.ts | 2 +- src/test/e2e/api/proxy/proxy.e2e.test.ts | 91 +++++++++++++++++++++++- 3 files changed, 94 insertions(+), 5 deletions(-) diff --git a/src/lib/routes/proxy-api/index.ts b/src/lib/routes/proxy-api/index.ts index c5fc532591..cd82a1d01e 100644 --- a/src/lib/routes/proxy-api/index.ts +++ b/src/lib/routes/proxy-api/index.ts @@ -20,6 +20,7 @@ import { import { Context } from 'unleash-client'; import { enrichContextWithIp } from '../../proxy'; import { corsOriginMiddleware } from '../../middleware'; +import * as process from 'process'; interface ApiUserRequest< PARAM = any, @@ -145,7 +146,10 @@ export default class ProxyController extends Controller { res: Response, ) { let toggles; - if (this.flagResolver.isEnabled('proxyReturnAllToggles')) { + if ( + this.flagResolver.isEnabled('proxyReturnAllToggles') && + Boolean(process.env.RETURN_ALL_TOGGLES) + ) { toggles = await this.services.proxyService.getAllProxyFeatures( req.user, ProxyController.createContext(req), diff --git a/src/lib/services/proxy-service.ts b/src/lib/services/proxy-service.ts index b832990319..2226e0c610 100644 --- a/src/lib/services/proxy-service.ts +++ b/src/lib/services/proxy-service.ts @@ -86,7 +86,7 @@ export class ProxyService { return definitions.map((feature) => ({ name: feature.name, - enabled: Boolean(feature.enabled), + enabled: Boolean(client.isEnabled(feature.name)), variant: client.forceGetVariant(feature.name, context), 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 3dd7ff93a2..6eea64a0e8 100644 --- a/src/test/e2e/api/proxy/proxy.e2e.test.ts +++ b/src/test/e2e/api/proxy/proxy.e2e.test.ts @@ -14,6 +14,7 @@ import { IStrategyConfig, } from '../../../../lib/types'; import { ProxyRepository } from '../../../../lib/proxy'; +import * as process from 'process'; let app: IUnleashTest; let db: ITestDb; @@ -935,6 +936,7 @@ test('Should not recursively set off timers on events', async () => { test('should return all features when specified', async () => { app.config.experimental.flags.proxyReturnAllToggles = true; + process.env.RETURN_ALL_TOGGLES = 'true'; const frontendToken = await createApiToken(ApiTokenType.FRONTEND); await createFeatureToggle({ name: 'enabledFeature1', @@ -944,12 +946,32 @@ test('should return all features when specified', async () => { await createFeatureToggle({ name: 'enabledFeature2', enabled: true, - strategies: [{ name: 'default', constraints: [], parameters: {} }], + strategies: [ + { + name: 'flexibleRollout', + constraints: [], + parameters: { + rollout: '100', + stickiness: 'default', + groupId: 'some-new', + }, + }, + ], }); await createFeatureToggle({ name: 'disabledFeature', - enabled: false, - strategies: [{ name: 'default', constraints: [], parameters: {} }], + enabled: true, + strategies: [ + { + name: 'flexibleRollout', + constraints: [], + parameters: { + rollout: '0', + stickiness: 'default', + groupId: 'some-new', + }, + }, + ], }); await app.request .get('/api/frontend') @@ -982,6 +1004,69 @@ test('should return all features when specified', async () => { }); }); +test('should return all features when env var is set only', async () => { + app.config.experimental.flags.proxyReturnAllToggles = true; + const frontendToken = await createApiToken(ApiTokenType.FRONTEND); + await createFeatureToggle({ + name: 'enabledFeature1', + enabled: true, + strategies: [{ name: 'default', constraints: [], parameters: {} }], + }); + await createFeatureToggle({ + name: 'enabledFeature2', + enabled: true, + strategies: [ + { + name: 'flexibleRollout', + constraints: [], + parameters: { + rollout: '100', + stickiness: 'default', + groupId: 'some-new', + }, + }, + ], + }); + await createFeatureToggle({ + name: 'disabledFeature', + enabled: true, + strategies: [ + { + name: 'flexibleRollout', + constraints: [], + parameters: { + rollout: '0', + stickiness: 'default', + groupId: 'some-new', + }, + }, + ], + }); + await app.request + .get('/api/frontend') + .set('Authorization', frontendToken.secret) + .expect('Content-Type', /json/) + .expect(200) + .expect((res) => { + expect(res.body).toEqual({ + toggles: [ + { + name: 'enabledFeature1', + enabled: true, + impressionData: false, + variant: { enabled: false, name: 'disabled' }, + }, + { + name: 'enabledFeature2', + enabled: true, + impressionData: false, + variant: { enabled: false, name: 'disabled' }, + }, + ], + }); + }); +}); + test('should return maxAge header on options call', async () => { await app.request .options('/api/frontend')