Skip to content

Commit fef53e5

Browse files
authored
feat: track impressions for web experiments (#127)
1 parent a6570eb commit fef53e5

File tree

3 files changed

+67
-23
lines changed

3 files changed

+67
-23
lines changed

packages/experiment-browser/src/integration/manager.ts

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -96,11 +96,30 @@ export class IntegrationManager {
9696
*/
9797
track(exposure: Exposure): void {
9898
if (this.cache.shouldTrack(exposure)) {
99-
this.queue.push({
100-
eventType: '$exposure',
99+
const event = this.getExposureEvent(exposure);
100+
this.queue.push(event);
101+
}
102+
}
103+
104+
private getExposureEvent(exposure: Exposure): ExperimentEvent {
105+
let event: ExperimentEvent = {
106+
eventType: '$exposure',
107+
eventProperties: exposure,
108+
};
109+
if (exposure.metadata?.exposureEvent) {
110+
// Metadata specifically passes the exposure event definition
111+
event = {
112+
eventType: exposure.metadata?.exposureEvent as string,
113+
eventProperties: exposure,
114+
};
115+
} else if (exposure.metadata?.deliveryMethod === 'web') {
116+
// Web experiments track impression events by default
117+
event = {
118+
eventType: '$impression',
101119
eventProperties: exposure,
102-
});
120+
};
103121
}
122+
return event;
104123
}
105124
}
106125

packages/experiment-browser/test/client.test.ts

Lines changed: 24 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -676,26 +676,30 @@ describe('variant fallbacks', () => {
676676
expect(spy.mock.calls[0][0].variant).toBeUndefined();
677677
});
678678

679-
test('default variant returned when no other fallback is provided', async () => {
680-
const user = {};
681-
const exposureTrackingProvider = new TestExposureTrackingProvider();
682-
const spy = jest.spyOn(exposureTrackingProvider, 'track');
683-
const client = new ExperimentClient(API_KEY, {
684-
exposureTrackingProvider: exposureTrackingProvider,
685-
source: Source.LocalStorage,
686-
fetchOnStart: true,
687-
});
688-
mockClientStorage(client);
689-
// Start and fetch
690-
await client.start(user);
691-
const variant = client.variant('sdk-ci-test');
692-
expect(variant.key).toEqual('off');
693-
expect(variant.value).toBeUndefined();
694-
expect(variant.metadata?.default).toEqual(true);
695-
expect(spy).toHaveBeenCalledTimes(1);
696-
expect(spy.mock.calls[0][0].flag_key).toEqual('sdk-ci-test');
697-
expect(spy.mock.calls[0][0].variant).toBeUndefined();
698-
});
679+
test(
680+
'default variant returned when no other fallback is provided',
681+
async () => {
682+
const user = {};
683+
const exposureTrackingProvider = new TestExposureTrackingProvider();
684+
const spy = jest.spyOn(exposureTrackingProvider, 'track');
685+
const client = new ExperimentClient(API_KEY, {
686+
exposureTrackingProvider: exposureTrackingProvider,
687+
source: Source.LocalStorage,
688+
fetchOnStart: true,
689+
});
690+
mockClientStorage(client);
691+
// Start and fetch
692+
await client.start(user);
693+
const variant = client.variant('sdk-ci-test');
694+
expect(variant.key).toEqual('off');
695+
expect(variant.value).toBeUndefined();
696+
expect(variant.metadata?.default).toEqual(true);
697+
expect(spy).toHaveBeenCalledTimes(1);
698+
expect(spy.mock.calls[0][0].flag_key).toEqual('sdk-ci-test');
699+
expect(spy.mock.calls[0][0].variant).toBeUndefined();
700+
},
701+
10 * 1000,
702+
);
699703
});
700704

701705
describe('initial variants source', () => {

packages/experiment-browser/test/integration/manager.test.ts

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -178,6 +178,27 @@ describe('IntegrationManager', () => {
178178
},
179179
});
180180
});
181+
test('web exposure tracked as impression', () => {
182+
manager.track({
183+
flag_key: 'flag-key',
184+
variant: 'treatment',
185+
experiment_key: 'exp-1',
186+
metadata: {
187+
deliveryMethod: 'web',
188+
},
189+
});
190+
expect(manager['queue']['inMemoryQueue'][0]).toEqual({
191+
eventType: '$impression',
192+
eventProperties: {
193+
flag_key: 'flag-key',
194+
variant: 'treatment',
195+
experiment_key: 'exp-1',
196+
metadata: {
197+
deliveryMethod: 'web',
198+
},
199+
},
200+
});
201+
});
181202
});
182203
});
183204

0 commit comments

Comments
 (0)