From 331033408cf3ee67041b6af89bb01d80f1713e45 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nuno=20G=C3=B3is?= Date: Wed, 24 Jan 2024 11:53:04 +0000 Subject: [PATCH] fix: flag resolver get variant (#6020) https://linear.app/unleash/issue/2-1880/fix-flag-resolver-getvariant-behavior Fixes the flag resolver `getVariant` behavior when there's a variant object set in `experimental` - The flag resolver should call the external resolver `getVariant` when not overridden to be true, even if set as variant object in `experimental`. Related: https://github.com/Unleash/unleash/pull/3808 --- src/lib/util/flag-resolver.test.ts | 41 ++++++++++++++++++++++++++++++ src/lib/util/flag-resolver.ts | 2 +- 2 files changed, 42 insertions(+), 1 deletion(-) diff --git a/src/lib/util/flag-resolver.test.ts b/src/lib/util/flag-resolver.test.ts index 6366e62e9a..7bc55bcb3b 100644 --- a/src/lib/util/flag-resolver.test.ts +++ b/src/lib/util/flag-resolver.test.ts @@ -174,3 +174,44 @@ test('should expose an helper to get variant value', () => { foo: 'bar', }); }); + +test('should call external resolver getVariant when not overridden to be true, even if set as object in experimental', () => { + const variant = { + enabled: true, + name: 'variant', + payload: { + type: PayloadType.STRING, + value: 'variant-A', + }, + }; + + const externalResolver = { + isEnabled: () => true, + getVariant: (name: string) => { + if (name === 'variantFlag') { + return variant; + } + return getDefaultVariant(); + }, + }; + + const config = { + flags: { + variantFlag: { + name: 'variant-flag', + enabled: false, + payload: { + type: PayloadType.JSON, + value: '', + }, + }, + }, + externalResolver, + }; + + const resolver = new FlagResolver(config as IExperimentalOptions); + + expect(resolver.getVariant('variantFlag' as IFlagKey)).toStrictEqual( + variant, + ); +}); diff --git a/src/lib/util/flag-resolver.ts b/src/lib/util/flag-resolver.ts index 55afcbfc6d..726249672d 100644 --- a/src/lib/util/flag-resolver.ts +++ b/src/lib/util/flag-resolver.ts @@ -57,7 +57,7 @@ export default class FlagResolver implements IFlagResolver { const exp = this.experiments[expName]; if (exp) { if (typeof exp === 'boolean') return getDefaultVariant(); - else return exp; + else if (exp.enabled) return exp; } return this.externalResolver.getVariant(expName, context); }