Skip to content

Commit

Permalink
fix: push user id and device id changes to analytics connector (#342)
Browse files Browse the repository at this point in the history
* fix: push user id and device id changes to analytics connector

* test: add tests for analytics-connector

---------

Co-authored-by: Kevin Pagtakhan <kevinp@amplitude.com>
  • Loading branch information
bgiori and kevinpagtakhan authored Mar 3, 2023
1 parent cbcbf1b commit 3214b08
Show file tree
Hide file tree
Showing 6 changed files with 91 additions and 27 deletions.
4 changes: 4 additions & 0 deletions packages/analytics-browser/src/browser-client.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@ import {
isFormInteractionTrackingEnabled,
getCookieName,
getQueryParams,
setConnectorDeviceId,
setConnectorUserId,
} from '@amplitude/analytics-client-common';
import {
BrowserClient,
Expand Down Expand Up @@ -157,6 +159,7 @@ export class AmplitudeBrowser extends AmplitudeCore implements BrowserClient {
if (userId !== this.config.userId || userId === undefined) {
this.config.userId = userId;
this.setSessionId(Date.now());
setConnectorUserId(userId);
}
}

Expand All @@ -170,6 +173,7 @@ export class AmplitudeBrowser extends AmplitudeCore implements BrowserClient {
return;
}
this.config.deviceId = deviceId;
setConnectorDeviceId(deviceId);
}

reset() {
Expand Down
10 changes: 10 additions & 0 deletions packages/analytics-client-common/src/analytics-connector.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,3 +3,13 @@ import { AnalyticsConnector } from '@amplitude/analytics-connector';
export const getAnalyticsConnector = (): AnalyticsConnector => {
return AnalyticsConnector.getInstance('$default_instance');
};

export const setConnectorUserId = (userId: string | undefined): void => {
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-ignore
getAnalyticsConnector().identityStore.editIdentity().setUserId(userId).commit();
};

export const setConnectorDeviceId = (deviceId: string): void => {
getAnalyticsConnector().identityStore.editIdentity().setDeviceId(deviceId).commit();
};
2 changes: 1 addition & 1 deletion packages/analytics-client-common/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ export { getQueryParams } from './query-params';
export { getCookieName, getOldCookieName } from './cookie-name';
export { CookieStorage } from './storage/cookie';
export { FetchTransport } from './transports/fetch';
export { getAnalyticsConnector } from './analytics-connector';
export { getAnalyticsConnector, setConnectorDeviceId, setConnectorUserId } from './analytics-connector';
export { IdentityEventSender } from './plugins/identity';
export { getLanguage } from './language';
export { BASE_CAMPAIGN } from './attribution/constants';
Expand Down
67 changes: 67 additions & 0 deletions packages/analytics-client-common/test/analytics-connector.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
import { AnalyticsConnector } from '@amplitude/analytics-connector';
import { getAnalyticsConnector, setConnectorDeviceId, setConnectorUserId } from '../src/analytics-connector';

describe('analytics-connector', () => {
describe('getAnalyticsConnector', () => {
test('should return connector instance', () => {
const instance = new AnalyticsConnector();
const getInstance = jest.spyOn(AnalyticsConnector, 'getInstance').mockReturnValueOnce(instance);
expect(getAnalyticsConnector()).toBe(instance);
expect(getInstance).toHaveBeenCalledTimes(1);
});
});

describe('setConnectorUserId', () => {
test('should return connector instance', () => {
const commit = jest.fn();
const identityEditor = {
setUserId: function () {
return this;
},
setDeviceId: function () {
return this;
},
setUserProperties: function () {
return this;
},
updateUserProperties: function () {
return this;
},
commit,
};
const instance = new AnalyticsConnector();
jest.spyOn(instance.identityStore, 'editIdentity').mockReturnValueOnce(identityEditor);
const getInstance = jest.spyOn(AnalyticsConnector, 'getInstance').mockReturnValueOnce(instance);
expect(setConnectorUserId('123')).toBe(undefined);
expect(getInstance).toHaveBeenCalledTimes(1);
expect(commit).toHaveBeenCalledTimes(1);
});
});

describe('setConnectorDeviceId', () => {
test('should return connector instance', () => {
const commit = jest.fn();
const identityEditor = {
setUserId: function () {
return this;
},
setDeviceId: function () {
return this;
},
setUserProperties: function () {
return this;
},
updateUserProperties: function () {
return this;
},
commit,
};
const instance = new AnalyticsConnector();
jest.spyOn(instance.identityStore, 'editIdentity').mockReturnValueOnce(identityEditor);
const getInstance = jest.spyOn(AnalyticsConnector, 'getInstance').mockReturnValueOnce(instance);
expect(setConnectorDeviceId('123')).toBe(undefined);
expect(getInstance).toHaveBeenCalledTimes(1);
expect(commit).toHaveBeenCalledTimes(1);
});
});
});
13 changes: 0 additions & 13 deletions packages/analytics-client-common/test/analytics-connector.ts

This file was deleted.

22 changes: 9 additions & 13 deletions packages/analytics-react-native/src/react-native-client.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,13 @@ import {
getClientLogConfig,
getClientStates,
} from '@amplitude/analytics-core';
import { CampaignTracker, IdentityEventSender, getAnalyticsConnector } from '@amplitude/analytics-client-common';
import {
CampaignTracker,
IdentityEventSender,
getAnalyticsConnector,
setConnectorDeviceId,
setConnectorUserId,
} from '@amplitude/analytics-client-common';
import {
ReactNativeConfig,
Campaign,
Expand Down Expand Up @@ -130,12 +136,7 @@ export class AmplitudeReactNative extends AmplitudeCore {
return;
}
this.config.userId = userId;
getAnalyticsConnector()
.identityStore.editIdentity()
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-ignore
.setUserId(userId)
.commit();
setConnectorUserId(userId);
}

getDeviceId() {
Expand All @@ -148,12 +149,7 @@ export class AmplitudeReactNative extends AmplitudeCore {
return;
}
this.config.deviceId = deviceId;
getAnalyticsConnector()
.identityStore.editIdentity()
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-ignore
.setDeviceId(deviceId)
.commit();
setConnectorDeviceId(deviceId);
}

identify(identify: IIdentify, eventOptions?: EventOptions) {
Expand Down

0 comments on commit 3214b08

Please sign in to comment.