From fd84025bdfe30e8d730fa546d01c1ad6c6953189 Mon Sep 17 00:00:00 2001 From: Federico Bond Date: Tue, 26 Mar 2024 22:11:33 +1100 Subject: [PATCH] fix: return metadata for the bound provider in hookContext (#883) 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 c9bf0857..500d3d61 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 72eeccf0..902eba1c 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 6c3f9d83..d697c167 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', () => {