diff --git a/packages/editor-ui/src/plugins/__tests__/telemetry.test.ts b/packages/editor-ui/src/plugins/__tests__/telemetry.test.ts new file mode 100644 index 0000000000..9693f86cbb --- /dev/null +++ b/packages/editor-ui/src/plugins/__tests__/telemetry.test.ts @@ -0,0 +1,140 @@ +import { SETTINGS_STORE_DEFAULT_STATE } from '@/__tests__/utils'; +import { Telemetry } from '@/plugins/telemetry'; +import { useSettingsStore } from '@/stores/settings.store'; +import merge from 'lodash-es/merge'; +import { createPinia, setActivePinia } from 'pinia'; + +let telemetry: Telemetry; + +let settingsStore: ReturnType; + +describe('telemetry', () => { + beforeAll(() => { + telemetry = new Telemetry(); + setActivePinia(createPinia()); + settingsStore = useSettingsStore(); + telemetry.init( + { enabled: true, config: { url: '', key: '' } }, + { versionCli: '1', instanceId: '1' }, + ); + }); + + describe('identify', () => { + it('Rudderstack identify method should be called when proving userId ', () => { + const identifyFunction = vi.spyOn(window.rudderanalytics, 'identify'); + + const userId = '1'; + const instanceId = '1'; + + settingsStore.setSettings( + merge({}, SETTINGS_STORE_DEFAULT_STATE.settings, { + deployment: { + type: '', + }, + }), + ); + + telemetry.identify(userId, instanceId); + expect(identifyFunction).toHaveBeenCalledTimes(1); + expect(identifyFunction).toHaveBeenCalledWith(`${instanceId}#${userId}`, { + instance_id: instanceId, + }); + }); + + it('Rudderstack identify method should be called when proving userId and versionCli ', () => { + const identifyFunction = vi.spyOn(window.rudderanalytics, 'identify'); + + const userId = '1'; + const instanceId = '1'; + const versionCli = '1'; + + settingsStore.setSettings( + merge({}, SETTINGS_STORE_DEFAULT_STATE.settings, { + deployment: { + type: '', + }, + }), + ); + + telemetry.identify(userId, instanceId, versionCli); + expect(identifyFunction).toHaveBeenCalledTimes(1); + expect(identifyFunction).toHaveBeenCalledWith(`${instanceId}#${userId}`, { + instance_id: instanceId, + version_cli: versionCli, + }); + }); + + it('Rudderstack identify method should be called when proving userId and deployment type is cloud ', () => { + const identifyFunction = vi.spyOn(window.rudderanalytics, 'identify'); + + const userId = '1'; + const instanceId = '1'; + const versionCli = '1'; + const userCloudId = '1'; + + settingsStore.setSettings( + merge({}, SETTINGS_STORE_DEFAULT_STATE.settings, { + n8nMetadata: { + userId: userCloudId, + }, + deployment: { + type: 'cloud', + }, + }), + ); + + telemetry.identify(userId, instanceId, versionCli); + expect(identifyFunction).toHaveBeenCalledTimes(1); + expect(identifyFunction).toHaveBeenCalledWith(`${instanceId}#${userId}`, { + instance_id: instanceId, + version_cli: versionCli, + user_cloud_id: userCloudId, + }); + }); + + it('Rudderstack identify method should be called when proving userId and deployment type is cloud', () => { + const identifyFunction = vi.spyOn(window.rudderanalytics, 'identify'); + + const userId = '1'; + const instanceId = '1'; + const versionCli = '1'; + const userCloudId = '1'; + + settingsStore.setSettings( + merge({}, SETTINGS_STORE_DEFAULT_STATE.settings, { + n8nMetadata: { + userId: userCloudId, + }, + deployment: { + type: 'cloud', + }, + }), + ); + + telemetry.identify(userId, instanceId, versionCli); + expect(identifyFunction).toHaveBeenCalledTimes(1); + expect(identifyFunction).toHaveBeenCalledWith(`${instanceId}#${userId}`, { + instance_id: instanceId, + version_cli: versionCli, + user_cloud_id: userCloudId, + }); + }); + + it('Rudderstack reset method should be called when proving userId and deployment type is cloud', () => { + const resetFunction = vi.spyOn(window.rudderanalytics, 'reset'); + + const instanceId = '1'; + + settingsStore.setSettings( + merge({}, SETTINGS_STORE_DEFAULT_STATE.settings, { + deployment: { + type: '', + }, + }), + ); + + telemetry.identify(instanceId); + expect(resetFunction).toHaveBeenCalledTimes(1); + }); + }); +}); diff --git a/packages/editor-ui/src/plugins/telemetry/index.ts b/packages/editor-ui/src/plugins/telemetry/index.ts index 69864d3ca0..78a4e0651d 100644 --- a/packages/editor-ui/src/plugins/telemetry/index.ts +++ b/packages/editor-ui/src/plugins/telemetry/index.ts @@ -74,7 +74,15 @@ export class Telemetry { } identify(instanceId: string, userId?: string, versionCli?: string) { - const traits = { instance_id: instanceId, version_cli: versionCli }; + const settingsStore = useSettingsStore(); + const traits: { instance_id: string; version_cli?: string; user_cloud_id?: string } = { + instance_id: instanceId, + version_cli: versionCli, + }; + + if (settingsStore.isCloudDeployment) { + traits.user_cloud_id = settingsStore.settings?.n8nMetadata?.userId ?? ''; + } if (userId) { this.rudderStack.identify(`${instanceId}#${userId}`, traits); } else { diff --git a/packages/workflow/src/Interfaces.ts b/packages/workflow/src/Interfaces.ts index 0505be1105..6e74abd776 100644 --- a/packages/workflow/src/Interfaces.ts +++ b/packages/workflow/src/Interfaces.ts @@ -2135,6 +2135,7 @@ export interface IN8nUISettings { urlBaseEditor: string; versionCli: string; n8nMetadata?: { + userId?: string; [key: string]: string | number | undefined; }; versionNotifications: IVersionNotificationSettings;