Skip to content

Commit a6ac8c6

Browse files
committed
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 <federicobond@gmail.com>
1 parent fc48677 commit a6ac8c6

File tree

4 files changed

+68
-2
lines changed

4 files changed

+68
-2
lines changed

packages/client/src/client/open-feature-client.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -201,7 +201,7 @@ export class OpenFeatureClient implements Client {
201201
defaultValue,
202202
flagValueType: flagType,
203203
clientMetadata: this.metadata,
204-
providerMetadata: OpenFeature.providerMetadata,
204+
providerMetadata: this._provider.metadata,
205205
context,
206206
logger: this._logger,
207207
};

packages/client/test/hooks.spec.ts

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,39 @@ describe('Hooks', () => {
7777
],
7878
});
7979
});
80+
it('client metadata and provider metadata must match the client and provider used to resolve the flag', (done) => {
81+
const provider: Provider = {
82+
metadata: {
83+
name: 'mock-my-domain-provider',
84+
},
85+
resolveBooleanEvaluation: jest.fn((): Promise<ResolutionDetails<boolean>> => {
86+
return Promise.resolve({
87+
value: BOOLEAN_VALUE,
88+
variant: BOOLEAN_VARIANT,
89+
reason: REASON,
90+
});
91+
}),
92+
} as unknown as Provider;
93+
94+
OpenFeature.setProvider('my-domain', provider);
95+
const client = OpenFeature.getClient('my-domain');
96+
97+
client.getBooleanValue(FLAG_KEY, false, {
98+
hooks: [
99+
{
100+
before: (hookContext) => {
101+
try {
102+
expect(hookContext.providerMetadata).toEqual(provider.metadata);
103+
expect(hookContext.clientMetadata).toEqual(client.metadata);
104+
done();
105+
} catch (err) {
106+
done(err);
107+
}
108+
},
109+
},
110+
],
111+
});
112+
});
80113
});
81114

82115
describe('Requirement 4.1.3', () => {

packages/server/src/client/open-feature-client.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -254,7 +254,7 @@ export class OpenFeatureClient implements Client, ManageContext<OpenFeatureClien
254254
defaultValue,
255255
flagValueType: flagType,
256256
clientMetadata: this.metadata,
257-
providerMetadata: OpenFeature.providerMetadata,
257+
providerMetadata: this._provider.metadata,
258258
context: mergedContext,
259259
logger: this._logger,
260260
};

packages/server/test/hooks.spec.ts

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,39 @@ describe('Hooks', () => {
7373
],
7474
});
7575
});
76+
it('client metadata and provider metadata must match the client and provider used to resolve the flag', (done) => {
77+
const provider: Provider = {
78+
metadata: {
79+
name: 'mock-my-domain-provider',
80+
},
81+
resolveBooleanEvaluation: jest.fn((): Promise<ResolutionDetails<boolean>> => {
82+
return Promise.resolve({
83+
value: BOOLEAN_VALUE,
84+
variant: BOOLEAN_VARIANT,
85+
reason: REASON,
86+
});
87+
}),
88+
} as unknown as Provider;
89+
90+
OpenFeature.setProvider('my-domain', provider);
91+
const client = OpenFeature.getClient('my-domain');
92+
93+
client.getBooleanValue(FLAG_KEY, false, undefined, {
94+
hooks: [
95+
{
96+
before: (hookContext) => {
97+
try {
98+
expect(hookContext.providerMetadata).toEqual(provider.metadata);
99+
expect(hookContext.clientMetadata).toEqual(client.metadata);
100+
done();
101+
} catch (err) {
102+
done(err);
103+
}
104+
},
105+
},
106+
],
107+
});
108+
});
76109
});
77110

78111
describe('Requirement 4.1.3', () => {

0 commit comments

Comments
 (0)