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 <federicobond@gmail.com>
This commit is contained in:
Federico Bond 2024-03-26 22:11:33 +11:00 committed by GitHub
parent fc4867799d
commit fd84025bdf
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 68 additions and 2 deletions

View File

@ -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,
};

View File

@ -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<ResolutionDetails<boolean>> => {
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', () => {

View File

@ -254,7 +254,7 @@ export class OpenFeatureClient implements Client, ManageContext<OpenFeatureClien
defaultValue,
flagValueType: flagType,
clientMetadata: this.metadata,
providerMetadata: OpenFeature.providerMetadata,
providerMetadata: this._provider.metadata,
context: mergedContext,
logger: this._logger,
};

View File

@ -73,6 +73,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<ResolutionDetails<boolean>> => {
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', () => {