Skip to content

Commit 3b79e68

Browse files
committed
feat: make getPrecomputedConfiguration return Configuration instead of string
1 parent 9ee4834 commit 3b79e68

File tree

9 files changed

+109
-532
lines changed

9 files changed

+109
-532
lines changed

src/client/eppo-client-with-bandits.spec.ts

Lines changed: 13 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,12 @@ import { attributeEncodeBase64 } from '../obfuscation';
2626
import { Attributes, BanditActions, ContextAttributes } from '../types';
2727

2828
import EppoClient, { IAssignmentDetails } from './eppo-client';
29+
import { Configuration } from '../configuration';
30+
31+
const salt = base64.fromUint8Array(new Uint8Array([101, 112, 112, 111]));
32+
jest.mock('../salt', () => ({
33+
generateSalt: () => salt,
34+
}));
2935

3036
describe('EppoClient Bandits E2E test', () => {
3137
let client: EppoClient;
@@ -688,20 +694,12 @@ describe('EppoClient Bandits E2E test', () => {
688694
subjectKey: string,
689695
subjectAttributes: ContextAttributes,
690696
banditActions: Record<string, BanditActions>,
691-
): IPrecomputedConfiguration {
692-
const salt = base64.fromUint8Array(new Uint8Array([101, 112, 112, 111]));
693-
const precomputedResults = client.getPrecomputedConfiguration(
697+
): Configuration {
698+
return client.getPrecomputedConfiguration(
694699
subjectKey,
695700
subjectAttributes,
696701
banditActions,
697-
salt,
698702
);
699-
700-
const { precomputed } = JSON.parse(precomputedResults);
701-
if (!precomputed) {
702-
fail('precomputed result was not parsed');
703-
}
704-
return precomputed;
705703
}
706704

707705
describe('obfuscated results', () => {
@@ -713,11 +711,11 @@ describe('EppoClient Bandits E2E test', () => {
713711
const adidasB64 = 'YWRpZGFz';
714712
const modelB64 = 'MTIz'; // 123
715713

716-
const precomputed = getPrecomputedResults(client, bob, bobInfo, bobActions);
717-
718-
const response = JSON.parse(
719-
precomputed.response,
720-
) as IObfuscatedPrecomputedConfigurationResponse;
714+
const configuration = client.getPrecomputedConfiguration(bob, bobInfo, bobActions);
715+
const response = configuration.getPrecomputedConfiguration()?.response;
716+
if (!response) {
717+
fail('precomputed result was not parsed');
718+
}
721719

722720
const numericAttrs = response.bandits[bannerBanditFlagMd5]['actionNumericAttributes'];
723721
const categoricalAttrs =

src/client/eppo-client.spec.ts

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -41,8 +41,12 @@ import { ISyncStore } from '../configuration-store/configuration-store';
4141

4242
// Use a known salt to produce deterministic hashes
4343
const salt = base64.fromUint8Array(new Uint8Array([7, 53, 17, 78]));
44+
jest.mock('../salt', () => ({
45+
generateSalt: () => salt,
46+
}));
4447

4548
describe('EppoClient E2E test', () => {
49+
4650
// Configure fetch mock for tests that still need it
4751
global.fetch = jest.fn(() => {
4852
const ufc = readMockUFCResponse(MOCK_UFC_RESPONSE_FILE);
@@ -254,14 +258,12 @@ describe('EppoClient E2E test', () => {
254258
});
255259

256260
it('skips disabled flags', () => {
257-
const encodedPrecomputedWire = client.getPrecomputedConfiguration('subject', {}, {}, salt);
258-
const { precomputed } = JSON.parse(encodedPrecomputedWire) as IConfigurationWire;
261+
const configuration = client.getPrecomputedConfiguration('subject', {}, {});
262+
const precomputed = configuration.getPrecomputedConfiguration();
259263
if (!precomputed) {
260264
fail('Precomputed data not in Configuration response');
261265
}
262-
const precomputedResponse = JSON.parse(
263-
precomputed.response,
264-
) as ObfuscatedPrecomputedConfigurationResponse;
266+
const precomputedResponse = precomputed.response;
265267

266268
expect(precomputedResponse).toBeTruthy();
267269
const precomputedFlags = precomputedResponse?.flags ?? {};
@@ -273,14 +275,12 @@ describe('EppoClient E2E test', () => {
273275
});
274276

275277
it('evaluates and returns assignments', () => {
276-
const encodedPrecomputedWire = client.getPrecomputedConfiguration('subject', {}, {}, salt);
277-
const { precomputed } = JSON.parse(encodedPrecomputedWire) as IConfigurationWire;
278+
const configuration = client.getPrecomputedConfiguration('subject', {}, {});
279+
const precomputed = configuration.getPrecomputedConfiguration();
278280
if (!precomputed) {
279281
fail('Precomputed data not in Configuration response');
280282
}
281-
const precomputedResponse = JSON.parse(
282-
precomputed.response,
283-
) as IObfuscatedPrecomputedConfigurationResponse;
283+
const precomputedResponse = precomputed.response;
284284

285285
expect(precomputedResponse).toBeTruthy();
286286
const precomputedFlags = precomputedResponse?.flags ?? {};
@@ -291,12 +291,12 @@ describe('EppoClient E2E test', () => {
291291
});
292292

293293
it('obfuscates assignments', () => {
294-
const encodedPrecomputedWire = client.getPrecomputedConfiguration('subject', {}, {}, salt);
295-
const { precomputed } = JSON.parse(encodedPrecomputedWire) as IConfigurationWire;
294+
const configuration = client.getPrecomputedConfiguration('subject', {}, {});
295+
const precomputed = configuration.getPrecomputedConfiguration();
296296
if (!precomputed) {
297297
fail('Precomputed data not in Configuration response');
298298
}
299-
const precomputedResponse = JSON.parse(precomputed.response);
299+
const precomputedResponse = precomputed.response;
300300

301301
expect(precomputedResponse).toBeTruthy();
302302
expect(precomputedResponse.salt).toEqual('BzURTg==');

0 commit comments

Comments
 (0)