Skip to content

Commit

Permalink
fix: return metadata for the bound provider in hookContext (#883)
Browse files Browse the repository at this point in the history
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 <[email protected]>
  • Loading branch information
federicobond authored Mar 26, 2024
1 parent fc48677 commit fd84025
Show file tree
Hide file tree
Showing 4 changed files with 68 additions and 2 deletions.
2 changes: 1 addition & 1 deletion packages/client/src/client/open-feature-client.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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,
};
Expand Down
33 changes: 33 additions & 0 deletions packages/client/test/hooks.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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', () => {
Expand Down
2 changes: 1 addition & 1 deletion packages/server/src/client/open-feature-client.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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,
};
Expand Down
33 changes: 33 additions & 0 deletions packages/server/test/hooks.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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', () => {
Expand Down

0 comments on commit fd84025

Please sign in to comment.