Skip to content

Commit 9adfcba

Browse files
committed
Mixpanel analytics should not be a class
1 parent b738e5d commit 9adfcba

File tree

4 files changed

+49
-46
lines changed

4 files changed

+49
-46
lines changed

src/mixpanelAnalytics.test.ts

Lines changed: 19 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,23 @@
11
import Assignment from './assignment';
2-
import MixpanelAnalytics from './mixpanelAnalytics';
2+
import { mixpanelAnalytics } from './mixpanelAnalytics';
33

4-
describe('MixpanelAnalytics', () => {
4+
const mixpanel = {
5+
track: vi.fn(),
6+
alias: vi.fn(),
7+
identify: vi.fn()
8+
};
9+
10+
describe('mixpanelAnalytics', () => {
511
beforeEach(() => {
6-
window.mixpanel = {
7-
track: vi.fn(),
8-
alias: vi.fn(),
9-
identify: vi.fn()
10-
};
12+
window.mixpanel = mixpanel;
1113
});
1214

1315
afterEach(() => {
14-
// @ts-expect-error Cleaning up test property
1516
delete window.mixpanel;
1617
});
1718

1819
describe('#trackAssignment()', () => {
19-
it('calls window.mixpanel.track()', () => {
20-
const mixpanelAnalytics = new MixpanelAnalytics();
20+
it('calls mixpanel.track()', () => {
2121
const assignment = new Assignment({
2222
splitName: 'jabba',
2323
variant: 'cgi',
@@ -26,8 +26,8 @@ describe('MixpanelAnalytics', () => {
2626
});
2727

2828
mixpanelAnalytics.trackAssignment('visitor_id', assignment, () => {
29-
expect(window.mixpanel.track).toHaveBeenCalled();
30-
expect(window.mixpanel.track).toHaveBeenCalledWith(
29+
expect(mixpanel.track).toHaveBeenCalled();
30+
expect(mixpanel.track).toHaveBeenCalledWith(
3131
'SplitAssigned',
3232
{
3333
TTVisitorID: 'visitor_id',
@@ -40,27 +40,25 @@ describe('MixpanelAnalytics', () => {
4040
});
4141

4242
// call success
43-
vi.mocked(window.mixpanel.track).mock.calls[0][2](true);
43+
vi.mocked(mixpanel.track).mock.calls[0][2](true);
4444
});
4545
});
4646

4747
describe('#alias()', () => {
48-
it('calls window.mixpanel.alias()', () => {
49-
const mixpanelAnalytics = new MixpanelAnalytics();
48+
it('calls mixpanel.alias()', () => {
5049
mixpanelAnalytics.alias('id');
5150

52-
expect(window.mixpanel.alias).toHaveBeenCalled();
53-
expect(window.mixpanel.alias).toHaveBeenCalledWith('id');
51+
expect(mixpanel.alias).toHaveBeenCalled();
52+
expect(mixpanel.alias).toHaveBeenCalledWith('id');
5453
});
5554
});
5655

5756
describe('#identify()', () => {
58-
it('calls window.mixpanel.identify()', () => {
59-
const mixpanelAnalytics = new MixpanelAnalytics();
57+
it('calls mixpanel.identify()', () => {
6058
mixpanelAnalytics.identify('id');
6159

62-
expect(window.mixpanel.identify).toHaveBeenCalled();
63-
expect(window.mixpanel.identify).toHaveBeenCalledWith('id');
60+
expect(mixpanel.identify).toHaveBeenCalled();
61+
expect(mixpanel.identify).toHaveBeenCalledWith('id');
6462
});
6563
});
6664
});

src/mixpanelAnalytics.ts

Lines changed: 9 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
import Assignment from './assignment';
21
import type { AnalyticsProvider } from './analyticsProvider';
32

43
type EventProperties = {
@@ -10,38 +9,29 @@ type EventProperties = {
109

1110
declare global {
1211
interface Window {
13-
mixpanel: {
12+
mixpanel?: {
1413
track(eventName: string, properties: EventProperties, callback: (value: boolean) => void): void;
1514
identify(id: string): void;
1615
alias(id: string): void;
1716
};
1817
}
1918
}
2019

21-
class MixpanelAnalytics implements AnalyticsProvider {
22-
trackAssignment(visitorId: string, assignment: Assignment, callback: (value: boolean) => void) {
20+
export const mixpanelAnalytics: AnalyticsProvider = {
21+
trackAssignment(visitorId, assignment, callback) {
2322
const assignmentProperties = {
2423
TTVisitorID: visitorId,
2524
SplitName: assignment.getSplitName(),
2625
SplitVariant: assignment.getVariant(),
2726
SplitContext: assignment.getContext()
2827
};
2928

30-
if (window.mixpanel) {
31-
window.mixpanel.track('SplitAssigned', assignmentProperties, callback);
32-
}
33-
}
34-
29+
window.mixpanel?.track('SplitAssigned', assignmentProperties, callback);
30+
},
3531
identify(visitorId: string) {
36-
if (window.mixpanel) {
37-
window.mixpanel.identify(visitorId);
38-
}
39-
}
40-
32+
window.mixpanel?.identify(visitorId);
33+
},
4134
alias(visitorId: string) {
42-
if (window.mixpanel) {
43-
window.mixpanel.alias(visitorId);
44-
}
35+
window.mixpanel?.alias(visitorId);
4536
}
46-
}
47-
export default MixpanelAnalytics;
37+
};

src/visitor.test.ts

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,15 @@
11
import Assignment from './assignment';
22
import { sendAssignmentNotification } from './assignmentNotification';
33
import { saveIdentifier } from './identifier';
4-
import MixpanelAnalytics from './mixpanelAnalytics';
4+
import { mixpanelAnalytics } from './mixpanelAnalytics';
55
import type { Config } from './config';
66
import { calculateVariant } from './calculateVariant';
77
import Visitor from './visitor';
88
import { v4 as uuid } from 'uuid';
99
import { createConfig } from './test-utils';
1010
import { http, HttpResponse } from 'msw';
1111
import { server, requests } from './setupTests';
12+
import type { AnalyticsProvider } from './analyticsProvider';
1213

1314
vi.mock('uuid');
1415
vi.mock('./calculateVariant');
@@ -643,11 +644,24 @@ describe('Visitor', () => {
643644
});
644645
});
645646

647+
describe('.analytics', () => {
648+
it('defaults to mixpanel analytics', () => {
649+
const config = setupConfig();
650+
const visitor = createVisitor(config);
651+
652+
expect(visitor.analytics).toBe(mixpanelAnalytics);
653+
});
654+
});
655+
646656
describe('#setAnalytics()', () => {
647657
it('sets the analytics object on the visitor', () => {
648658
const config = setupConfig();
649659
const visitor = createVisitor(config);
650-
const analytics = new MixpanelAnalytics();
660+
const analytics: AnalyticsProvider = {
661+
trackAssignment: vi.fn(),
662+
alias: vi.fn(),
663+
identify: vi.fn()
664+
};
651665

652666
visitor.setAnalytics(analytics);
653667

src/visitor.ts

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,12 @@ import { getABVariants } from './abConfiguration';
33
import Assignment from './assignment';
44
import { sendAssignmentNotification } from './assignmentNotification';
55
import { saveIdentifier } from './identifier';
6-
import MixpanelAnalytics from './mixpanelAnalytics';
6+
import { mixpanelAnalytics } from './mixpanelAnalytics';
77
import { v4 as uuid } from 'uuid';
88
import { calculateVariant } from './calculateVariant';
99
import { vary, type Variants } from './vary';
1010
import type { Config } from './config';
11+
import type { AnalyticsProvider } from './analyticsProvider';
1112

1213
export type VaryOptions = {
1314
variants: Variants;
@@ -85,7 +86,7 @@ class Visitor {
8586
private _errorLogger: (errorMessage: string) => void;
8687
private _assignmentRegistry?: AssignmentRegistry | null;
8788

88-
public analytics: MixpanelAnalytics;
89+
public analytics: AnalyticsProvider;
8990

9091
constructor({ config, id, assignments, ttOffline }: VisitorOptions) {
9192
this.config = config;
@@ -97,7 +98,7 @@ class Visitor {
9798
window.console.error(errorMessage);
9899
};
99100

100-
this.analytics = new MixpanelAnalytics();
101+
this.analytics = mixpanelAnalytics;
101102
}
102103

103104
getId() {
@@ -181,7 +182,7 @@ class Visitor {
181182
this.notifyUnsyncedAssignments();
182183
}
183184

184-
setAnalytics(analytics: MixpanelAnalytics) {
185+
setAnalytics(analytics: AnalyticsProvider) {
185186
this.analytics = analytics;
186187
}
187188

0 commit comments

Comments
 (0)