From a6ac8c657e659dc0f5a454edd221e201e83de6fc Mon Sep 17 00:00:00 2001 From: Federico Bond Date: Mon, 25 Mar 2024 09:55:02 +1100 Subject: [PATCH] fix: return metadata for the bound provider in hookContext Clients were incorrectly populating the hook context provider metadata field with metadata from the default provider instead of the one bound to the client. Signed-off-by: Federico Bond --- .../client/src/client/open-feature-client.ts | 2 +- packages/client/test/hooks.spec.ts | 33 +++++++++++++++++++ .../server/src/client/open-feature-client.ts | 2 +- packages/server/test/hooks.spec.ts | 33 +++++++++++++++++++ 4 files changed, 68 insertions(+), 2 deletions(-) diff --git a/packages/client/src/client/open-feature-client.ts b/packages/client/src/client/open-feature-client.ts index c9bf08575..500d3d614 100644 --- a/packages/client/src/client/open-feature-client.ts +++ b/packages/client/src/client/open-feature-client.ts @@ -201,7 +201,7 @@ export class OpenFeatureClient implements Client { defaultValue, flagValueType: flagType, clientMetadata: this.metadata, - providerMetadata: OpenFeature.providerMetadata, + providerMetadata: this._provider.metadata, context, logger: this._logger, }; diff --git a/packages/client/test/hooks.spec.ts b/packages/client/test/hooks.spec.ts index 72eeccf0a..902eba1c7 100644 --- a/packages/client/test/hooks.spec.ts +++ b/packages/client/test/hooks.spec.ts @@ -77,6 +77,39 @@ describe('Hooks', () => { ], }); }); + it('client metadata and provider metadata must match the client and provider used to resolve the flag', (done) => { + const provider: Provider = { + metadata: { + name: 'mock-my-domain-provider', + }, + resolveBooleanEvaluation: jest.fn((): Promise> => { + return Promise.resolve({ + value: BOOLEAN_VALUE, + variant: BOOLEAN_VARIANT, + reason: REASON, + }); + }), + } as unknown as Provider; + + OpenFeature.setProvider('my-domain', provider); + const client = OpenFeature.getClient('my-domain'); + + client.getBooleanValue(FLAG_KEY, false, { + hooks: [ + { + before: (hookContext) => { + try { + expect(hookContext.providerMetadata).toEqual(provider.metadata); + expect(hookContext.clientMetadata).toEqual(client.metadata); + done(); + } catch (err) { + done(err); + } + }, + }, + ], + }); + }); }); describe('Requirement 4.1.3', () => { diff --git a/packages/server/src/client/open-feature-client.ts b/packages/server/src/client/open-feature-client.ts index 6c3f9d835..d697c1672 100644 --- a/packages/server/src/client/open-feature-client.ts +++ b/packages/server/src/client/open-feature-client.ts @@ -254,7 +254,7 @@ export class OpenFeatureClient implements Client, ManageContext { ], }); }); + it('client metadata and provider metadata must match the client and provider used to resolve the flag', (done) => { + const provider: Provider = { + metadata: { + name: 'mock-my-domain-provider', + }, + resolveBooleanEvaluation: jest.fn((): Promise> => { + return Promise.resolve({ + value: BOOLEAN_VALUE, + variant: BOOLEAN_VARIANT, + reason: REASON, + }); + }), + } as unknown as Provider; + + OpenFeature.setProvider('my-domain', provider); + const client = OpenFeature.getClient('my-domain'); + + client.getBooleanValue(FLAG_KEY, false, undefined, { + hooks: [ + { + before: (hookContext) => { + try { + expect(hookContext.providerMetadata).toEqual(provider.metadata); + expect(hookContext.clientMetadata).toEqual(client.metadata); + done(); + } catch (err) { + done(err); + } + }, + }, + ], + }); + }); }); describe('Requirement 4.1.3', () => {