From 7339339bc88bdd3de3b1ccd982082e818853b900 Mon Sep 17 00:00:00 2001 From: Darshan Parmar Date: Fri, 18 Oct 2024 12:16:50 +0530 Subject: [PATCH 1/8] prettify code --- src/authorization/authorization.ts | 90 ++++++++++++++++++++---------- 1 file changed, 61 insertions(+), 29 deletions(-) diff --git a/src/authorization/authorization.ts b/src/authorization/authorization.ts index f2d31000..b23fb56f 100644 --- a/src/authorization/authorization.ts +++ b/src/authorization/authorization.ts @@ -106,7 +106,7 @@ const getAnonUserId = () => { const initializeUserId = (userId: string) => { addUserIdToRequest(userId); clearAnonymousUser(); -} +}; const addUserIdToRequest = (userId: string) => { setTypeOfAuth('userID'); @@ -206,7 +206,7 @@ const addUserIdToRequest = (userId: string) => { const initializeEmailUser = (email: string) => { addEmailToRequest(email); clearAnonymousUser(); -} +}; const syncEvents = () => { if (config.getConfig('enableAnonTracking')) { @@ -463,12 +463,20 @@ export function initialize( baseAxiosRequest.interceptors.request.eject(authInterceptor); } }, - setEmail: async (email: string, identityResolution?: IdentityResolution) => { + setEmail: async ( + email: string, + identityResolution?: IdentityResolution + ) => { clearMessages(); try { - const identityResolutionConfig = config.getConfig('identityResolution'); - const merge = identityResolution?.mergeOnAnonymousToKnown || identityResolutionConfig?.mergeOnAnonymousToKnown; - const replay = identityResolution?.replayOnVisitorToKnown || identityResolutionConfig?.replayOnVisitorToKnown; + const identityResolutionConfig = + config.getConfig('identityResolution'); + const merge = + identityResolution?.mergeOnAnonymousToKnown || + identityResolutionConfig?.mergeOnAnonymousToKnown; + const replay = + identityResolution?.replayOnVisitorToKnown || + identityResolutionConfig?.replayOnVisitorToKnown; const result = await tryMergeUser(email, true, merge); if (result) { @@ -483,12 +491,20 @@ export function initialize( return Promise.reject(`merging failed: ${error}`); } }, - setUserID: async (userId: string, identityResolution?: IdentityResolution) => { + setUserID: async ( + userId: string, + identityResolution?: IdentityResolution + ) => { clearMessages(); try { - const identityResolutionConfig = config.getConfig('identityResolution'); - const merge = identityResolution?.mergeOnAnonymousToKnown || identityResolutionConfig?.mergeOnAnonymousToKnown; - const replay = identityResolution?.replayOnVisitorToKnown || identityResolutionConfig?.replayOnVisitorToKnown; + const identityResolutionConfig = + config.getConfig('identityResolution'); + const merge = + identityResolution?.mergeOnAnonymousToKnown || + identityResolutionConfig?.mergeOnAnonymousToKnown; + const replay = + identityResolution?.replayOnVisitorToKnown || + identityResolutionConfig?.replayOnVisitorToKnown; const result = await tryMergeUser(userId, false, merge); if (result) { @@ -807,31 +823,40 @@ export function initialize( /* this will just clear the existing timeout */ handleTokenExpiration(''); }, - setEmail: async (email: string, identityResolution?: IdentityResolution) => { + setEmail: async ( + email: string, + identityResolution?: IdentityResolution + ) => { /* clear previous user */ clearMessages(); try { const identityResolutionConfig = config.getConfig('identityResolution'); - const merge = identityResolution?.mergeOnAnonymousToKnown || identityResolutionConfig?.mergeOnAnonymousToKnown; - const replay = identityResolution?.replayOnVisitorToKnown || identityResolutionConfig?.replayOnVisitorToKnown; + const merge = + identityResolution?.mergeOnAnonymousToKnown || + identityResolutionConfig?.mergeOnAnonymousToKnown; + const replay = + identityResolution?.replayOnVisitorToKnown || + identityResolutionConfig?.replayOnVisitorToKnown; const result = await tryMergeUser(email, true, merge); if (result) { initializeEmailUser(email); try { - return doRequest({ email }).then((token) => { - if (replay) { - syncEvents(); - } - return token; - }).catch((e) => { - if (logLevel === 'verbose') { - console.warn( - 'Could not generate JWT after calling setEmail. Please try calling setEmail again.' - ); - } - return Promise.reject(e); - }); + return doRequest({ email }) + .then((token) => { + if (replay) { + syncEvents(); + } + return token; + }) + .catch((e) => { + if (logLevel === 'verbose') { + console.warn( + 'Could not generate JWT after calling setEmail. Please try calling setEmail again.' + ); + } + return Promise.reject(e); + }); } catch (e) { /* failed to create a new user. Just silently resolve */ return Promise.resolve(); @@ -842,12 +867,19 @@ export function initialize( return Promise.reject(`merging failed: ${error}`); } }, - setUserID: async (userId: string, identityResolution?: IdentityResolution) => { + setUserID: async ( + userId: string, + identityResolution?: IdentityResolution + ) => { clearMessages(); try { const identityResolutionConfig = config.getConfig('identityResolution'); - const merge = identityResolution?.mergeOnAnonymousToKnown || identityResolutionConfig?.mergeOnAnonymousToKnown; - const replay = identityResolution?.replayOnVisitorToKnown || identityResolutionConfig?.replayOnVisitorToKnown; + const merge = + identityResolution?.mergeOnAnonymousToKnown || + identityResolutionConfig?.mergeOnAnonymousToKnown; + const replay = + identityResolution?.replayOnVisitorToKnown || + identityResolutionConfig?.replayOnVisitorToKnown; const result = await tryMergeUser(userId, false, merge); if (result) { From 4546fb6a7a3f153f5fd452287c185da0f4e6ce85 Mon Sep 17 00:00:00 2001 From: Darshan Parmar Date: Fri, 18 Oct 2024 17:44:10 +0530 Subject: [PATCH 2/8] [MOB-9703] Added support for fetching new JWT prior to calling merge --- .../tests/userMergeScenarios.test.ts | 111 +++++++++++++++++- src/authorization/authorization.ts | 76 ++++++------ 2 files changed, 148 insertions(+), 39 deletions(-) diff --git a/src/anonymousUserTracking/tests/userMergeScenarios.test.ts b/src/anonymousUserTracking/tests/userMergeScenarios.test.ts index 6d15ad4a..418a1423 100644 --- a/src/anonymousUserTracking/tests/userMergeScenarios.test.ts +++ b/src/anonymousUserTracking/tests/userMergeScenarios.test.ts @@ -1,5 +1,5 @@ import MockAdapter from 'axios-mock-adapter'; -import { initializeWithConfig } from '../../authorization'; +import { GenerateJWTPayload, initializeWithConfig } from '../../authorization'; import { SHARED_PREFS_EVENT_LIST_KEY, SHARED_PREFS_CRITERIA, @@ -55,6 +55,11 @@ declare global { const mockRequest = new MockAdapter(baseAxiosRequest); // const mockOnPostSpy = jest.spyOn(mockRequest, 'onPost'); +const MOCK_JWT_KEY = + 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJleHAiOjE2MzA2MTc3MzQsImlhdCI6MTYzMDYxNzQzNCwiZW1haWwiOiJ3aWR0aC50ZXN0ZXJAZ21haWwuY29tIn0.knLmbgO8kKM9CHP2TH2v85OSC2Jorh2JjRm76FFsPQc'; +const MOCK_JWT_KEY_WITH_ONE_MINUTE_EXPIRY = + 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJlbWFpbCI6InRlc3RAdGVzdC5jb20iLCJleHAiOjE2Nzk0ODMyOTEsImlhdCI6MTY3OTQ4MzIzMX0.APaQAYy-lTE0o8rbR6b6-28eCICq36SQMBXmeZAvk1k'; + describe('UserMergeScenariosTests', () => { beforeAll(() => { (global as any).localStorage = localStorageMock; @@ -439,6 +444,55 @@ describe('UserMergeScenariosTests', () => { expect(mergePostRequestData).toBeDefined(); // ensure that merge API gets called }); + it('merge api called with destination userID JWT Authorization', async () => { + const { setUserID, logout } = initializeWithConfig({ + authToken: '123', + configOptions: { + enableAnonTracking: true, + identityResolution: { + replayOnVisitorToKnown: true, + mergeOnAnonymousToKnown: true + } + }, + generateJWT: (payload: GenerateJWTPayload) => { + if (payload.userID === 'testuseranotheruser') { + return Promise.resolve(MOCK_JWT_KEY_WITH_ONE_MINUTE_EXPIRY); + } + return Promise.resolve(MOCK_JWT_KEY); + } + }); + logout(); // logout to remove logged in users before this test + await setUserID('testuser123'); + const response = await getInAppMessages({ + count: 10, + packageName: 'my-lil-website' + }); + expect(response.config.headers.Authorization).toBe( + `Bearer ${MOCK_JWT_KEY}` + ); + expect(response.config.params.userId).toBe('testuser123'); + expect(localStorageMock.setItem).not.toHaveBeenCalledWith( + SHARED_PREF_ANON_USER_ID + ); + await setUserID('testuseranotheruser'); + const secondResponse = await getInAppMessages({ + count: 10, + packageName: 'my-lil-website' + }); + expect(secondResponse.config.headers.Authorization).toBe( + `Bearer ${MOCK_JWT_KEY_WITH_ONE_MINUTE_EXPIRY}` + ); + expect(secondResponse.config.params.userId).toBe('testuseranotheruser'); + const mergePostRequestData = mockRequest.history.post.find( + (req) => req.url === ENDPOINT_MERGE_USER + ); + expect(mergePostRequestData?.headers?.Authorization).toBe( + `Bearer ${MOCK_JWT_KEY_WITH_ONE_MINUTE_EXPIRY}` + ); + expect(mergePostRequestData).toBeDefined(); // ensure that merge API gets called + logout(); // logout to remove logged in users after this test + }); + it('current user identified with setUserId merge default', async () => { const { setUserID, logout } = initializeWithConfig({ authToken: '123', @@ -813,5 +867,60 @@ describe('UserMergeScenariosTests', () => { ); expect(mergePostRequestData).toBeUndefined(); // ensure that merge API Do NOT get called }); + + it('merge api called with destination email JWT Authorization', async () => { + const { setEmail, logout } = initializeWithConfig({ + authToken: '123', + configOptions: { + enableAnonTracking: true, + identityResolution: { + replayOnVisitorToKnown: true, + mergeOnAnonymousToKnown: true + } + }, + generateJWT: (payload: GenerateJWTPayload) => { + if (payload.email === 'testuseranotheruser@test.com') { + return Promise.resolve(MOCK_JWT_KEY_WITH_ONE_MINUTE_EXPIRY); + } + return Promise.resolve(MOCK_JWT_KEY); + } + }); + logout(); // logout to remove logged in users before this test + await setEmail('testuser123@test.com'); + const response = await getInAppMessages({ + count: 10, + packageName: 'my-lil-website' + }); + expect(response.config.headers.Authorization).toBe( + `Bearer ${MOCK_JWT_KEY}` + ); + expect(response.config.params.email).toBe('testuser123@test.com'); + try { + await track({ eventName: 'testEvent' }); + } catch (e) { + console.log('', e); + } + expect(localStorageMock.setItem).not.toHaveBeenCalledWith( + SHARED_PREF_ANON_USER_ID + ); + await setEmail('testuseranotheruser@test.com'); + const secondResponse = await getInAppMessages({ + count: 10, + packageName: 'my-lil-website' + }); + expect(secondResponse.config.headers.Authorization).toBe( + `Bearer ${MOCK_JWT_KEY_WITH_ONE_MINUTE_EXPIRY}` + ); + expect(secondResponse.config.params.email).toBe( + 'testuseranotheruser@test.com' + ); + const mergePostRequestData = mockRequest.history.post.find( + (req) => req.url === ENDPOINT_MERGE_USER + ); + expect(mergePostRequestData?.headers?.Authorization).toBe( + `Bearer ${MOCK_JWT_KEY_WITH_ONE_MINUTE_EXPIRY}` + ); + expect(mergePostRequestData).toBeDefined(); // ensure that merge API gets called + }); }); }); diff --git a/src/authorization/authorization.ts b/src/authorization/authorization.ts index b23fb56f..52e18c32 100644 --- a/src/authorization/authorization.ts +++ b/src/authorization/authorization.ts @@ -838,29 +838,29 @@ export function initialize( identityResolution?.replayOnVisitorToKnown || identityResolutionConfig?.replayOnVisitorToKnown; - const result = await tryMergeUser(email, true, merge); - if (result) { - initializeEmailUser(email); - try { - return doRequest({ email }) - .then((token) => { + try { + return doRequest({ email }) + .then(async (token) => { + const result = await tryMergeUser(email, true, merge); + if (result) { + initializeEmailUser(email); if (replay) { syncEvents(); } return token; - }) - .catch((e) => { - if (logLevel === 'verbose') { - console.warn( - 'Could not generate JWT after calling setEmail. Please try calling setEmail again.' - ); - } - return Promise.reject(e); - }); - } catch (e) { - /* failed to create a new user. Just silently resolve */ - return Promise.resolve(); - } + } + }) + .catch((e) => { + if (logLevel === 'verbose') { + console.warn( + 'Could not generate JWT after calling setEmail. Please try calling setEmail again.' + ); + } + return Promise.reject(e); + }); + } catch (e) { + /* failed to create a new user. Just silently resolve */ + return Promise.resolve(); } } catch (error) { // here we will not sync events but just bubble up error of merge @@ -881,29 +881,29 @@ export function initialize( identityResolution?.replayOnVisitorToKnown || identityResolutionConfig?.replayOnVisitorToKnown; - const result = await tryMergeUser(userId, false, merge); - if (result) { - initializeUserId(userId); - try { - return doRequest({ userID: userId }) - .then(async (token) => { + try { + return doRequest({ userID: userId }) + .then(async (token) => { + const result = await tryMergeUser(userId, false, merge); + if (result) { + initializeUserId(userId); if (replay) { syncEvents(); } return token; - }) - .catch((e) => { - if (logLevel === 'verbose') { - console.warn( - 'Could not generate JWT after calling setUserID. Please try calling setUserID again.' - ); - } - return Promise.reject(e); - }); - } catch (e) { - /* failed to create a new user. Just silently resolve */ - return Promise.resolve(); - } + } + }) + .catch((e) => { + if (logLevel === 'verbose') { + console.warn( + 'Could not generate JWT after calling setUserID. Please try calling setUserID again.' + ); + } + return Promise.reject(e); + }); + } catch (e) { + /* failed to create a new user. Just silently resolve */ + return Promise.resolve(); } } catch (error) { // here we will not sync events but just bubble up error of merge From fdc244db30f639753772d236c5125863b6a05e52 Mon Sep 17 00:00:00 2001 From: Darshan Parmar Date: Tue, 22 Oct 2024 21:50:32 +0530 Subject: [PATCH 3/8] [MOB-9999] Aggregate user update event gets deleted --- .../anonymousUserEventManager.ts | 112 ++-- .../complexCriteria.test.ts | 146 +++-- .../criteriaCompletionChecker.ts | 32 +- .../tests/combinationLogicCriteria.test.ts | 209 ++++-- .../tests/compareArrayDataTypes.test.ts | 604 +++++++++--------- .../tests/complexCriteria.test.ts | 273 +++++--- .../tests/criteriaCompletionChecker.test.ts | 136 ++-- ...aTypeComparatorSearchQueryCriteria.test.ts | 372 ++++++----- .../tests/nestedTesting.test.ts | 213 +++--- .../tests/userUpdate.test.ts | 19 +- .../validateCustomEventUserUpdateAPI.test.ts | 54 +- src/constants.ts | 1 + 12 files changed, 1213 insertions(+), 958 deletions(-) diff --git a/src/anonymousUserTracking/anonymousUserEventManager.ts b/src/anonymousUserTracking/anonymousUserEventManager.ts index d55d48b3..b92b968c 100644 --- a/src/anonymousUserTracking/anonymousUserEventManager.ts +++ b/src/anonymousUserTracking/anonymousUserEventManager.ts @@ -26,7 +26,8 @@ import { KEY_PREFER_USERID, ENDPOINTS, DEFAULT_EVENT_THRESHOLD_LIMIT, - SHARED_PREF_ANON_USAGE_TRACKED + SHARED_PREF_ANON_USAGE_TRACKED, + SHARED_PREFS_USER_UPDATE_OBJECT_KEY } from '../constants'; import { baseIterableRequest } from '../request'; import { IterableResponse } from '../types'; @@ -136,7 +137,7 @@ export class AnonymousUserEventManager { [KEY_CREATE_NEW_FIELDS]: true, [SHARED_PREFS_EVENT_TYPE]: TRACK_EVENT }; - this.storeEventListToLocalStorage(newDataObject, false); + this.storeEventListToLocalStorage(newDataObject); } async trackAnonUpdateUser(payload: UpdateUserParams) { @@ -144,7 +145,7 @@ export class AnonymousUserEventManager { ...payload.dataFields, [SHARED_PREFS_EVENT_TYPE]: UPDATE_USER }; - this.storeEventListToLocalStorage(newDataObject, true); + this.storeUserUpdateToLocalStorage(newDataObject); } async trackAnonPurchaseEvent(payload: TrackPurchaseRequestParams) { @@ -155,7 +156,7 @@ export class AnonymousUserEventManager { [KEY_TOTAL]: payload.total, [SHARED_PREFS_EVENT_TYPE]: TRACK_PURCHASE }; - this.storeEventListToLocalStorage(newDataObject, false); + this.storeEventListToLocalStorage(newDataObject); } async trackAnonUpdateCart(payload: UpdateCartRequestParams) { @@ -165,7 +166,7 @@ export class AnonymousUserEventManager { [KEY_PREFER_USERID]: true, [KEY_CREATED_AT]: this.getCurrentTime() }; - this.storeEventListToLocalStorage(newDataObject, false); + this.storeEventListToLocalStorage(newDataObject); } private checkCriteriaCompletion(): string | null { @@ -173,9 +174,15 @@ export class AnonymousUserEventManager { const localStoredEventList = localStorage.getItem( SHARED_PREFS_EVENT_LIST_KEY ); + const localStoredUserUpdate = localStorage.getItem( + SHARED_PREFS_USER_UPDATE_OBJECT_KEY + ); try { if (criteriaData && localStoredEventList) { - const checker = new CriteriaCompletionChecker(localStoredEventList); + const checker = new CriteriaCompletionChecker( + localStoredEventList, + localStoredUserUpdate + ); return checker.getMatchedCriteria(criteriaData); } } catch (error) { @@ -191,14 +198,11 @@ export class AnonymousUserEventManager { if (!anonymousUsageTracked) return; const userData = localStorage.getItem(SHARED_PREFS_ANON_SESSIONS); - const eventList = localStorage.getItem(SHARED_PREFS_EVENT_LIST_KEY); - const events = eventList ? JSON.parse(eventList) : []; + const strUserUpdate = localStorage.getItem( + SHARED_PREFS_USER_UPDATE_OBJECT_KEY + ); + const dataFields = strUserUpdate ? JSON.parse(strUserUpdate) : {}; - const dataFields = { - ...events.find( - (event: any) => event[SHARED_PREFS_EVENT_TYPE] === UPDATE_USER - ) - }; delete dataFields[SHARED_PREFS_EVENT_TYPE]; const userId = uuidv4(); @@ -238,15 +242,7 @@ export class AnonymousUserEventManager { } }); if (response?.status === 200) { - // Update local storage, remove updateUser from local storage - localStorage.setItem( - SHARED_PREFS_EVENT_LIST_KEY, - JSON.stringify( - events.filter( - (event: any) => event[SHARED_PREFS_EVENT_TYPE] !== UPDATE_USER - ) - ) - ); + localStorage.removeItem(SHARED_PREFS_USER_UPDATE_OBJECT_KEY); const onAnonUserCreated = config.getConfig('onAnonUserCreated'); @@ -267,6 +263,11 @@ export class AnonymousUserEventManager { ? JSON.parse(strTrackEventList) : []; + const strUserUpdate = localStorage.getItem( + SHARED_PREFS_USER_UPDATE_OBJECT_KEY + ); + const userUpdateObject = strUserUpdate ? JSON.parse(strUserUpdate) : {}; + if (trackEventList.length) { trackEventList.forEach( ( @@ -288,10 +289,6 @@ export class AnonymousUserEventManager { this.updateCart(event); break; } - case UPDATE_USER: { - this.updateUser({ dataFields: event }); - break; - } default: break; } @@ -299,19 +296,25 @@ export class AnonymousUserEventManager { } ); } + + if (Object.keys(userUpdateObject).length) { + // eslint-disable-next-line no-param-reassign + delete userUpdateObject[SHARED_PREFS_EVENT_TYPE]; + this.updateUser(userUpdateObject); + } } removeAnonSessionCriteriaData() { localStorage.removeItem(SHARED_PREFS_ANON_SESSIONS); localStorage.removeItem(SHARED_PREFS_EVENT_LIST_KEY); + localStorage.removeItem(SHARED_PREFS_USER_UPDATE_OBJECT_KEY); } private async storeEventListToLocalStorage( newDataObject: Record< any /* eslint-disable-line @typescript-eslint/no-explicit-any */, any /* eslint-disable-line @typescript-eslint/no-explicit-any */ - >, - shouldOverWrite: boolean + > ) { const anonymousUsageTracked = isAnonymousUsageTracked(); @@ -324,24 +327,7 @@ export class AnonymousUserEventManager { previousDataArray = JSON.parse(strTrackEventList); } - if (shouldOverWrite) { - const trackingType = newDataObject[SHARED_PREFS_EVENT_TYPE]; - const indexToUpdate = previousDataArray.findIndex( - (obj: any) => obj[SHARED_PREFS_EVENT_TYPE] === trackingType - ); - if (indexToUpdate !== -1) { - const dataToUpdate = previousDataArray[indexToUpdate]; - - previousDataArray[indexToUpdate] = { - ...dataToUpdate, - ...newDataObject - }; - } else { - previousDataArray.push(newDataObject); - } - } else { - previousDataArray.push(newDataObject); - } + previousDataArray.push(newDataObject); // - The code below limits the number of events stored in local storage. // - The event list acts as a queue, with the oldest events being deleted @@ -366,6 +352,40 @@ export class AnonymousUserEventManager { } } + private async storeUserUpdateToLocalStorage( + newDataObject: Record< + any /* eslint-disable-line @typescript-eslint/no-explicit-any */, + any /* eslint-disable-line @typescript-eslint/no-explicit-any */ + > + ) { + const anonymousUsageTracked = isAnonymousUsageTracked(); + + if (!anonymousUsageTracked) return; + + const strUserUpdate = localStorage.getItem( + SHARED_PREFS_USER_UPDATE_OBJECT_KEY + ); + let userUpdateObject = {}; + + if (strUserUpdate) { + userUpdateObject = JSON.parse(strUserUpdate); + } + + userUpdateObject = { + ...userUpdateObject, + ...newDataObject + }; + + localStorage.setItem( + SHARED_PREFS_USER_UPDATE_OBJECT_KEY, + JSON.stringify(userUpdateObject) + ); + const criteriaId = this.checkCriteriaCompletion(); + if (criteriaId !== null) { + this.createKnownUser(criteriaId); + } + } + private getCurrentTime = () => { const dateInMillis = new Date().getTime(); const dateInSeconds = Math.floor(dateInMillis / 1000); diff --git a/src/anonymousUserTracking/complexCriteria.test.ts b/src/anonymousUserTracking/complexCriteria.test.ts index 8d8eb7cd..95483ee2 100644 --- a/src/anonymousUserTracking/complexCriteria.test.ts +++ b/src/anonymousUserTracking/complexCriteria.test.ts @@ -1,4 +1,7 @@ -import { SHARED_PREFS_EVENT_LIST_KEY } from '../constants'; +import { + SHARED_PREFS_EVENT_LIST_KEY, + SHARED_PREFS_USER_UPDATE_OBJECT_KEY +} from '../constants'; import CriteriaCompletionChecker from './criteriaCompletionChecker'; const localStorageMock = { @@ -28,16 +31,18 @@ describe('complexCriteria', () => { ], total: 50, eventType: 'purchase' - }, - { - dataFields: { - preferred_car_models: 'Honda', - country: 'Japan' - }, - eventType: 'user' } ]); } + if (key === SHARED_PREFS_USER_UPDATE_OBJECT_KEY) { + return JSON.stringify({ + dataFields: { + preferred_car_models: 'Honda', + country: 'Japan' + }, + eventType: 'user' + }); + } return null; }); @@ -45,8 +50,13 @@ describe('complexCriteria', () => { SHARED_PREFS_EVENT_LIST_KEY ); + const localStoredUserUpdate = localStorage.getItem( + SHARED_PREFS_USER_UPDATE_OBJECT_KEY + ); + const checker = new CriteriaCompletionChecker( - localStoredEventList === null ? '' : localStoredEventList + localStoredEventList === null ? '' : localStoredEventList, + localStoredUserUpdate === null ? '' : localStoredUserUpdate ); const result = checker.getMatchedCriteria( JSON.stringify({ @@ -193,15 +203,17 @@ describe('complexCriteria', () => { ], total: 50, eventType: 'purchase' - }, - { - dataFields: { - preferred_car_models: 'Honda' - }, - eventType: 'user' } ]); } + if (key === SHARED_PREFS_USER_UPDATE_OBJECT_KEY) { + return JSON.stringify({ + dataFields: { + preferred_car_models: 'Honda' + }, + eventType: 'user' + }); + } return null; }); @@ -209,8 +221,12 @@ describe('complexCriteria', () => { SHARED_PREFS_EVENT_LIST_KEY ); + const localStoredUserUpdate = localStorage.getItem( + SHARED_PREFS_USER_UPDATE_OBJECT_KEY + ); const checker = new CriteriaCompletionChecker( - localStoredEventList === null ? '' : localStoredEventList + localStoredEventList === null ? '' : localStoredEventList, + localStoredUserUpdate === null ? '' : localStoredUserUpdate ); const result = checker.getMatchedCriteria( JSON.stringify({ @@ -355,16 +371,19 @@ describe('complexCriteria', () => { items: [{ id: '12', name: 'Mocha', price: 90, quantity: 50 }], total: 50, eventType: 'cartUpdate' - }, - { - dataFields: { - preferred_car_models: 'Subaru', - country: 'USA' - }, - eventType: 'user' } ]); } + + if (key === SHARED_PREFS_USER_UPDATE_OBJECT_KEY) { + return JSON.stringify({ + dataFields: { + preferred_car_models: 'Subaru', + country: 'USA' + }, + eventType: 'user' + }); + } return null; }); @@ -372,8 +391,13 @@ describe('complexCriteria', () => { SHARED_PREFS_EVENT_LIST_KEY ); + const localStoredUserUpdate = localStorage.getItem( + SHARED_PREFS_USER_UPDATE_OBJECT_KEY + ); + const checker = new CriteriaCompletionChecker( - localStoredEventList === null ? '' : localStoredEventList + localStoredEventList === null ? '' : localStoredEventList, + localStoredUserUpdate === null ? '' : localStoredUserUpdate ); const result = checker.getMatchedCriteria( JSON.stringify({ @@ -516,16 +540,19 @@ describe('complexCriteria', () => { items: [{ id: '12', name: 'Mocha', price: 90, quantity: 50 }], total: 50, eventType: 'cartUpdate' - }, - { - dataFields: { - preferred_car_models: 'Subaru', - country: 'USA' - }, - eventType: 'user' } ]); } + + if (key === SHARED_PREFS_USER_UPDATE_OBJECT_KEY) { + return JSON.stringify({ + dataFields: { + preferred_car_models: 'Subaru', + country: 'USA' + }, + eventType: 'user' + }); + } return null; }); @@ -533,8 +560,13 @@ describe('complexCriteria', () => { SHARED_PREFS_EVENT_LIST_KEY ); + const localStoredUserUpdate = localStorage.getItem( + SHARED_PREFS_USER_UPDATE_OBJECT_KEY + ); + const checker = new CriteriaCompletionChecker( - localStoredEventList === null ? '' : localStoredEventList + localStoredEventList === null ? '' : localStoredEventList, + localStoredUserUpdate === null ? '' : localStoredUserUpdate ); const result = checker.getMatchedCriteria( JSON.stringify({ @@ -683,14 +715,6 @@ describe('complexCriteria', () => { total: 50, eventType: 'cartUpdate' }, - - { - dataFields: { - preferred_car_models: 'Subaru', - country: 'USA' - }, - eventType: 'user' - }, { eventName: 'button-clicked', dataFields: { @@ -712,6 +736,15 @@ describe('complexCriteria', () => { } ]); } + if (key === SHARED_PREFS_USER_UPDATE_OBJECT_KEY) { + return JSON.stringify({ + dataFields: { + preferred_car_models: 'Subaru', + country: 'USA' + }, + eventType: 'user' + }); + } return null; }); @@ -719,8 +752,13 @@ describe('complexCriteria', () => { SHARED_PREFS_EVENT_LIST_KEY ); + const localStoredUserUpdate = localStorage.getItem( + SHARED_PREFS_USER_UPDATE_OBJECT_KEY + ); + const checker = new CriteriaCompletionChecker( - localStoredEventList === null ? '' : localStoredEventList + localStoredEventList === null ? '' : localStoredEventList, + localStoredUserUpdate === null ? '' : localStoredUserUpdate ); const result = checker.getMatchedCriteria( JSON.stringify({ @@ -863,14 +901,6 @@ describe('complexCriteria', () => { total: 50, eventType: 'cartUpdate' }, - - { - dataFields: { - preferred_car_models: 'Subaru', - country: 'USA' - }, - eventType: 'user' - }, { eventName: 'button-clicked', dataFields: { @@ -880,6 +910,15 @@ describe('complexCriteria', () => { } ]); } + if (key === SHARED_PREFS_USER_UPDATE_OBJECT_KEY) { + return JSON.stringify({ + dataFields: { + preferred_car_models: 'Subaru', + country: 'USA' + }, + eventType: 'user' + }); + } return null; }); @@ -887,8 +926,13 @@ describe('complexCriteria', () => { SHARED_PREFS_EVENT_LIST_KEY ); + const localStoredUserUpdate = localStorage.getItem( + SHARED_PREFS_USER_UPDATE_OBJECT_KEY + ); + const checker = new CriteriaCompletionChecker( - localStoredEventList === null ? '' : localStoredEventList + localStoredEventList === null ? '' : localStoredEventList, + localStoredUserUpdate === null ? '' : localStoredUserUpdate ); const result = checker.getMatchedCriteria( JSON.stringify({ @@ -1123,7 +1167,7 @@ describe('complexCriteria', () => { { items: [ { id: '12', name: 'sneakers', price: 10, quantity: 2 }, - { id: '13', name: 'slippers', price: 10, quantity: 3 } + { id: '13', name: 'slippers', price: 10, quantity: 2 } ], total: 2, eventType: 'purchase' diff --git a/src/anonymousUserTracking/criteriaCompletionChecker.ts b/src/anonymousUserTracking/criteriaCompletionChecker.ts index 59368e16..6e153d5c 100644 --- a/src/anonymousUserTracking/criteriaCompletionChecker.ts +++ b/src/anonymousUserTracking/criteriaCompletionChecker.ts @@ -6,7 +6,6 @@ import { TRACK_UPDATE_CART, TRACK_EVENT, UPDATE_CART, - UPDATE_USER, KEY_EVENT_NAME, UPDATECART_ITEM_PREFIX, PURCHASE_ITEM_PREFIX, @@ -38,8 +37,19 @@ interface Criteria { class CriteriaCompletionChecker { private localStoredEventList: any[]; - constructor(localStoredEventList: string) { - this.localStoredEventList = JSON.parse(localStoredEventList); + private localStoredUserUpdate: any; + + constructor( + localStoredEventList: string, + localStoredUserUpdate?: string | null + ) { + this.localStoredEventList = + (localStoredEventList !== '' && JSON.parse(localStoredEventList)) || []; + this.localStoredUserUpdate = + (localStoredUserUpdate && + localStoredUserUpdate !== '' && + JSON.parse(localStoredUserUpdate)) || + {}; } public getMatchedCriteria(criteriaData: string): string | null { @@ -169,8 +179,7 @@ class CriteriaCompletionChecker { this.localStoredEventList.forEach((localEventData) => { if ( localEventData[SHARED_PREFS_EVENT_TYPE] && - (localEventData[SHARED_PREFS_EVENT_TYPE] === UPDATE_USER || - localEventData[SHARED_PREFS_EVENT_TYPE] === TRACK_EVENT) + localEventData[SHARED_PREFS_EVENT_TYPE] === TRACK_EVENT ) { const updatedItem: any = localEventData; if (localEventData.dataFields) { @@ -183,6 +192,19 @@ class CriteriaCompletionChecker { nonPurchaseEvents.push(updatedItem); } }); + + if (Object.keys(this.localStoredUserUpdate).length) { + const localEventData = { ...this.localStoredUserUpdate }; + if (localEventData.dataFields) { + Object.keys(localEventData.dataFields).forEach((key) => { + localEventData[key] = localEventData.dataFields[key]; + }); + // eslint-disable-next-line no-param-reassign + delete localEventData.dataFields; + } + nonPurchaseEvents.push(localEventData); + } + return nonPurchaseEvents; } diff --git a/src/anonymousUserTracking/tests/combinationLogicCriteria.test.ts b/src/anonymousUserTracking/tests/combinationLogicCriteria.test.ts index 17d339bb..b4a8e9d1 100644 --- a/src/anonymousUserTracking/tests/combinationLogicCriteria.test.ts +++ b/src/anonymousUserTracking/tests/combinationLogicCriteria.test.ts @@ -1,4 +1,7 @@ -import { SHARED_PREFS_EVENT_LIST_KEY } from '../../constants'; +import { + SHARED_PREFS_EVENT_LIST_KEY, + SHARED_PREFS_USER_UPDATE_OBJECT_KEY +} from '../../constants'; import CriteriaCompletionChecker from '../criteriaCompletionChecker'; const localStorageMock = { @@ -19,13 +22,15 @@ describe('CombinationLogicCriteria', () => { { dataFields: { total: 10 }, eventType: 'customEvent' - }, - { - dataFields: { firstName: 'David' }, - eventType: 'user' } ]); } + if (key === SHARED_PREFS_USER_UPDATE_OBJECT_KEY) { + return JSON.stringify({ + dataFields: { firstName: 'David' }, + eventType: 'user' + }); + } return null; }); @@ -33,8 +38,13 @@ describe('CombinationLogicCriteria', () => { SHARED_PREFS_EVENT_LIST_KEY ); + const localStoredUserUpdate = localStorage.getItem( + SHARED_PREFS_USER_UPDATE_OBJECT_KEY + ); + const checker = new CriteriaCompletionChecker( - localStoredEventList === null ? '' : localStoredEventList + localStoredEventList === null ? '' : localStoredEventList, + localStoredUserUpdate === null ? '' : localStoredUserUpdate ); const result = checker.getMatchedCriteria( JSON.stringify({ @@ -101,13 +111,15 @@ describe('CombinationLogicCriteria', () => { { dataFields: { total: 10 }, eventType: 'customEvent' - }, - { - dataFields: { firstName: 'Davidson' }, - eventType: 'user' } ]); } + if (key === SHARED_PREFS_USER_UPDATE_OBJECT_KEY) { + return JSON.stringify({ + dataFields: { firstName: 'Davidson' }, + eventType: 'user' + }); + } return null; }); @@ -115,8 +127,13 @@ describe('CombinationLogicCriteria', () => { SHARED_PREFS_EVENT_LIST_KEY ); + const localStoredUserUpdate = localStorage.getItem( + SHARED_PREFS_USER_UPDATE_OBJECT_KEY + ); + const checker = new CriteriaCompletionChecker( - localStoredEventList === null ? '' : localStoredEventList + localStoredEventList === null ? '' : localStoredEventList, + localStoredUserUpdate === null ? '' : localStoredUserUpdate ); const result = checker.getMatchedCriteria( JSON.stringify({ @@ -183,13 +200,15 @@ describe('CombinationLogicCriteria', () => { { dataFields: { total: 10 }, eventType: 'customEvent' - }, - { - dataFields: { firstName: 'David' }, - eventType: 'user' } ]); } + if (key === SHARED_PREFS_USER_UPDATE_OBJECT_KEY) { + return JSON.stringify({ + dataFields: { firstName: 'David' }, + eventType: 'user' + }); + } return null; }); @@ -197,8 +216,13 @@ describe('CombinationLogicCriteria', () => { SHARED_PREFS_EVENT_LIST_KEY ); + const localStoredUserUpdate = localStorage.getItem( + SHARED_PREFS_USER_UPDATE_OBJECT_KEY + ); + const checker = new CriteriaCompletionChecker( - localStoredEventList === null ? '' : localStoredEventList + localStoredEventList === null ? '' : localStoredEventList, + localStoredUserUpdate === null ? '' : localStoredUserUpdate ); const result = checker.getMatchedCriteria( JSON.stringify({ @@ -265,13 +289,15 @@ describe('CombinationLogicCriteria', () => { { dataFields: { total: 101 }, eventType: 'customEvent' - }, - { - dataFields: { firstName: 'Davidson' }, - eventType: 'user' } ]); } + if (key === SHARED_PREFS_USER_UPDATE_OBJECT_KEY) { + return JSON.stringify({ + dataFields: { firstName: 'Davidson' }, + eventType: 'user' + }); + } return null; }); @@ -279,8 +305,13 @@ describe('CombinationLogicCriteria', () => { SHARED_PREFS_EVENT_LIST_KEY ); + const localStoredUserUpdate = localStorage.getItem( + SHARED_PREFS_USER_UPDATE_OBJECT_KEY + ); + const checker = new CriteriaCompletionChecker( - localStoredEventList === null ? '' : localStoredEventList + localStoredEventList === null ? '' : localStoredEventList, + localStoredUserUpdate === null ? '' : localStoredUserUpdate ); const result = checker.getMatchedCriteria( JSON.stringify({ @@ -350,13 +381,15 @@ describe('CombinationLogicCriteria', () => { total: 10 }, eventType: 'customEvent' - }, - { - dataFields: { firstName: 'Davidson' }, - eventType: 'user' } ]); } + if (key === SHARED_PREFS_USER_UPDATE_OBJECT_KEY) { + return JSON.stringify({ + dataFields: { firstName: 'Davidson' }, + eventType: 'user' + }); + } return null; }); @@ -364,8 +397,13 @@ describe('CombinationLogicCriteria', () => { SHARED_PREFS_EVENT_LIST_KEY ); + const localStoredUserUpdate = localStorage.getItem( + SHARED_PREFS_USER_UPDATE_OBJECT_KEY + ); + const checker = new CriteriaCompletionChecker( - localStoredEventList === null ? '' : localStoredEventList + localStoredEventList === null ? '' : localStoredEventList, + localStoredUserUpdate === null ? '' : localStoredUserUpdate ); const result = checker.getMatchedCriteria( JSON.stringify({ @@ -432,13 +470,15 @@ describe('CombinationLogicCriteria', () => { { dataFields: { total: 1 }, eventType: 'customEvent' - }, - { - dataFields: { firstName: 'David' }, - eventType: 'user' } ]); } + if (key === SHARED_PREFS_USER_UPDATE_OBJECT_KEY) { + return JSON.stringify({ + dataFields: { firstName: 'David' }, + eventType: 'user' + }); + } return null; }); @@ -446,8 +486,13 @@ describe('CombinationLogicCriteria', () => { SHARED_PREFS_EVENT_LIST_KEY ); + const localStoredUserUpdate = localStorage.getItem( + SHARED_PREFS_USER_UPDATE_OBJECT_KEY + ); + const checker = new CriteriaCompletionChecker( - localStoredEventList === null ? '' : localStoredEventList + localStoredEventList === null ? '' : localStoredEventList, + localStoredUserUpdate === null ? '' : localStoredUserUpdate ); const result = checker.getMatchedCriteria( JSON.stringify({ @@ -514,13 +559,15 @@ describe('CombinationLogicCriteria', () => { { items: [{ name: 'fried', id: 'fried', price: 10, quantity: 2 }], eventType: 'cartUpdate' - }, - { - dataFields: { firstName: 'David' }, - eventType: 'user' } ]); } + if (key === SHARED_PREFS_USER_UPDATE_OBJECT_KEY) { + return JSON.stringify({ + dataFields: { firstName: 'David' }, + eventType: 'user' + }); + } return null; }); @@ -528,8 +575,13 @@ describe('CombinationLogicCriteria', () => { SHARED_PREFS_EVENT_LIST_KEY ); + const localStoredUserUpdate = localStorage.getItem( + SHARED_PREFS_USER_UPDATE_OBJECT_KEY + ); + const checker = new CriteriaCompletionChecker( - localStoredEventList === null ? '' : localStoredEventList + localStoredEventList === null ? '' : localStoredEventList, + localStoredUserUpdate === null ? '' : localStoredUserUpdate ); const result = checker.getMatchedCriteria( JSON.stringify({ @@ -596,13 +648,15 @@ describe('CombinationLogicCriteria', () => { { items: [{ name: 'chicken', id: 'chicken', price: 10, quantity: 2 }], eventType: 'cartUpdate' - }, - { - dataFields: { firstName: 'Davidson' }, - eventType: 'user' } ]); } + if (key === SHARED_PREFS_USER_UPDATE_OBJECT_KEY) { + return JSON.stringify({ + dataFields: { firstName: 'Davidson' }, + eventType: 'user' + }); + } return null; }); @@ -610,8 +664,13 @@ describe('CombinationLogicCriteria', () => { SHARED_PREFS_EVENT_LIST_KEY ); + const localStoredUserUpdate = localStorage.getItem( + SHARED_PREFS_USER_UPDATE_OBJECT_KEY + ); + const checker = new CriteriaCompletionChecker( - localStoredEventList === null ? '' : localStoredEventList + localStoredEventList === null ? '' : localStoredEventList, + localStoredUserUpdate === null ? '' : localStoredUserUpdate ); const result = checker.getMatchedCriteria( JSON.stringify({ @@ -678,13 +737,15 @@ describe('CombinationLogicCriteria', () => { { items: [{ name: 'fried', id: 'fried', price: 10, quantity: 2 }], eventType: 'cartUpdate' - }, - { - dataFields: { firstName: 'David' }, - eventType: 'user' } ]); } + if (key === SHARED_PREFS_USER_UPDATE_OBJECT_KEY) { + return JSON.stringify({ + dataFields: { firstName: 'David' }, + eventType: 'user' + }); + } return null; }); @@ -692,8 +753,13 @@ describe('CombinationLogicCriteria', () => { SHARED_PREFS_EVENT_LIST_KEY ); + const localStoredUserUpdate = localStorage.getItem( + SHARED_PREFS_USER_UPDATE_OBJECT_KEY + ); + const checker = new CriteriaCompletionChecker( - localStoredEventList === null ? '' : localStoredEventList + localStoredEventList === null ? '' : localStoredEventList, + localStoredUserUpdate === null ? '' : localStoredUserUpdate ); const result = checker.getMatchedCriteria( JSON.stringify({ @@ -760,13 +826,15 @@ describe('CombinationLogicCriteria', () => { { items: [{ name: 'chicken', id: 'chicken', price: 10, quantity: 2 }], eventType: 'cartUpdate' - }, - { - dataFields: { firstName: 'Davidson' }, - eventType: 'user' } ]); } + if (key === SHARED_PREFS_USER_UPDATE_OBJECT_KEY) { + return JSON.stringify({ + dataFields: { firstName: 'Davidson' }, + eventType: 'user' + }); + } return null; }); @@ -774,8 +842,13 @@ describe('CombinationLogicCriteria', () => { SHARED_PREFS_EVENT_LIST_KEY ); + const localStoredUserUpdate = localStorage.getItem( + SHARED_PREFS_USER_UPDATE_OBJECT_KEY + ); + const checker = new CriteriaCompletionChecker( - localStoredEventList === null ? '' : localStoredEventList + localStoredEventList === null ? '' : localStoredEventList, + localStoredUserUpdate === null ? '' : localStoredUserUpdate ); const result = checker.getMatchedCriteria( JSON.stringify({ @@ -842,13 +915,15 @@ describe('CombinationLogicCriteria', () => { { items: [{ name: 'boiled', id: 'boiled', price: 10, quantity: 2 }], eventType: 'cartUpdate' - }, - { - dataFields: { firstName: 'Davidson' }, - eventType: 'user' } ]); } + if (key === SHARED_PREFS_USER_UPDATE_OBJECT_KEY) { + return JSON.stringify({ + dataFields: { firstName: 'Davidson' }, + eventType: 'user' + }); + } return null; }); @@ -856,8 +931,13 @@ describe('CombinationLogicCriteria', () => { SHARED_PREFS_EVENT_LIST_KEY ); + const localStoredUserUpdate = localStorage.getItem( + SHARED_PREFS_USER_UPDATE_OBJECT_KEY + ); + const checker = new CriteriaCompletionChecker( - localStoredEventList === null ? '' : localStoredEventList + localStoredEventList === null ? '' : localStoredEventList, + localStoredUserUpdate === null ? '' : localStoredUserUpdate ); const result = checker.getMatchedCriteria( JSON.stringify({ @@ -924,13 +1004,15 @@ describe('CombinationLogicCriteria', () => { { items: [{ name: 'fried', id: 'fried', price: 10, quantity: 2 }], eventType: 'cartUpdate' - }, - { - dataFields: { firstName: 'David' }, - eventType: 'user' } ]); } + if (key === SHARED_PREFS_USER_UPDATE_OBJECT_KEY) { + return JSON.stringify({ + dataFields: { firstName: 'David' }, + eventType: 'user' + }); + } return null; }); @@ -938,8 +1020,13 @@ describe('CombinationLogicCriteria', () => { SHARED_PREFS_EVENT_LIST_KEY ); + const localStoredUserUpdate = localStorage.getItem( + SHARED_PREFS_USER_UPDATE_OBJECT_KEY + ); + const checker = new CriteriaCompletionChecker( - localStoredEventList === null ? '' : localStoredEventList + localStoredEventList === null ? '' : localStoredEventList, + localStoredUserUpdate === null ? '' : localStoredUserUpdate ); const result = checker.getMatchedCriteria( JSON.stringify({ diff --git a/src/anonymousUserTracking/tests/compareArrayDataTypes.test.ts b/src/anonymousUserTracking/tests/compareArrayDataTypes.test.ts index 4440ca14..724f7df7 100644 --- a/src/anonymousUserTracking/tests/compareArrayDataTypes.test.ts +++ b/src/anonymousUserTracking/tests/compareArrayDataTypes.test.ts @@ -1,4 +1,7 @@ -import { SHARED_PREFS_EVENT_LIST_KEY } from '../../constants'; +import { + SHARED_PREFS_EVENT_LIST_KEY, + SHARED_PREFS_USER_UPDATE_OBJECT_KEY +} from '../../constants'; import CriteriaCompletionChecker from '../criteriaCompletionChecker'; import { IS_NOT_ONE_OF_CRITERIA, @@ -30,17 +33,6 @@ describe('compareArrayDataTypes', () => { (localStorage.getItem as jest.Mock).mockImplementation((key) => { if (key === SHARED_PREFS_EVENT_LIST_KEY) { return JSON.stringify([ - { - dataFields: { - milestoneYears: [1996, 1997, 2002, 2020, 2024], - score: [10.5, 11.5, 12.5, 13.5, 14.5], - timestamp: [ - 1722497422151, 1722500235276, 1722500215276, 1722500225276, - 1722500245276 - ] - }, - eventType: 'user' - }, { eventName: 'button-clicked', dataFields: { @@ -50,6 +42,19 @@ describe('compareArrayDataTypes', () => { } ]); } + if (key === SHARED_PREFS_USER_UPDATE_OBJECT_KEY) { + return JSON.stringify({ + dataFields: { + milestoneYears: [1996, 1997, 2002, 2020, 2024], + score: [10.5, 11.5, 12.5, 13.5, 14.5], + timestamp: [ + 1722497422151, 1722500235276, 1722500215276, 1722500225276, + 1722500245276 + ] + }, + eventType: 'user' + }); + } return null; }); @@ -57,8 +62,13 @@ describe('compareArrayDataTypes', () => { SHARED_PREFS_EVENT_LIST_KEY ); + const localStoredUserUpdate = localStorage.getItem( + SHARED_PREFS_USER_UPDATE_OBJECT_KEY + ); + const checker = new CriteriaCompletionChecker( - localStoredEventList === null ? '' : localStoredEventList + localStoredEventList === null ? '' : localStoredEventList, + localStoredUserUpdate === null ? '' : localStoredUserUpdate ); const result = checker.getMatchedCriteria( JSON.stringify(ARRAY_EQUAL_CRITERIA) @@ -70,16 +80,6 @@ describe('compareArrayDataTypes', () => { (localStorage.getItem as jest.Mock).mockImplementation((key) => { if (key === SHARED_PREFS_EVENT_LIST_KEY) { return JSON.stringify([ - { - dataFields: { - milestoneYears: [1996, 1998, 2002, 2020, 2024], - score: [12.5, 13.5, 14.5], - timestamp: [ - 1722497422151, 1722500235276, 1722500225276, 1722500245276 - ] - }, - eventType: 'user' - }, { eventName: 'button-clicked', dataFields: { @@ -89,6 +89,18 @@ describe('compareArrayDataTypes', () => { } ]); } + if (key === SHARED_PREFS_USER_UPDATE_OBJECT_KEY) { + return JSON.stringify({ + dataFields: { + milestoneYears: [1996, 1998, 2002, 2020, 2024], + score: [12.5, 13.5, 14.5], + timestamp: [ + 1722497422151, 1722500235276, 1722500225276, 1722500245276 + ] + }, + eventType: 'user' + }); + } return null; }); @@ -96,8 +108,13 @@ describe('compareArrayDataTypes', () => { SHARED_PREFS_EVENT_LIST_KEY ); + const localStoredUserUpdate = localStorage.getItem( + SHARED_PREFS_USER_UPDATE_OBJECT_KEY + ); + const checker = new CriteriaCompletionChecker( - localStoredEventList === null ? '' : localStoredEventList + localStoredEventList === null ? '' : localStoredEventList, + localStoredUserUpdate === null ? '' : localStoredUserUpdate ); const result = checker.getMatchedCriteria( JSON.stringify(ARRAY_EQUAL_CRITERIA) @@ -110,16 +127,6 @@ describe('compareArrayDataTypes', () => { (localStorage.getItem as jest.Mock).mockImplementation((key) => { if (key === SHARED_PREFS_EVENT_LIST_KEY) { return JSON.stringify([ - { - dataFields: { - milestoneYears: [1996, 1998, 2002, 2020, 2024], - score: [12.5, 13.5, 14.5], - timestamp: [ - 1722497422151, 1722500235276, 1722500225276, 1722500245276 - ] - }, - eventType: 'user' - }, { eventName: 'button-clicked', dataFields: { @@ -129,6 +136,18 @@ describe('compareArrayDataTypes', () => { } ]); } + if (key === SHARED_PREFS_USER_UPDATE_OBJECT_KEY) { + return JSON.stringify({ + dataFields: { + milestoneYears: [1996, 1998, 2002, 2020, 2024], + score: [12.5, 13.5, 14.5], + timestamp: [ + 1722497422151, 1722500235276, 1722500225276, 1722500245276 + ] + }, + eventType: 'user' + }); + } return null; }); @@ -136,8 +155,13 @@ describe('compareArrayDataTypes', () => { SHARED_PREFS_EVENT_LIST_KEY ); + const localStoredUserUpdate = localStorage.getItem( + SHARED_PREFS_USER_UPDATE_OBJECT_KEY + ); + const checker = new CriteriaCompletionChecker( - localStoredEventList === null ? '' : localStoredEventList + localStoredEventList === null ? '' : localStoredEventList, + localStoredUserUpdate === null ? '' : localStoredUserUpdate ); const result = checker.getMatchedCriteria( JSON.stringify(ARRAY_DOES_NOT_EQUAL_CRITERIA) @@ -149,17 +173,6 @@ describe('compareArrayDataTypes', () => { (localStorage.getItem as jest.Mock).mockImplementation((key) => { if (key === SHARED_PREFS_EVENT_LIST_KEY) { return JSON.stringify([ - { - dataFields: { - milestoneYears: [1996, 1997, 2002, 2020, 2024], - score: [10.5, 11.5, 12.5, 13.5, 14.5], - timestamp: [ - 1722497422151, 1722500235276, 1722500215276, 1722500225276, - 1722500245276 - ] - }, - eventType: 'user' - }, { eventName: 'button-clicked', dataFields: { @@ -169,6 +182,19 @@ describe('compareArrayDataTypes', () => { } ]); } + if (key === SHARED_PREFS_USER_UPDATE_OBJECT_KEY) { + return JSON.stringify({ + dataFields: { + milestoneYears: [1996, 1997, 2002, 2020, 2024], + score: [10.5, 11.5, 12.5, 13.5, 14.5], + timestamp: [ + 1722497422151, 1722500235276, 1722500215276, 1722500225276, + 1722500245276 + ] + }, + eventType: 'user' + }); + } return null; }); @@ -176,8 +202,13 @@ describe('compareArrayDataTypes', () => { SHARED_PREFS_EVENT_LIST_KEY ); + const localStoredUserUpdate = localStorage.getItem( + SHARED_PREFS_USER_UPDATE_OBJECT_KEY + ); + const checker = new CriteriaCompletionChecker( - localStoredEventList === null ? '' : localStoredEventList + localStoredEventList === null ? '' : localStoredEventList, + localStoredUserUpdate === null ? '' : localStoredUserUpdate ); const result = checker.getMatchedCriteria( JSON.stringify(ARRAY_DOES_NOT_EQUAL_CRITERIA) @@ -188,25 +219,24 @@ describe('compareArrayDataTypes', () => { // MARK: GreaterThan it('should return criteriaId 285 (compare array GreaterThan)', () => { (localStorage.getItem as jest.Mock).mockImplementation((key) => { - if (key === SHARED_PREFS_EVENT_LIST_KEY) { - return JSON.stringify([ - { - dataFields: { - milestoneYears: [1996, 1998, 2002, 2020, 2024] - }, - eventType: 'user' - } - ]); + if (key === SHARED_PREFS_USER_UPDATE_OBJECT_KEY) { + return JSON.stringify({ + dataFields: { + milestoneYears: [1996, 1998, 2002, 2020, 2024] + }, + eventType: 'user' + }); } return null; }); - const localStoredEventList = localStorage.getItem( - SHARED_PREFS_EVENT_LIST_KEY + const localStoredUserUpdate = localStorage.getItem( + SHARED_PREFS_USER_UPDATE_OBJECT_KEY ); const checker = new CriteriaCompletionChecker( - localStoredEventList === null ? '' : localStoredEventList + '', + localStoredUserUpdate === null ? '' : localStoredUserUpdate ); const result = checker.getMatchedCriteria( JSON.stringify(ARRAY_GREATER_THAN_CRITERIA) @@ -216,25 +246,24 @@ describe('compareArrayDataTypes', () => { it('should return criteriaId null (compare array GreaterThan - No match)', () => { (localStorage.getItem as jest.Mock).mockImplementation((key) => { - if (key === SHARED_PREFS_EVENT_LIST_KEY) { - return JSON.stringify([ - { - dataFields: { - milestoneYears: [1990, 1992, 1994, 1997] - }, - eventType: 'user' - } - ]); + if (key === SHARED_PREFS_USER_UPDATE_OBJECT_KEY) { + return JSON.stringify({ + dataFields: { + milestoneYears: [1990, 1992, 1994, 1997] + }, + eventType: 'user' + }); } return null; }); - const localStoredEventList = localStorage.getItem( - SHARED_PREFS_EVENT_LIST_KEY + const localStoredUserUpdate = localStorage.getItem( + SHARED_PREFS_USER_UPDATE_OBJECT_KEY ); const checker = new CriteriaCompletionChecker( - localStoredEventList === null ? '' : localStoredEventList + '', + localStoredUserUpdate === null ? '' : localStoredUserUpdate ); const result = checker.getMatchedCriteria( JSON.stringify(ARRAY_GREATER_THAN_CRITERIA) @@ -245,25 +274,24 @@ describe('compareArrayDataTypes', () => { // MARK: LessThan it('should return criteriaId 285 (compare array LessThan)', () => { (localStorage.getItem as jest.Mock).mockImplementation((key) => { - if (key === SHARED_PREFS_EVENT_LIST_KEY) { - return JSON.stringify([ - { - dataFields: { - milestoneYears: [1990, 1992, 1994, 1996, 1998] - }, - eventType: 'user' - } - ]); + if (key === SHARED_PREFS_USER_UPDATE_OBJECT_KEY) { + return JSON.stringify({ + dataFields: { + milestoneYears: [1990, 1992, 1994, 1996, 1998] + }, + eventType: 'user' + }); } return null; }); - const localStoredEventList = localStorage.getItem( - SHARED_PREFS_EVENT_LIST_KEY + const localStoredUserUpdate = localStorage.getItem( + SHARED_PREFS_USER_UPDATE_OBJECT_KEY ); const checker = new CriteriaCompletionChecker( - localStoredEventList === null ? '' : localStoredEventList + '', + localStoredUserUpdate === null ? '' : localStoredUserUpdate ); const result = checker.getMatchedCriteria( JSON.stringify(ARRAY_LESS_THAN_CRITERIA) @@ -273,25 +301,24 @@ describe('compareArrayDataTypes', () => { it('should return criteriaId null (compare array LessThan - No match)', () => { (localStorage.getItem as jest.Mock).mockImplementation((key) => { - if (key === SHARED_PREFS_EVENT_LIST_KEY) { - return JSON.stringify([ - { - dataFields: { - milestoneYears: [1997, 1999, 2002, 2004] - }, - eventType: 'user' - } - ]); + if (key === SHARED_PREFS_USER_UPDATE_OBJECT_KEY) { + return JSON.stringify({ + dataFields: { + milestoneYears: [1997, 1999, 2002, 2004] + }, + eventType: 'user' + }); } return null; }); - const localStoredEventList = localStorage.getItem( - SHARED_PREFS_EVENT_LIST_KEY + const localStoredUserUpdate = localStorage.getItem( + SHARED_PREFS_USER_UPDATE_OBJECT_KEY ); const checker = new CriteriaCompletionChecker( - localStoredEventList === null ? '' : localStoredEventList + '', + localStoredUserUpdate === null ? '' : localStoredUserUpdate ); const result = checker.getMatchedCriteria( JSON.stringify(ARRAY_LESS_THAN_CRITERIA) @@ -302,25 +329,24 @@ describe('compareArrayDataTypes', () => { // MARK: GreaterThanOrEqualTo it('should return criteriaId 285 (compare array GreaterThanOrEqualTo)', () => { (localStorage.getItem as jest.Mock).mockImplementation((key) => { - if (key === SHARED_PREFS_EVENT_LIST_KEY) { - return JSON.stringify([ - { - dataFields: { - milestoneYears: [1997, 1998, 2002, 2020, 2024] - }, - eventType: 'user' - } - ]); + if (key === SHARED_PREFS_USER_UPDATE_OBJECT_KEY) { + return JSON.stringify({ + dataFields: { + milestoneYears: [1997, 1998, 2002, 2020, 2024] + }, + eventType: 'user' + }); } return null; }); - const localStoredEventList = localStorage.getItem( - SHARED_PREFS_EVENT_LIST_KEY + const localStoredUserUpdate = localStorage.getItem( + SHARED_PREFS_USER_UPDATE_OBJECT_KEY ); const checker = new CriteriaCompletionChecker( - localStoredEventList === null ? '' : localStoredEventList + '', + localStoredUserUpdate === null ? '' : localStoredUserUpdate ); const result = checker.getMatchedCriteria( JSON.stringify(ARRAY_GREATER_THAN_EQUAL_TO_CRITERIA) @@ -330,25 +356,24 @@ describe('compareArrayDataTypes', () => { it('should return criteriaId null (compare array GreaterThanOrEqualTo - No match)', () => { (localStorage.getItem as jest.Mock).mockImplementation((key) => { - if (key === SHARED_PREFS_EVENT_LIST_KEY) { - return JSON.stringify([ - { - dataFields: { - milestoneYears: [1990, 1992, 1994, 1996] - }, - eventType: 'user' - } - ]); + if (key === SHARED_PREFS_USER_UPDATE_OBJECT_KEY) { + return JSON.stringify({ + dataFields: { + milestoneYears: [1990, 1992, 1994, 1996] + }, + eventType: 'user' + }); } return null; }); - const localStoredEventList = localStorage.getItem( - SHARED_PREFS_EVENT_LIST_KEY + const localStoredUserUpdate = localStorage.getItem( + SHARED_PREFS_USER_UPDATE_OBJECT_KEY ); const checker = new CriteriaCompletionChecker( - localStoredEventList === null ? '' : localStoredEventList + '', + localStoredUserUpdate === null ? '' : localStoredUserUpdate ); const result = checker.getMatchedCriteria( JSON.stringify(ARRAY_GREATER_THAN_EQUAL_TO_CRITERIA) @@ -359,25 +384,24 @@ describe('compareArrayDataTypes', () => { // MARK: LessThanOrEqualTo it('should return criteriaId 285 (compare array LessThanOrEqualTo)', () => { (localStorage.getItem as jest.Mock).mockImplementation((key) => { - if (key === SHARED_PREFS_EVENT_LIST_KEY) { - return JSON.stringify([ - { - dataFields: { - milestoneYears: [1990, 1992, 1994, 1996, 1998] - }, - eventType: 'user' - } - ]); + if (key === SHARED_PREFS_USER_UPDATE_OBJECT_KEY) { + return JSON.stringify({ + dataFields: { + milestoneYears: [1990, 1992, 1994, 1996, 1998] + }, + eventType: 'user' + }); } return null; }); - const localStoredEventList = localStorage.getItem( - SHARED_PREFS_EVENT_LIST_KEY + const localStoredUserUpdate = localStorage.getItem( + SHARED_PREFS_USER_UPDATE_OBJECT_KEY ); const checker = new CriteriaCompletionChecker( - localStoredEventList === null ? '' : localStoredEventList + '', + localStoredUserUpdate === null ? '' : localStoredUserUpdate ); const result = checker.getMatchedCriteria( JSON.stringify(ARRAY_LESS_THAN_EQUAL_TO_CRITERIA) @@ -387,25 +411,24 @@ describe('compareArrayDataTypes', () => { it('should return criteriaId null (compare array LessThanOrEqualTo - No match)', () => { (localStorage.getItem as jest.Mock).mockImplementation((key) => { - if (key === SHARED_PREFS_EVENT_LIST_KEY) { - return JSON.stringify([ - { - dataFields: { - milestoneYears: [1998, 1999, 2002, 2004] - }, - eventType: 'user' - } - ]); + if (key === SHARED_PREFS_USER_UPDATE_OBJECT_KEY) { + return JSON.stringify({ + dataFields: { + milestoneYears: [1998, 1999, 2002, 2004] + }, + eventType: 'user' + }); } return null; }); - const localStoredEventList = localStorage.getItem( - SHARED_PREFS_EVENT_LIST_KEY + const localStoredUserUpdate = localStorage.getItem( + SHARED_PREFS_USER_UPDATE_OBJECT_KEY ); const checker = new CriteriaCompletionChecker( - localStoredEventList === null ? '' : localStoredEventList + '', + localStoredUserUpdate === null ? '' : localStoredUserUpdate ); const result = checker.getMatchedCriteria( JSON.stringify(ARRAY_LESS_THAN_EQUAL_TO_CRITERIA) @@ -416,33 +439,32 @@ describe('compareArrayDataTypes', () => { // MARK: Contains it('should return criteriaId 285 (compare array Contains)', () => { (localStorage.getItem as jest.Mock).mockImplementation((key) => { - if (key === SHARED_PREFS_EVENT_LIST_KEY) { - return JSON.stringify([ - { - dataFields: { - addresses: [ - 'New York, US', - 'San Francisco, US', - 'San Diego, US', - 'Los Angeles, US', - 'Tokyo, JP', - 'Berlin, DE', - 'London, GB' - ] - }, - eventType: 'user' - } - ]); + if (key === SHARED_PREFS_USER_UPDATE_OBJECT_KEY) { + return JSON.stringify({ + dataFields: { + addresses: [ + 'New York, US', + 'San Francisco, US', + 'San Diego, US', + 'Los Angeles, US', + 'Tokyo, JP', + 'Berlin, DE', + 'London, GB' + ] + }, + eventType: 'user' + }); } return null; }); - const localStoredEventList = localStorage.getItem( - SHARED_PREFS_EVENT_LIST_KEY + const localStoredUserUpdate = localStorage.getItem( + SHARED_PREFS_USER_UPDATE_OBJECT_KEY ); const checker = new CriteriaCompletionChecker( - localStoredEventList === null ? '' : localStoredEventList + '', + localStoredUserUpdate === null ? '' : localStoredUserUpdate ); const result = checker.getMatchedCriteria( JSON.stringify(ARRAY_CONTAINS_CRITERIA) @@ -452,25 +474,24 @@ describe('compareArrayDataTypes', () => { it('should return criteriaId null (compare array Contains - No match)', () => { (localStorage.getItem as jest.Mock).mockImplementation((key) => { - if (key === SHARED_PREFS_EVENT_LIST_KEY) { - return JSON.stringify([ - { - dataFields: { - addresses: ['Tokyo, JP', 'Berlin, DE', 'London, GB'] - }, - eventType: 'user' - } - ]); + if (key === SHARED_PREFS_USER_UPDATE_OBJECT_KEY) { + return JSON.stringify({ + dataFields: { + addresses: ['Tokyo, JP', 'Berlin, DE', 'London, GB'] + }, + eventType: 'user' + }); } return null; }); - const localStoredEventList = localStorage.getItem( - SHARED_PREFS_EVENT_LIST_KEY + const localStoredUserUpdate = localStorage.getItem( + SHARED_PREFS_USER_UPDATE_OBJECT_KEY ); const checker = new CriteriaCompletionChecker( - localStoredEventList === null ? '' : localStoredEventList + '', + localStoredUserUpdate === null ? '' : localStoredUserUpdate ); const result = checker.getMatchedCriteria( JSON.stringify(ARRAY_CONTAINS_CRITERIA) @@ -481,33 +502,32 @@ describe('compareArrayDataTypes', () => { // MARK: StartsWith it('should return criteriaId 285 (compare array StartsWith)', () => { (localStorage.getItem as jest.Mock).mockImplementation((key) => { - if (key === SHARED_PREFS_EVENT_LIST_KEY) { - return JSON.stringify([ - { - dataFields: { - addresses: [ - 'US, New York', - 'US, San Francisco', - 'US, San Diego', - 'US, Los Angeles', - 'JP, Tokyo', - 'DE, Berlin', - 'GB, London' - ] - }, - eventType: 'user' - } - ]); + if (key === SHARED_PREFS_USER_UPDATE_OBJECT_KEY) { + return JSON.stringify({ + dataFields: { + addresses: [ + 'US, New York', + 'US, San Francisco', + 'US, San Diego', + 'US, Los Angeles', + 'JP, Tokyo', + 'DE, Berlin', + 'GB, London' + ] + }, + eventType: 'user' + }); } return null; }); - const localStoredEventList = localStorage.getItem( - SHARED_PREFS_EVENT_LIST_KEY + const localStoredUserUpdate = localStorage.getItem( + SHARED_PREFS_USER_UPDATE_OBJECT_KEY ); const checker = new CriteriaCompletionChecker( - localStoredEventList === null ? '' : localStoredEventList + '', + localStoredUserUpdate === null ? '' : localStoredUserUpdate ); const result = checker.getMatchedCriteria( JSON.stringify(ARRAY_STARTSWITH_CRITERIA) @@ -517,25 +537,24 @@ describe('compareArrayDataTypes', () => { it('should return criteriaId null (compare array StartsWith - No match)', () => { (localStorage.getItem as jest.Mock).mockImplementation((key) => { - if (key === SHARED_PREFS_EVENT_LIST_KEY) { - return JSON.stringify([ - { - dataFields: { - addresses: ['JP, Tokyo', 'DE, Berlin', 'GB, London'] - }, - eventType: 'user' - } - ]); + if (key === SHARED_PREFS_USER_UPDATE_OBJECT_KEY) { + return JSON.stringify({ + dataFields: { + addresses: ['JP, Tokyo', 'DE, Berlin', 'GB, London'] + }, + eventType: 'user' + }); } return null; }); - const localStoredEventList = localStorage.getItem( - SHARED_PREFS_EVENT_LIST_KEY + const localStoredUserUpdate = localStorage.getItem( + SHARED_PREFS_USER_UPDATE_OBJECT_KEY ); const checker = new CriteriaCompletionChecker( - localStoredEventList === null ? '' : localStoredEventList + '', + localStoredUserUpdate === null ? '' : localStoredUserUpdate ); const result = checker.getMatchedCriteria( JSON.stringify(ARRAY_STARTSWITH_CRITERIA) @@ -546,33 +565,32 @@ describe('compareArrayDataTypes', () => { // MARK: MatchesRegex it('should return criteriaId 285 (compare array MatchesRegex)', () => { (localStorage.getItem as jest.Mock).mockImplementation((key) => { - if (key === SHARED_PREFS_EVENT_LIST_KEY) { - return JSON.stringify([ - { - dataFields: { - addresses: [ - 'US, New York', - 'US, San Francisco', - 'US, San Diego', - 'US, Los Angeles', - 'JP, Tokyo', - 'DE, Berlin', - 'GB, London' - ] - }, - eventType: 'user' - } - ]); + if (key === SHARED_PREFS_USER_UPDATE_OBJECT_KEY) { + return JSON.stringify({ + dataFields: { + addresses: [ + 'US, New York', + 'US, San Francisco', + 'US, San Diego', + 'US, Los Angeles', + 'JP, Tokyo', + 'DE, Berlin', + 'GB, London' + ] + }, + eventType: 'user' + }); } return null; }); - const localStoredEventList = localStorage.getItem( - SHARED_PREFS_EVENT_LIST_KEY + const localStoredUserUpdate = localStorage.getItem( + SHARED_PREFS_USER_UPDATE_OBJECT_KEY ); const checker = new CriteriaCompletionChecker( - localStoredEventList === null ? '' : localStoredEventList + '', + localStoredUserUpdate === null ? '' : localStoredUserUpdate ); const result = checker.getMatchedCriteria( @@ -583,30 +601,28 @@ describe('compareArrayDataTypes', () => { it('should return criteriaId null (compare array MatchesRegex - No match)', () => { (localStorage.getItem as jest.Mock).mockImplementation((key) => { - if (key === SHARED_PREFS_EVENT_LIST_KEY) { - return JSON.stringify([ - { - dataFields: { - addresses: [ - 'US, New York', - 'US, San Francisco', - 'US, San Diego', - 'US, Los Angeles' - ] - }, - eventType: 'user' - } - ]); + if (key === SHARED_PREFS_USER_UPDATE_OBJECT_KEY) { + return JSON.stringify({ + dataFields: { + addresses: [ + 'US, New York', + 'US, San Francisco', + 'US, San Diego', + 'US, Los Angeles' + ] + }, + eventType: 'user' + }); } return null; }); - const localStoredEventList = localStorage.getItem( - SHARED_PREFS_EVENT_LIST_KEY + const localStoredUserUpdate = localStorage.getItem( + SHARED_PREFS_USER_UPDATE_OBJECT_KEY ); const checker = new CriteriaCompletionChecker( - localStoredEventList === null ? '' : localStoredEventList + localStoredUserUpdate === null ? '' : localStoredUserUpdate ); const result = checker.getMatchedCriteria( @@ -618,26 +634,25 @@ describe('compareArrayDataTypes', () => { // MARK: IsOneOf it('should return criteriaId 299 (compare array IsOneOf)', () => { (localStorage.getItem as jest.Mock).mockImplementation((key) => { - if (key === SHARED_PREFS_EVENT_LIST_KEY) { - return JSON.stringify([ - { - dataFields: { - country: 'China', - addresses: ['US', 'UK', 'JP', 'DE', 'GB'] - }, - eventType: 'user' - } - ]); + if (key === SHARED_PREFS_USER_UPDATE_OBJECT_KEY) { + return JSON.stringify({ + dataFields: { + country: 'China', + addresses: ['US', 'UK', 'JP', 'DE', 'GB'] + }, + eventType: 'user' + }); } return null; }); - const localStoredEventList = localStorage.getItem( - SHARED_PREFS_EVENT_LIST_KEY + const localStoredUserUpdate = localStorage.getItem( + SHARED_PREFS_USER_UPDATE_OBJECT_KEY ); const checker = new CriteriaCompletionChecker( - localStoredEventList === null ? '' : localStoredEventList + '', + localStoredUserUpdate === null ? '' : localStoredUserUpdate ); const result = checker.getMatchedCriteria( @@ -648,26 +663,25 @@ describe('compareArrayDataTypes', () => { it('should return criteriaId null (compare array IsOneOf - No match)', () => { (localStorage.getItem as jest.Mock).mockImplementation((key) => { - if (key === SHARED_PREFS_EVENT_LIST_KEY) { - return JSON.stringify([ - { - dataFields: { - country: 'Korea', - addresses: ['US', 'UK'] - }, - eventType: 'user' - } - ]); + if (key === SHARED_PREFS_USER_UPDATE_OBJECT_KEY) { + return JSON.stringify({ + dataFields: { + country: 'Korea', + addresses: ['US', 'UK'] + }, + eventType: 'user' + }); } return null; }); - const localStoredEventList = localStorage.getItem( - SHARED_PREFS_EVENT_LIST_KEY + const localStoredUserUpdate = localStorage.getItem( + SHARED_PREFS_USER_UPDATE_OBJECT_KEY ); const checker = new CriteriaCompletionChecker( - localStoredEventList === null ? '' : localStoredEventList + '', + localStoredUserUpdate === null ? '' : localStoredUserUpdate ); const result = checker.getMatchedCriteria( @@ -679,26 +693,25 @@ describe('compareArrayDataTypes', () => { // MARK: IsNotOneOf it('should return criteriaId 299 (compare array IsNotOneOf)', () => { (localStorage.getItem as jest.Mock).mockImplementation((key) => { - if (key === SHARED_PREFS_EVENT_LIST_KEY) { - return JSON.stringify([ - { - dataFields: { - country: 'Korea', - addresses: ['US', 'UK'] - }, - eventType: 'user' - } - ]); + if (key === SHARED_PREFS_USER_UPDATE_OBJECT_KEY) { + return JSON.stringify({ + dataFields: { + country: 'Korea', + addresses: ['US', 'UK'] + }, + eventType: 'user' + }); } return null; }); - const localStoredEventList = localStorage.getItem( - SHARED_PREFS_EVENT_LIST_KEY + const localStoredUserUpdate = localStorage.getItem( + SHARED_PREFS_USER_UPDATE_OBJECT_KEY ); const checker = new CriteriaCompletionChecker( - localStoredEventList === null ? '' : localStoredEventList + '', + localStoredUserUpdate === null ? '' : localStoredUserUpdate ); const result = checker.getMatchedCriteria( @@ -709,26 +722,25 @@ describe('compareArrayDataTypes', () => { it('should return criteriaId null (compare array IsNotOneOf - No match)', () => { (localStorage.getItem as jest.Mock).mockImplementation((key) => { - if (key === SHARED_PREFS_EVENT_LIST_KEY) { - return JSON.stringify([ - { - dataFields: { - country: 'China', - addresses: ['US', 'UK', 'JP', 'DE', 'GB'] - }, - eventType: 'user' - } - ]); + if (key === SHARED_PREFS_USER_UPDATE_OBJECT_KEY) { + return JSON.stringify({ + dataFields: { + country: 'China', + addresses: ['US', 'UK', 'JP', 'DE', 'GB'] + }, + eventType: 'user' + }); } return null; }); - const localStoredEventList = localStorage.getItem( - SHARED_PREFS_EVENT_LIST_KEY + const localStoredUserUpdate = localStorage.getItem( + SHARED_PREFS_USER_UPDATE_OBJECT_KEY ); const checker = new CriteriaCompletionChecker( - localStoredEventList === null ? '' : localStoredEventList + '', + localStoredUserUpdate === null ? '' : localStoredUserUpdate ); const result = checker.getMatchedCriteria( diff --git a/src/anonymousUserTracking/tests/complexCriteria.test.ts b/src/anonymousUserTracking/tests/complexCriteria.test.ts index 973262eb..85a84222 100644 --- a/src/anonymousUserTracking/tests/complexCriteria.test.ts +++ b/src/anonymousUserTracking/tests/complexCriteria.test.ts @@ -1,4 +1,7 @@ -import { SHARED_PREFS_EVENT_LIST_KEY } from '../../constants'; +import { + SHARED_PREFS_EVENT_LIST_KEY, + SHARED_PREFS_USER_UPDATE_OBJECT_KEY +} from '../../constants'; import CriteriaCompletionChecker from '../criteriaCompletionChecker'; import { COMPLEX_CRITERIA_1, @@ -33,16 +36,19 @@ describe('complexCriteria', () => { ], total: 50, eventType: 'purchase' - }, - { - dataFields: { - preferred_car_models: 'Honda', - country: 'Japan' - }, - eventType: 'user' } ]); } + + if (key === SHARED_PREFS_USER_UPDATE_OBJECT_KEY) { + return JSON.stringify({ + dataFields: { + preferred_car_models: 'Honda', + country: 'Japan' + }, + eventType: 'user' + }); + } return null; }); @@ -50,8 +56,13 @@ describe('complexCriteria', () => { SHARED_PREFS_EVENT_LIST_KEY ); + const localStoredUserUpdate = localStorage.getItem( + SHARED_PREFS_USER_UPDATE_OBJECT_KEY + ); + const checker = new CriteriaCompletionChecker( - localStoredEventList === null ? '' : localStoredEventList + localStoredEventList === null ? '' : localStoredEventList, + localStoredUserUpdate === null ? '' : localStoredUserUpdate ); const result = checker.getMatchedCriteria( JSON.stringify({ @@ -198,15 +209,18 @@ describe('complexCriteria', () => { ], total: 50, eventType: 'purchase' - }, - { - dataFields: { - preferred_car_models: 'Honda' - }, - eventType: 'user' } ]); } + + if (key === SHARED_PREFS_USER_UPDATE_OBJECT_KEY) { + return JSON.stringify({ + dataFields: { + preferred_car_models: 'Honda' + }, + eventType: 'user' + }); + } return null; }); @@ -214,8 +228,13 @@ describe('complexCriteria', () => { SHARED_PREFS_EVENT_LIST_KEY ); + const localStoredUserUpdate = localStorage.getItem( + SHARED_PREFS_USER_UPDATE_OBJECT_KEY + ); + const checker = new CriteriaCompletionChecker( - localStoredEventList === null ? '' : localStoredEventList + localStoredEventList === null ? '' : localStoredEventList, + localStoredUserUpdate === null ? '' : localStoredUserUpdate ); const result = checker.getMatchedCriteria( JSON.stringify({ @@ -360,16 +379,18 @@ describe('complexCriteria', () => { items: [{ id: '12', name: 'Mocha', price: 90, quantity: 50 }], total: 50, eventType: 'cartUpdate' - }, - { - dataFields: { - preferred_car_models: 'Subaru', - country: 'USA' - }, - eventType: 'user' } ]); } + if (key === SHARED_PREFS_USER_UPDATE_OBJECT_KEY) { + return JSON.stringify({ + dataFields: { + preferred_car_models: 'Subaru', + country: 'USA' + }, + eventType: 'user' + }); + } return null; }); @@ -377,8 +398,13 @@ describe('complexCriteria', () => { SHARED_PREFS_EVENT_LIST_KEY ); + const localStoredUserUpdate = localStorage.getItem( + SHARED_PREFS_USER_UPDATE_OBJECT_KEY + ); + const checker = new CriteriaCompletionChecker( - localStoredEventList === null ? '' : localStoredEventList + localStoredEventList === null ? '' : localStoredEventList, + localStoredUserUpdate === null ? '' : localStoredUserUpdate ); const result = checker.getMatchedCriteria( JSON.stringify({ @@ -521,16 +547,18 @@ describe('complexCriteria', () => { items: [{ id: '12', name: 'Mocha', price: 90, quantity: 50 }], total: 50, eventType: 'cartUpdate' - }, - { - dataFields: { - preferred_car_models: 'Subaru', - country: 'USA' - }, - eventType: 'user' } ]); } + if (key === SHARED_PREFS_USER_UPDATE_OBJECT_KEY) { + return JSON.stringify({ + dataFields: { + preferred_car_models: 'Subaru', + country: 'USA' + }, + eventType: 'user' + }); + } return null; }); @@ -538,8 +566,13 @@ describe('complexCriteria', () => { SHARED_PREFS_EVENT_LIST_KEY ); + const localStoredUserUpdate = localStorage.getItem( + SHARED_PREFS_USER_UPDATE_OBJECT_KEY + ); + const checker = new CriteriaCompletionChecker( - localStoredEventList === null ? '' : localStoredEventList + localStoredEventList === null ? '' : localStoredEventList, + localStoredUserUpdate === null ? '' : localStoredUserUpdate ); const result = checker.getMatchedCriteria( JSON.stringify({ @@ -688,14 +721,6 @@ describe('complexCriteria', () => { total: 50, eventType: 'cartUpdate' }, - - { - dataFields: { - preferred_car_models: 'Subaru', - country: 'USA' - }, - eventType: 'user' - }, { eventName: 'button-clicked', dataFields: { @@ -717,6 +742,15 @@ describe('complexCriteria', () => { } ]); } + if (key === SHARED_PREFS_USER_UPDATE_OBJECT_KEY) { + return JSON.stringify({ + dataFields: { + preferred_car_models: 'Subaru', + country: 'USA' + }, + eventType: 'user' + }); + } return null; }); @@ -724,8 +758,13 @@ describe('complexCriteria', () => { SHARED_PREFS_EVENT_LIST_KEY ); + const localStoredUserUpdate = localStorage.getItem( + SHARED_PREFS_USER_UPDATE_OBJECT_KEY + ); + const checker = new CriteriaCompletionChecker( - localStoredEventList === null ? '' : localStoredEventList + localStoredEventList === null ? '' : localStoredEventList, + localStoredUserUpdate === null ? '' : localStoredUserUpdate ); const result = checker.getMatchedCriteria( JSON.stringify({ @@ -868,14 +907,6 @@ describe('complexCriteria', () => { total: 50, eventType: 'cartUpdate' }, - - { - dataFields: { - preferred_car_models: 'Subaru', - country: 'USA' - }, - eventType: 'user' - }, { eventName: 'button-clicked', dataFields: { @@ -885,6 +916,15 @@ describe('complexCriteria', () => { } ]); } + if (key === SHARED_PREFS_USER_UPDATE_OBJECT_KEY) { + return JSON.stringify({ + dataFields: { + preferred_car_models: 'Subaru', + country: 'USA' + }, + eventType: 'user' + }); + } return null; }); @@ -892,8 +932,13 @@ describe('complexCriteria', () => { SHARED_PREFS_EVENT_LIST_KEY ); + const localStoredUserUpdate = localStorage.getItem( + SHARED_PREFS_USER_UPDATE_OBJECT_KEY + ); + const checker = new CriteriaCompletionChecker( - localStoredEventList === null ? '' : localStoredEventList + localStoredEventList === null ? '' : localStoredEventList, + localStoredUserUpdate === null ? '' : localStoredUserUpdate ); const result = checker.getMatchedCriteria( JSON.stringify({ @@ -1128,7 +1173,7 @@ describe('complexCriteria', () => { { items: [ { id: '12', name: 'sneakers', price: 10, quantity: 2 }, - { id: '13', name: 'slippers', price: 10, quantity: 3 } + { id: '13', name: 'slippers', price: 10, quantity: 2 } ], total: 2, eventType: 'purchase' @@ -1231,15 +1276,17 @@ describe('complexCriteria', () => { { items: [{ id: '12', name: 'Mocha', price: 50.0, quantity: 50 }], eventType: 'cartUpdate' - }, - { - dataFields: { - preferred_car_models: 'Honda' - }, - eventType: 'user' } ]); } + if (key === SHARED_PREFS_USER_UPDATE_OBJECT_KEY) { + return JSON.stringify({ + dataFields: { + preferred_car_models: 'Honda' + }, + eventType: 'user' + }); + } return null; }); @@ -1247,8 +1294,13 @@ describe('complexCriteria', () => { SHARED_PREFS_EVENT_LIST_KEY ); + const localStoredUserUpdate = localStorage.getItem( + SHARED_PREFS_USER_UPDATE_OBJECT_KEY + ); + const checker = new CriteriaCompletionChecker( - localStoredEventList === null ? '' : localStoredEventList + localStoredEventList === null ? '' : localStoredEventList, + localStoredUserUpdate === null ? '' : localStoredUserUpdate ); const result = checker.getMatchedCriteria( JSON.stringify({ @@ -1620,13 +1672,17 @@ describe('complexCriteria', () => { { dataFields: { reason: 'testing', total: 30 }, eventType: 'purchase' - }, - { - dataFields: { firstName: 'Adam' }, - eventType: 'user' } ]); } + if (key === SHARED_PREFS_USER_UPDATE_OBJECT_KEY) { + return JSON.stringify({ + dataFields: { + firstName: 'Adam' + }, + eventType: 'user' + }); + } return null; }); @@ -1634,8 +1690,13 @@ describe('complexCriteria', () => { SHARED_PREFS_EVENT_LIST_KEY ); + const localStoredUserUpdate = localStorage.getItem( + SHARED_PREFS_USER_UPDATE_OBJECT_KEY + ); + const checker = new CriteriaCompletionChecker( - localStoredEventList === null ? '' : localStoredEventList + localStoredEventList === null ? '' : localStoredEventList, + localStoredUserUpdate === null ? '' : localStoredUserUpdate ); const result = checker.getMatchedCriteria( JSON.stringify(COMPLEX_CRITERIA_1) @@ -1647,12 +1708,6 @@ describe('complexCriteria', () => { (localStorage.getItem as jest.Mock).mockImplementation((key) => { if (key === SHARED_PREFS_EVENT_LIST_KEY) { return JSON.stringify([ - { - eventType: 'user', - dataFields: { - firstName: 'Alex' - } - }, { eventType: 'customEvent', eventName: 'saved_cars', @@ -1676,6 +1731,14 @@ describe('complexCriteria', () => { } ]); } + if (key === SHARED_PREFS_USER_UPDATE_OBJECT_KEY) { + return JSON.stringify({ + eventType: 'user', + dataFields: { + firstName: 'Alex' + } + }); + } return null; }); @@ -1683,8 +1746,13 @@ describe('complexCriteria', () => { SHARED_PREFS_EVENT_LIST_KEY ); + const localStoredUserUpdate = localStorage.getItem( + SHARED_PREFS_USER_UPDATE_OBJECT_KEY + ); + const checker = new CriteriaCompletionChecker( - localStoredEventList === null ? '' : localStoredEventList + localStoredEventList === null ? '' : localStoredEventList, + localStoredUserUpdate === null ? '' : localStoredUserUpdate ); const result = checker.getMatchedCriteria( JSON.stringify(COMPLEX_CRITERIA_1) @@ -1697,12 +1765,6 @@ describe('complexCriteria', () => { (localStorage.getItem as jest.Mock).mockImplementation((key) => { if (key === SHARED_PREFS_EVENT_LIST_KEY) { return JSON.stringify([ - { - eventType: 'user', - dataFields: { - firstName: 'xcode' - } - }, { eventType: 'customEvent', eventName: 'saved_cars', @@ -1726,6 +1788,14 @@ describe('complexCriteria', () => { } ]); } + if (key === SHARED_PREFS_USER_UPDATE_OBJECT_KEY) { + return JSON.stringify({ + eventType: 'user', + dataFields: { + firstName: 'xcode' + } + }); + } return null; }); @@ -1733,8 +1803,13 @@ describe('complexCriteria', () => { SHARED_PREFS_EVENT_LIST_KEY ); + const localStoredUserUpdate = localStorage.getItem( + SHARED_PREFS_USER_UPDATE_OBJECT_KEY + ); + const checker = new CriteriaCompletionChecker( - localStoredEventList === null ? '' : localStoredEventList + localStoredEventList === null ? '' : localStoredEventList, + localStoredUserUpdate === null ? '' : localStoredUserUpdate ); const result = checker.getMatchedCriteria( JSON.stringify(COMPLEX_CRITERIA_2) @@ -1746,12 +1821,6 @@ describe('complexCriteria', () => { (localStorage.getItem as jest.Mock).mockImplementation((key) => { if (key === SHARED_PREFS_EVENT_LIST_KEY) { return JSON.stringify([ - { - eventType: 'user', - dataFields: { - firstName: 'Alex' - } - }, { eventType: 'purchase', dataFields: { @@ -1761,6 +1830,14 @@ describe('complexCriteria', () => { } ]); } + if (key === SHARED_PREFS_USER_UPDATE_OBJECT_KEY) { + return JSON.stringify({ + dataFields: { + firstName: 'Alex' + }, + eventType: 'user' + }); + } return null; }); @@ -1768,8 +1845,13 @@ describe('complexCriteria', () => { SHARED_PREFS_EVENT_LIST_KEY ); + const localStoredUserUpdate = localStorage.getItem( + SHARED_PREFS_USER_UPDATE_OBJECT_KEY + ); + const checker = new CriteriaCompletionChecker( - localStoredEventList === null ? '' : localStoredEventList + localStoredEventList === null ? '' : localStoredEventList, + localStoredUserUpdate === null ? '' : localStoredUserUpdate ); const result = checker.getMatchedCriteria( JSON.stringify(COMPLEX_CRITERIA_2) @@ -1819,13 +1901,6 @@ describe('complexCriteria', () => { (localStorage.getItem as jest.Mock).mockImplementation((key) => { if (key === SHARED_PREFS_EVENT_LIST_KEY) { return JSON.stringify([ - { - eventType: 'user', - dataFields: { - firstName: 'Alex', - lastName: 'Aris' - } - }, { eventType: 'customEvent', eventName: 'animal-found', @@ -1836,6 +1911,15 @@ describe('complexCriteria', () => { } ]); } + if (key === SHARED_PREFS_USER_UPDATE_OBJECT_KEY) { + return JSON.stringify({ + eventType: 'user', + dataFields: { + firstName: 'Alex', + lastName: 'Aris' + } + }); + } return null; }); @@ -1843,8 +1927,13 @@ describe('complexCriteria', () => { SHARED_PREFS_EVENT_LIST_KEY ); + const localStoredUserUpdate = localStorage.getItem( + SHARED_PREFS_USER_UPDATE_OBJECT_KEY + ); + const checker = new CriteriaCompletionChecker( - localStoredEventList === null ? '' : localStoredEventList + localStoredEventList === null ? '' : localStoredEventList, + localStoredUserUpdate === null ? '' : localStoredUserUpdate ); const result = checker.getMatchedCriteria( JSON.stringify(COMPLEX_CRITERIA_3) diff --git a/src/anonymousUserTracking/tests/criteriaCompletionChecker.test.ts b/src/anonymousUserTracking/tests/criteriaCompletionChecker.test.ts index 931a188c..73bfe3c2 100644 --- a/src/anonymousUserTracking/tests/criteriaCompletionChecker.test.ts +++ b/src/anonymousUserTracking/tests/criteriaCompletionChecker.test.ts @@ -1,4 +1,7 @@ -import { SHARED_PREFS_EVENT_LIST_KEY } from '../../constants'; +import { + SHARED_PREFS_EVENT_LIST_KEY, + SHARED_PREFS_USER_UPDATE_OBJECT_KEY +} from '../../constants'; import CriteriaCompletionChecker from '../criteriaCompletionChecker'; const localStorageMock = { @@ -732,28 +735,27 @@ describe('CriteriaCompletionChecker', () => { // isSet criteria it('should return criteriaId 97 if isset user criteria is matched', () => { (localStorage.getItem as jest.Mock).mockImplementation((key) => { - if (key === SHARED_PREFS_EVENT_LIST_KEY) { - return JSON.stringify([ - { - dataFields: { - country: 'UK', - eventTimeStamp: 10, - phoneNumberDetails: '99999999', - 'shoppingCartItems.price': 50.5 - }, - eventType: 'user' - } - ]); + if (key === SHARED_PREFS_USER_UPDATE_OBJECT_KEY) { + return JSON.stringify({ + dataFields: { + country: 'UK', + eventTimeStamp: 10, + phoneNumberDetails: '99999999', + 'shoppingCartItems.price': 50.5 + }, + eventType: 'user' + }); } return null; }); - const localStoredEventList = localStorage.getItem( - SHARED_PREFS_EVENT_LIST_KEY + const localStoredUserUpdate = localStorage.getItem( + SHARED_PREFS_USER_UPDATE_OBJECT_KEY ); const checker = new CriteriaCompletionChecker( - localStoredEventList === null ? '' : localStoredEventList + '', + localStoredUserUpdate === null ? '' : localStoredUserUpdate ); const result = checker.getMatchedCriteria( JSON.stringify({ @@ -824,27 +826,26 @@ describe('CriteriaCompletionChecker', () => { it('should return null (isset user criteria fail)', () => { (localStorage.getItem as jest.Mock).mockImplementation((key) => { - if (key === SHARED_PREFS_EVENT_LIST_KEY) { - return JSON.stringify([ - { - dataFields: { - eventTimeStamp: 10, - phoneNumberDetails: '99999999', - 'shoppingCartItems.price': 50.5 - }, - eventType: 'user' - } - ]); + if (key === SHARED_PREFS_USER_UPDATE_OBJECT_KEY) { + return JSON.stringify({ + dataFields: { + eventTimeStamp: 10, + phoneNumberDetails: '99999999', + 'shoppingCartItems.price': 50.5 + }, + eventType: 'user' + }); } return null; }); - const localStoredEventList = localStorage.getItem( - SHARED_PREFS_EVENT_LIST_KEY + const localStoredUserUpdate = localStorage.getItem( + SHARED_PREFS_USER_UPDATE_OBJECT_KEY ); const checker = new CriteriaCompletionChecker( - localStoredEventList === null ? '' : localStoredEventList + '', + localStoredUserUpdate === null ? '' : localStoredUserUpdate ); const result = checker.getMatchedCriteria( JSON.stringify({ @@ -1453,26 +1454,25 @@ describe('CriteriaCompletionChecker', () => { it('should return criteriaId 100 (boolean test)', () => { (localStorage.getItem as jest.Mock).mockImplementation((key) => { - if (key === SHARED_PREFS_EVENT_LIST_KEY) { - return JSON.stringify([ - { - dataFields: { - subscribed: true, - phoneNumber: '99999999' - }, - eventType: 'user' - } - ]); + if (key === SHARED_PREFS_USER_UPDATE_OBJECT_KEY) { + return JSON.stringify({ + dataFields: { + subscribed: true, + phoneNumber: '99999999' + }, + eventType: 'user' + }); } return null; }); - const localStoredEventList = localStorage.getItem( - SHARED_PREFS_EVENT_LIST_KEY + const localStoredUserUpdate = localStorage.getItem( + SHARED_PREFS_USER_UPDATE_OBJECT_KEY ); const checker = new CriteriaCompletionChecker( - localStoredEventList === null ? '' : localStoredEventList + '', + localStoredUserUpdate === null ? '' : localStoredUserUpdate ); const result = checker.getMatchedCriteria( JSON.stringify({ @@ -1526,26 +1526,25 @@ describe('CriteriaCompletionChecker', () => { it('should return criteriaId 194 if Contact: Phone Number != 57688559', () => { (localStorage.getItem as jest.Mock).mockImplementation((key) => { - if (key === SHARED_PREFS_EVENT_LIST_KEY) { - return JSON.stringify([ - { - dataFields: { - subscribed: true, - phoneNumber: '123685748641' - }, - eventType: 'user' - } - ]); + if (key === SHARED_PREFS_USER_UPDATE_OBJECT_KEY) { + return JSON.stringify({ + dataFields: { + subscribed: true, + phoneNumber: '123685748641' + }, + eventType: 'user' + }); } return null; }); - const localStoredEventList = localStorage.getItem( - SHARED_PREFS_EVENT_LIST_KEY + const localStoredUserUpdate = localStorage.getItem( + SHARED_PREFS_USER_UPDATE_OBJECT_KEY ); const checker = new CriteriaCompletionChecker( - localStoredEventList === null ? '' : localStoredEventList + '', + localStoredUserUpdate === null ? '' : localStoredUserUpdate ); const result = checker.getMatchedCriteria( JSON.stringify({ @@ -1590,26 +1589,25 @@ describe('CriteriaCompletionChecker', () => { it('should return criteriaId 293 if Contact: subscribed != false', () => { (localStorage.getItem as jest.Mock).mockImplementation((key) => { - if (key === SHARED_PREFS_EVENT_LIST_KEY) { - return JSON.stringify([ - { - dataFields: { - subscribed: true, - phoneNumber: '123685748641' - }, - eventType: 'user' - } - ]); + if (key === SHARED_PREFS_USER_UPDATE_OBJECT_KEY) { + return JSON.stringify({ + dataFields: { + subscribed: true, + phoneNumber: '123685748641' + }, + eventType: 'user' + }); } return null; }); - const localStoredEventList = localStorage.getItem( - SHARED_PREFS_EVENT_LIST_KEY + const localStoredUserUpdate = localStorage.getItem( + SHARED_PREFS_USER_UPDATE_OBJECT_KEY ); const checker = new CriteriaCompletionChecker( - localStoredEventList === null ? '' : localStoredEventList + '', + localStoredUserUpdate === null ? '' : localStoredUserUpdate ); const result = checker.getMatchedCriteria( JSON.stringify({ diff --git a/src/anonymousUserTracking/tests/dataTypeComparatorSearchQueryCriteria.test.ts b/src/anonymousUserTracking/tests/dataTypeComparatorSearchQueryCriteria.test.ts index e75cf9f4..24c286a0 100644 --- a/src/anonymousUserTracking/tests/dataTypeComparatorSearchQueryCriteria.test.ts +++ b/src/anonymousUserTracking/tests/dataTypeComparatorSearchQueryCriteria.test.ts @@ -1,4 +1,4 @@ -import { SHARED_PREFS_EVENT_LIST_KEY } from '../../constants'; +import { SHARED_PREFS_USER_UPDATE_OBJECT_KEY } from '../../constants'; import CriteriaCompletionChecker from '../criteriaCompletionChecker'; import { DATA_TYPE_COMPARATOR_DOES_NOT_EQUAL, @@ -23,28 +23,27 @@ describe('dataTypeComparatorSearchQueryCriteria', () => { it('should return criteriaId 285 (Comparator test For Equal)', () => { (localStorage.getItem as jest.Mock).mockImplementation((key) => { - if (key === SHARED_PREFS_EVENT_LIST_KEY) { - return JSON.stringify([ - { - dataFields: { - savings: 19.99, - likes_boba: true, - country: 'Chaina', - eventTimeStamp: 3 - }, - eventType: 'user' - } - ]); + if (key === SHARED_PREFS_USER_UPDATE_OBJECT_KEY) { + return JSON.stringify({ + dataFields: { + savings: 19.99, + likes_boba: true, + country: 'Chaina', + eventTimeStamp: 3 + }, + eventType: 'user' + }); } return null; }); - const localStoredEventList = localStorage.getItem( - SHARED_PREFS_EVENT_LIST_KEY + const localStoredUserUpdate = localStorage.getItem( + SHARED_PREFS_USER_UPDATE_OBJECT_KEY ); const checker = new CriteriaCompletionChecker( - localStoredEventList === null ? '' : localStoredEventList + '', + localStoredUserUpdate === null ? '' : localStoredUserUpdate ); const result = checker.getMatchedCriteria( JSON.stringify(DATA_TYPE_COMPARATOR_EQUALS) @@ -54,28 +53,27 @@ describe('dataTypeComparatorSearchQueryCriteria', () => { it('should return null (Comparator test For Equal - No Match)', () => { (localStorage.getItem as jest.Mock).mockImplementation((key) => { - if (key === SHARED_PREFS_EVENT_LIST_KEY) { - return JSON.stringify([ - { - dataFields: { - savings: 10.99, - eventTimeStamp: 30, - likes_boba: false, - country: 'Taiwan' - }, - eventType: 'user' - } - ]); + if (key === SHARED_PREFS_USER_UPDATE_OBJECT_KEY) { + return JSON.stringify({ + dataFields: { + savings: 10.99, + eventTimeStamp: 30, + likes_boba: false, + country: 'Taiwan' + }, + eventType: 'user' + }); } return null; }); - const localStoredEventList = localStorage.getItem( - SHARED_PREFS_EVENT_LIST_KEY + const localStoredUserUpdate = localStorage.getItem( + SHARED_PREFS_USER_UPDATE_OBJECT_KEY ); const checker = new CriteriaCompletionChecker( - localStoredEventList === null ? '' : localStoredEventList + '', + localStoredUserUpdate === null ? '' : localStoredUserUpdate ); const result = checker.getMatchedCriteria( JSON.stringify(DATA_TYPE_COMPARATOR_EQUALS) @@ -85,27 +83,26 @@ describe('dataTypeComparatorSearchQueryCriteria', () => { it('should return criteriaId 285 (Comparator test For DoesNotEqual)', () => { (localStorage.getItem as jest.Mock).mockImplementation((key) => { - if (key === SHARED_PREFS_EVENT_LIST_KEY) { - return JSON.stringify([ - { - dataFields: { - savings: 11.2, - eventTimeStamp: 30, - likes_boba: false - }, - eventType: 'user' - } - ]); + if (key === SHARED_PREFS_USER_UPDATE_OBJECT_KEY) { + return JSON.stringify({ + dataFields: { + savings: 11.2, + eventTimeStamp: 30, + likes_boba: false + }, + eventType: 'user' + }); } return null; }); - const localStoredEventList = localStorage.getItem( - SHARED_PREFS_EVENT_LIST_KEY + const localStoredUserUpdate = localStorage.getItem( + SHARED_PREFS_USER_UPDATE_OBJECT_KEY ); const checker = new CriteriaCompletionChecker( - localStoredEventList === null ? '' : localStoredEventList + '', + localStoredUserUpdate === null ? '' : localStoredUserUpdate ); const result = checker.getMatchedCriteria( JSON.stringify(DATA_TYPE_COMPARATOR_DOES_NOT_EQUAL) @@ -115,27 +112,26 @@ describe('dataTypeComparatorSearchQueryCriteria', () => { it('should return null (Comparator test For DoesNotEqual - No Match)', () => { (localStorage.getItem as jest.Mock).mockImplementation((key) => { - if (key === SHARED_PREFS_EVENT_LIST_KEY) { - return JSON.stringify([ - { - dataFields: { - savings: 10.99, - eventTimeStamp: 30, - likes_boba: true - }, - eventType: 'user' - } - ]); + if (key === SHARED_PREFS_USER_UPDATE_OBJECT_KEY) { + return JSON.stringify({ + dataFields: { + savings: 10.99, + eventTimeStamp: 30, + likes_boba: true + }, + eventType: 'user' + }); } return null; }); - const localStoredEventList = localStorage.getItem( - SHARED_PREFS_EVENT_LIST_KEY + const localStoredUserUpdate = localStorage.getItem( + SHARED_PREFS_USER_UPDATE_OBJECT_KEY ); const checker = new CriteriaCompletionChecker( - localStoredEventList === null ? '' : localStoredEventList + '', + localStoredUserUpdate === null ? '' : localStoredUserUpdate ); const result = checker.getMatchedCriteria( JSON.stringify(DATA_TYPE_COMPARATOR_DOES_NOT_EQUAL) @@ -145,26 +141,25 @@ describe('dataTypeComparatorSearchQueryCriteria', () => { it('should return criteriaId 289 (Comparator test For LessThan)', () => { (localStorage.getItem as jest.Mock).mockImplementation((key) => { - if (key === SHARED_PREFS_EVENT_LIST_KEY) { - return JSON.stringify([ - { - dataFields: { - savings: 10, - eventTimeStamp: 14 - }, - eventType: 'user' - } - ]); + if (key === SHARED_PREFS_USER_UPDATE_OBJECT_KEY) { + return JSON.stringify({ + dataFields: { + savings: 10, + eventTimeStamp: 14 + }, + eventType: 'user' + }); } return null; }); - const localStoredEventList = localStorage.getItem( - SHARED_PREFS_EVENT_LIST_KEY + const localStoredUserUpdate = localStorage.getItem( + SHARED_PREFS_USER_UPDATE_OBJECT_KEY ); const checker = new CriteriaCompletionChecker( - localStoredEventList === null ? '' : localStoredEventList + '', + localStoredUserUpdate === null ? '' : localStoredUserUpdate ); const result = checker.getMatchedCriteria( JSON.stringify(DATA_TYPE_COMPARATOR_LESS_THAN) @@ -174,26 +169,25 @@ describe('dataTypeComparatorSearchQueryCriteria', () => { it('should return null (Comparator test For LessThan - No Match)', () => { (localStorage.getItem as jest.Mock).mockImplementation((key) => { - if (key === SHARED_PREFS_EVENT_LIST_KEY) { - return JSON.stringify([ - { - dataFields: { - savings: 10, - eventTimeStamp: 18 - }, - eventType: 'user' - } - ]); + if (key === SHARED_PREFS_USER_UPDATE_OBJECT_KEY) { + return JSON.stringify({ + dataFields: { + savings: 10, + eventTimeStamp: 18 + }, + eventType: 'user' + }); } return null; }); - const localStoredEventList = localStorage.getItem( - SHARED_PREFS_EVENT_LIST_KEY + const localStoredUserUpdate = localStorage.getItem( + SHARED_PREFS_USER_UPDATE_OBJECT_KEY ); const checker = new CriteriaCompletionChecker( - localStoredEventList === null ? '' : localStoredEventList + '', + localStoredUserUpdate === null ? '' : localStoredUserUpdate ); const result = checker.getMatchedCriteria( JSON.stringify(DATA_TYPE_COMPARATOR_LESS_THAN) @@ -203,26 +197,25 @@ describe('dataTypeComparatorSearchQueryCriteria', () => { it('should return criteriaId 290 (Comparator test For LessThanOrEqualTo)', () => { (localStorage.getItem as jest.Mock).mockImplementation((key) => { - if (key === SHARED_PREFS_EVENT_LIST_KEY) { - return JSON.stringify([ - { - dataFields: { - savings: 17, - eventTimeStamp: 14 - }, - eventType: 'user' - } - ]); + if (key === SHARED_PREFS_USER_UPDATE_OBJECT_KEY) { + return JSON.stringify({ + dataFields: { + savings: 17, + eventTimeStamp: 14 + }, + eventType: 'user' + }); } return null; }); - const localStoredEventList = localStorage.getItem( - SHARED_PREFS_EVENT_LIST_KEY + const localStoredUserUpdate = localStorage.getItem( + SHARED_PREFS_USER_UPDATE_OBJECT_KEY ); const checker = new CriteriaCompletionChecker( - localStoredEventList === null ? '' : localStoredEventList + '', + localStoredUserUpdate === null ? '' : localStoredUserUpdate ); const result = checker.getMatchedCriteria( JSON.stringify(DATA_TYPE_COMPARATOR_LESS_THAN_OR_EQUAL_TO) @@ -232,26 +225,25 @@ describe('dataTypeComparatorSearchQueryCriteria', () => { it('should return null (Comparator test For LessThanOrEqualTo - No Match)', () => { (localStorage.getItem as jest.Mock).mockImplementation((key) => { - if (key === SHARED_PREFS_EVENT_LIST_KEY) { - return JSON.stringify([ - { - dataFields: { - savings: 18, - eventTimeStamp: 12 - }, - eventType: 'user' - } - ]); + if (key === SHARED_PREFS_USER_UPDATE_OBJECT_KEY) { + return JSON.stringify({ + dataFields: { + savings: 18, + eventTimeStamp: 12 + }, + eventType: 'user' + }); } return null; }); - const localStoredEventList = localStorage.getItem( - SHARED_PREFS_EVENT_LIST_KEY + const localStoredUserUpdate = localStorage.getItem( + SHARED_PREFS_USER_UPDATE_OBJECT_KEY ); const checker = new CriteriaCompletionChecker( - localStoredEventList === null ? '' : localStoredEventList + '', + localStoredUserUpdate === null ? '' : localStoredUserUpdate ); const result = checker.getMatchedCriteria( JSON.stringify(DATA_TYPE_COMPARATOR_LESS_THAN_OR_EQUAL_TO) @@ -261,26 +253,25 @@ describe('dataTypeComparatorSearchQueryCriteria', () => { it('should return criteriaId 290 (Comparator test For GreaterThan)', () => { (localStorage.getItem as jest.Mock).mockImplementation((key) => { - if (key === SHARED_PREFS_EVENT_LIST_KEY) { - return JSON.stringify([ - { - dataFields: { - savings: 56, - eventTimeStamp: 51 - }, - eventType: 'user' - } - ]); + if (key === SHARED_PREFS_USER_UPDATE_OBJECT_KEY) { + return JSON.stringify({ + dataFields: { + savings: 56, + eventTimeStamp: 51 + }, + eventType: 'user' + }); } return null; }); - const localStoredEventList = localStorage.getItem( - SHARED_PREFS_EVENT_LIST_KEY + const localStoredUserUpdate = localStorage.getItem( + SHARED_PREFS_USER_UPDATE_OBJECT_KEY ); const checker = new CriteriaCompletionChecker( - localStoredEventList === null ? '' : localStoredEventList + '', + localStoredUserUpdate === null ? '' : localStoredUserUpdate ); const result = checker.getMatchedCriteria( JSON.stringify(DATA_TYPE_COMPARATOR_GREATER_THAN) @@ -290,26 +281,25 @@ describe('dataTypeComparatorSearchQueryCriteria', () => { it('should return null (Comparator test For GreaterThan - No Match)', () => { (localStorage.getItem as jest.Mock).mockImplementation((key) => { - if (key === SHARED_PREFS_EVENT_LIST_KEY) { - return JSON.stringify([ - { - dataFields: { - savings: 5, - eventTimeStamp: 3 - }, - eventType: 'user' - } - ]); + if (key === SHARED_PREFS_USER_UPDATE_OBJECT_KEY) { + return JSON.stringify({ + dataFields: { + savings: 5, + eventTimeStamp: 3 + }, + eventType: 'user' + }); } return null; }); - const localStoredEventList = localStorage.getItem( - SHARED_PREFS_EVENT_LIST_KEY + const localStoredUserUpdate = localStorage.getItem( + SHARED_PREFS_USER_UPDATE_OBJECT_KEY ); const checker = new CriteriaCompletionChecker( - localStoredEventList === null ? '' : localStoredEventList + '', + localStoredUserUpdate === null ? '' : localStoredUserUpdate ); const result = checker.getMatchedCriteria( JSON.stringify(DATA_TYPE_COMPARATOR_GREATER_THAN) @@ -319,26 +309,25 @@ describe('dataTypeComparatorSearchQueryCriteria', () => { it('should return criteriaId 291 (Comparator test For GreaterThanOrEqualTo)', () => { (localStorage.getItem as jest.Mock).mockImplementation((key) => { - if (key === SHARED_PREFS_EVENT_LIST_KEY) { - return JSON.stringify([ - { - dataFields: { - savings: 20, - eventTimeStamp: 30 - }, - eventType: 'user' - } - ]); + if (key === SHARED_PREFS_USER_UPDATE_OBJECT_KEY) { + return JSON.stringify({ + dataFields: { + savings: 20, + eventTimeStamp: 30 + }, + eventType: 'user' + }); } return null; }); - const localStoredEventList = localStorage.getItem( - SHARED_PREFS_EVENT_LIST_KEY + const localStoredUserUpdate = localStorage.getItem( + SHARED_PREFS_USER_UPDATE_OBJECT_KEY ); const checker = new CriteriaCompletionChecker( - localStoredEventList === null ? '' : localStoredEventList + '', + localStoredUserUpdate === null ? '' : localStoredUserUpdate ); const result = checker.getMatchedCriteria( JSON.stringify(DATA_TYPE_COMPARATOR_GREATER_THAN_OR_EQUAL_TO) @@ -348,26 +337,25 @@ describe('dataTypeComparatorSearchQueryCriteria', () => { it('should return null (Comparator test For GreaterThanOrEqualTo - No Match)', () => { (localStorage.getItem as jest.Mock).mockImplementation((key) => { - if (key === SHARED_PREFS_EVENT_LIST_KEY) { - return JSON.stringify([ - { - dataFields: { - savings: 18, - eventTimeStamp: 16 - }, - eventType: 'user' - } - ]); + if (key === SHARED_PREFS_USER_UPDATE_OBJECT_KEY) { + return JSON.stringify({ + dataFields: { + savings: 18, + eventTimeStamp: 16 + }, + eventType: 'user' + }); } return null; }); - const localStoredEventList = localStorage.getItem( - SHARED_PREFS_EVENT_LIST_KEY + const localStoredUserUpdate = localStorage.getItem( + SHARED_PREFS_USER_UPDATE_OBJECT_KEY ); const checker = new CriteriaCompletionChecker( - localStoredEventList === null ? '' : localStoredEventList + '', + localStoredUserUpdate === null ? '' : localStoredUserUpdate ); const result = checker.getMatchedCriteria( JSON.stringify(DATA_TYPE_COMPARATOR_GREATER_THAN_OR_EQUAL_TO) @@ -377,28 +365,27 @@ describe('dataTypeComparatorSearchQueryCriteria', () => { it('should return criteriaId 285 (Comparator test For IsSet)', () => { (localStorage.getItem as jest.Mock).mockImplementation((key) => { - if (key === SHARED_PREFS_EVENT_LIST_KEY) { - return JSON.stringify([ - { - dataFields: { - savings: 10, - eventTimeStamp: 20, - saved_cars: '10', - country: 'Taiwan' - }, - eventType: 'user' - } - ]); + if (key === SHARED_PREFS_USER_UPDATE_OBJECT_KEY) { + return JSON.stringify({ + dataFields: { + savings: 10, + eventTimeStamp: 20, + saved_cars: '10', + country: 'Taiwan' + }, + eventType: 'user' + }); } return null; }); - const localStoredEventList = localStorage.getItem( - SHARED_PREFS_EVENT_LIST_KEY + const localStoredUserUpdate = localStorage.getItem( + SHARED_PREFS_USER_UPDATE_OBJECT_KEY ); const checker = new CriteriaCompletionChecker( - localStoredEventList === null ? '' : localStoredEventList + '', + localStoredUserUpdate === null ? '' : localStoredUserUpdate ); const result = checker.getMatchedCriteria( JSON.stringify(DATA_TYPE_COMPARATOR_IS_SET) @@ -408,28 +395,27 @@ describe('dataTypeComparatorSearchQueryCriteria', () => { it('should return criteriaId 285 (Comparator test For IsSet - No Match)', () => { (localStorage.getItem as jest.Mock).mockImplementation((key) => { - if (key === SHARED_PREFS_EVENT_LIST_KEY) { - return JSON.stringify([ - { - dataFields: { - savings: '', - eventTimeStamp: '', - saved_cars: 'd', - country: '' - }, - eventType: 'user' - } - ]); + if (key === SHARED_PREFS_USER_UPDATE_OBJECT_KEY) { + return JSON.stringify({ + dataFields: { + savings: '', + eventTimeStamp: '', + saved_cars: 'd', + country: '' + }, + eventType: 'user' + }); } return null; }); - const localStoredEventList = localStorage.getItem( - SHARED_PREFS_EVENT_LIST_KEY + const localStoredUserUpdate = localStorage.getItem( + SHARED_PREFS_USER_UPDATE_OBJECT_KEY ); const checker = new CriteriaCompletionChecker( - localStoredEventList === null ? '' : localStoredEventList + '', + localStoredUserUpdate === null ? '' : localStoredUserUpdate ); const result = checker.getMatchedCriteria( JSON.stringify(DATA_TYPE_COMPARATOR_IS_SET) diff --git a/src/anonymousUserTracking/tests/nestedTesting.test.ts b/src/anonymousUserTracking/tests/nestedTesting.test.ts index be149ffc..3d76ac0a 100644 --- a/src/anonymousUserTracking/tests/nestedTesting.test.ts +++ b/src/anonymousUserTracking/tests/nestedTesting.test.ts @@ -1,4 +1,7 @@ -import { SHARED_PREFS_EVENT_LIST_KEY } from '../../constants'; +import { + SHARED_PREFS_EVENT_LIST_KEY, + SHARED_PREFS_USER_UPDATE_OBJECT_KEY +} from '../../constants'; import CriteriaCompletionChecker from '../criteriaCompletionChecker'; import { NESTED_CRITERIA, @@ -20,39 +23,38 @@ describe('nestedTesting', () => { it('should return criteriaId 168 (nested field)', () => { (localStorage.getItem as jest.Mock).mockImplementation((key) => { - if (key === SHARED_PREFS_EVENT_LIST_KEY) { - return JSON.stringify([ - { - dataFields: { - email: 'user@example.com', - furniture: [ - { - furnitureType: 'Sofa', - furnitureColor: 'White', - lengthInches: 40, - widthInches: 60 - }, - { - furnitureType: 'table', - furnitureColor: 'Gray', - lengthInches: 20, - widthInches: 30 - } - ] - }, - eventType: 'user' - } - ]); + if (key === SHARED_PREFS_USER_UPDATE_OBJECT_KEY) { + return JSON.stringify({ + dataFields: { + email: 'user@example.com', + furniture: [ + { + furnitureType: 'Sofa', + furnitureColor: 'White', + lengthInches: 40, + widthInches: 60 + }, + { + furnitureType: 'table', + furnitureColor: 'Gray', + lengthInches: 20, + widthInches: 30 + } + ] + }, + eventType: 'user' + }); } return null; }); - const localStoredEventList = localStorage.getItem( - SHARED_PREFS_EVENT_LIST_KEY + const localStoredUserUpdate = localStorage.getItem( + SHARED_PREFS_USER_UPDATE_OBJECT_KEY ); const checker = new CriteriaCompletionChecker( - localStoredEventList === null ? '' : localStoredEventList + '', + localStoredUserUpdate === null ? '' : localStoredUserUpdate ); const result = checker.getMatchedCriteria(JSON.stringify(NESTED_CRITERIA)); expect(result).toEqual('168'); @@ -60,39 +62,38 @@ describe('nestedTesting', () => { it('should return criteriaId null (nested field - No match)', () => { (localStorage.getItem as jest.Mock).mockImplementation((key) => { - if (key === SHARED_PREFS_EVENT_LIST_KEY) { - return JSON.stringify([ - { - dataFields: { - email: 'user@example.com', - furniture: [ - { - furnitureType: 'Sofa', - furnitureColor: 'Gray', - lengthInches: 40, - widthInches: 60 - }, - { - furnitureType: 'table', - furnitureColor: 'White', - lengthInches: 20, - widthInches: 30 - } - ] - }, - eventType: 'user' - } - ]); + if (key === SHARED_PREFS_USER_UPDATE_OBJECT_KEY) { + return JSON.stringify({ + dataFields: { + email: 'user@example.com', + furniture: [ + { + furnitureType: 'Sofa', + furnitureColor: 'Gray', + lengthInches: 40, + widthInches: 60 + }, + { + furnitureType: 'table', + furnitureColor: 'White', + lengthInches: 20, + widthInches: 30 + } + ] + }, + eventType: 'user' + }); } return null; }); - const localStoredEventList = localStorage.getItem( - SHARED_PREFS_EVENT_LIST_KEY + const localStoredUserUpdate = localStorage.getItem( + SHARED_PREFS_USER_UPDATE_OBJECT_KEY ); const checker = new CriteriaCompletionChecker( - localStoredEventList === null ? '' : localStoredEventList + '', + localStoredUserUpdate === null ? '' : localStoredUserUpdate ); const result = checker.getMatchedCriteria(JSON.stringify(NESTED_CRITERIA)); expect(result).toEqual(null); @@ -250,40 +251,39 @@ describe('nestedTesting', () => { it('should return criteriaId 436 (Multi level Nested field criteria)', () => { (localStorage.getItem as jest.Mock).mockImplementation((key) => { - if (key === SHARED_PREFS_EVENT_LIST_KEY) { - return JSON.stringify([ - { - dataFields: { - furniture: { - material: [ - { - type: 'table', - color: 'black', - lengthInches: 40, - widthInches: 60 - }, - { - type: 'Sofa', - color: 'Gray', - lengthInches: 20, - widthInches: 30 - } - ] - } - }, - eventType: 'user' - } - ]); + if (key === SHARED_PREFS_USER_UPDATE_OBJECT_KEY) { + return JSON.stringify({ + dataFields: { + furniture: { + material: [ + { + type: 'table', + color: 'black', + lengthInches: 40, + widthInches: 60 + }, + { + type: 'Sofa', + color: 'Gray', + lengthInches: 20, + widthInches: 30 + } + ] + } + }, + eventType: 'user' + }); } return null; }); - const localStoredEventList = localStorage.getItem( - SHARED_PREFS_EVENT_LIST_KEY + const localStoredUserUpdate = localStorage.getItem( + SHARED_PREFS_USER_UPDATE_OBJECT_KEY ); const checker = new CriteriaCompletionChecker( - localStoredEventList === null ? '' : localStoredEventList + '', + localStoredUserUpdate === null ? '' : localStoredUserUpdate ); const result = checker.getMatchedCriteria( JSON.stringify(NESTED_CRITERIA_MULTI_LEVEL_ARRAY) @@ -293,40 +293,39 @@ describe('nestedTesting', () => { it('should return criteriaId null (Multi level Nested field criteria - No match)', () => { (localStorage.getItem as jest.Mock).mockImplementation((key) => { - if (key === SHARED_PREFS_EVENT_LIST_KEY) { - return JSON.stringify([ - { - dataFields: { - furniture: { - material: [ - { - type: 'table', - color: 'Gray', - lengthInches: 40, - widthInches: 60 - }, - { - type: 'Sofa', - color: 'black', - lengthInches: 20, - widthInches: 30 - } - ] - } - }, - eventType: 'user' - } - ]); + if (key === SHARED_PREFS_USER_UPDATE_OBJECT_KEY) { + return JSON.stringify({ + dataFields: { + furniture: { + material: [ + { + type: 'table', + color: 'Gray', + lengthInches: 40, + widthInches: 60 + }, + { + type: 'Sofa', + color: 'black', + lengthInches: 20, + widthInches: 30 + } + ] + } + }, + eventType: 'user' + }); } return null; }); - const localStoredEventList = localStorage.getItem( - SHARED_PREFS_EVENT_LIST_KEY + const localStoredUserUpdate = localStorage.getItem( + SHARED_PREFS_USER_UPDATE_OBJECT_KEY ); const checker = new CriteriaCompletionChecker( - localStoredEventList === null ? '' : localStoredEventList + '', + localStoredUserUpdate === null ? '' : localStoredUserUpdate ); const result = checker.getMatchedCriteria( JSON.stringify(NESTED_CRITERIA_MULTI_LEVEL_ARRAY) diff --git a/src/anonymousUserTracking/tests/userUpdate.test.ts b/src/anonymousUserTracking/tests/userUpdate.test.ts index 6d1f84c8..645481f0 100644 --- a/src/anonymousUserTracking/tests/userUpdate.test.ts +++ b/src/anonymousUserTracking/tests/userUpdate.test.ts @@ -7,7 +7,8 @@ import { GET_CRITERIA_PATH, ENDPOINT_TRACK_ANON_SESSION, ENDPOINT_MERGE_USER, - SHARED_PREF_ANON_USAGE_TRACKED + SHARED_PREF_ANON_USAGE_TRACKED, + SHARED_PREFS_USER_UPDATE_OBJECT_KEY } from '../../constants'; import { updateUser } from '../../users'; import { initializeWithConfig } from '../../authorization'; @@ -82,13 +83,13 @@ describe('UserUpdate', () => { it('should not have unnecessary extra nesting when locally stored user update fields are sent to server', async () => { (localStorage.getItem as jest.Mock).mockImplementation((key) => { if (key === SHARED_PREFS_EVENT_LIST_KEY) { - return JSON.stringify([ - { - ...userDataMatched.dataFields, - eventType: userDataMatched.eventType - }, - eventDataMatched - ]); + return JSON.stringify([eventDataMatched]); + } + if (key === SHARED_PREFS_USER_UPDATE_OBJECT_KEY) { + return JSON.stringify({ + ...userDataMatched.dataFields, + eventType: userDataMatched.eventType + }); } if (key === SHARED_PREFS_CRITERIA) { return JSON.stringify(CUSTOM_EVENT_API_TEST_CRITERIA); @@ -114,7 +115,7 @@ describe('UserUpdate', () => { console.log(''); } expect(localStorage.setItem).toHaveBeenCalledWith( - SHARED_PREFS_EVENT_LIST_KEY, + SHARED_PREFS_USER_UPDATE_OBJECT_KEY, expect.any(String) ); diff --git a/src/anonymousUserTracking/tests/validateCustomEventUserUpdateAPI.test.ts b/src/anonymousUserTracking/tests/validateCustomEventUserUpdateAPI.test.ts index 0acbceb4..1a9030de 100644 --- a/src/anonymousUserTracking/tests/validateCustomEventUserUpdateAPI.test.ts +++ b/src/anonymousUserTracking/tests/validateCustomEventUserUpdateAPI.test.ts @@ -8,7 +8,8 @@ import { ENDPOINT_TRACK_ANON_SESSION, GET_CRITERIA_PATH, GETMESSAGES_PATH, - SHARED_PREF_ANON_USAGE_TRACKED + SHARED_PREF_ANON_USAGE_TRACKED, + SHARED_PREFS_USER_UPDATE_OBJECT_KEY } from '../../constants'; import { track } from '../../events'; import { initializeWithConfig } from '../../authorization'; @@ -124,13 +125,8 @@ describe('validateCustomEventUserUpdateAPI', () => { it('should not have unnecessary extra nesting when locally stored user update fields are sent to server', async () => { (localStorage.getItem as jest.Mock).mockImplementation((key) => { - if (key === SHARED_PREFS_EVENT_LIST_KEY) { - return JSON.stringify([ - { - ...userDataMatched.dataFields, - eventType: userDataMatched.eventType - } - ]); + if (key === SHARED_PREFS_USER_UPDATE_OBJECT_KEY) { + return JSON.stringify(userDataMatched); } if (key === SHARED_PREFS_CRITERIA) { return JSON.stringify(USER_UPDATE_API_TEST_CRITERIA); @@ -144,14 +140,15 @@ describe('validateCustomEventUserUpdateAPI', () => { return null; }); - const localStoredEventList = localStorage.getItem( - SHARED_PREFS_EVENT_LIST_KEY + const localStoredUserUpdate = localStorage.getItem( + SHARED_PREFS_USER_UPDATE_OBJECT_KEY ); const localStoredCriteriaSets = localStorage.getItem(SHARED_PREFS_CRITERIA); const checker = new CriteriaCompletionChecker( - localStoredEventList === null ? '' : localStoredEventList + '', + localStoredUserUpdate === null ? '' : localStoredUserUpdate ); const result = checker.getMatchedCriteria(localStoredCriteriaSets!); @@ -169,7 +166,7 @@ describe('validateCustomEventUserUpdateAPI', () => { console.log(''); } expect(localStorage.setItem).toHaveBeenCalledWith( - SHARED_PREFS_EVENT_LIST_KEY, + SHARED_PREFS_USER_UPDATE_OBJECT_KEY, expect.any(String) ); await setUserID('testuser123'); @@ -210,14 +207,12 @@ describe('validateCustomEventUserUpdateAPI', () => { it('should not have unnecessary extra nesting when locally stored user update fields are sent to server - Fail', async () => { (localStorage.getItem as jest.Mock).mockImplementation((key) => { - if (key === SHARED_PREFS_EVENT_LIST_KEY) { - return JSON.stringify([ - { - ...userData, - ...userData.dataFields, - eventType: userData.eventType - } - ]); + if (key === SHARED_PREFS_USER_UPDATE_OBJECT_KEY) { + return JSON.stringify({ + ...userData, + ...userData.dataFields, + eventType: userData.eventType + }); } if (key === SHARED_PREFS_CRITERIA) { return JSON.stringify(USER_UPDATE_API_TEST_CRITERIA); @@ -231,14 +226,15 @@ describe('validateCustomEventUserUpdateAPI', () => { return null; }); - const localStoredEventList = localStorage.getItem( - SHARED_PREFS_EVENT_LIST_KEY + const localStoredUserUpdate = localStorage.getItem( + SHARED_PREFS_USER_UPDATE_OBJECT_KEY ); const localStoredCriteriaSets = localStorage.getItem(SHARED_PREFS_CRITERIA); const checker = new CriteriaCompletionChecker( - localStoredEventList === null ? '' : localStoredEventList + '', + localStoredUserUpdate === null ? '' : localStoredUserUpdate ); const result = checker.getMatchedCriteria(localStoredCriteriaSets!); @@ -256,7 +252,7 @@ describe('validateCustomEventUserUpdateAPI', () => { console.log(''); } expect(localStorage.setItem).toHaveBeenCalledWith( - SHARED_PREFS_EVENT_LIST_KEY, + SHARED_PREFS_USER_UPDATE_OBJECT_KEY, expect.any(String) ); await setUserID('testuser123'); @@ -275,11 +271,11 @@ describe('validateCustomEventUserUpdateAPI', () => { expect(requestData.dataFields).toHaveProperty('furniture.furnitureType'); expect(requestData.dataFields).toHaveProperty('furniture.furnitureColor'); - expect(requestData).not.toHaveProperty('furniture'); - expect(requestData).not.toHaveProperty('furniture.furnitureType'); - expect(requestData).not.toHaveProperty('furniture.furnitureColor'); - expect(requestData.dataFields).toHaveProperty('furnitureType'); - expect(requestData.dataFields).toHaveProperty('furnitureColor'); + expect(requestData).toHaveProperty('furniture'); + expect(requestData).toHaveProperty('furniture.furnitureType'); + expect(requestData).toHaveProperty('furniture.furnitureColor'); + expect(requestData).toHaveProperty('furnitureType'); + expect(requestData).toHaveProperty('furnitureColor'); }); }); diff --git a/src/constants.ts b/src/constants.ts index 673be044..93c51398 100644 --- a/src/constants.ts +++ b/src/constants.ts @@ -282,6 +282,7 @@ export const ANIMATION_STYLESHEET = ( export const SHARED_PREFS_EVENT_TYPE = 'eventType'; export const SHARED_PREFS_EVENT_LIST_KEY = 'itbl_event_list'; +export const SHARED_PREFS_USER_UPDATE_OBJECT_KEY = 'itbl_user_update_object'; export const SHARED_PREFS_CRITERIA = 'criteria'; export const SHARED_PREFS_ANON_SESSIONS = 'itbl_anon_sessions'; export const SHARED_PREF_ANON_USER_ID = 'anon_userId'; From cddd5c404026db77ab87b697b01f14419f98bd31 Mon Sep 17 00:00:00 2001 From: mitch prewitt Date: Tue, 1 Jul 2025 11:17:15 -0400 Subject: [PATCH 4/8] missed this --- src/authorization/authorization.ts | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/authorization/authorization.ts b/src/authorization/authorization.ts index f3e33a07..c579a977 100644 --- a/src/authorization/authorization.ts +++ b/src/authorization/authorization.ts @@ -875,11 +875,8 @@ export function initialize( initializeEmailUser(email); if (replay) { syncEvents(); -<<<<<<< HEAD -======= } else { anonUserManager.removeAnonSessionCriteriaData(); ->>>>>>> 4b1829a72a31b10317a7d126c6c3c36dd89a2e51 } return token; } From e0e57fb57e42acd6e0dc74e6961974f8efae12fa Mon Sep 17 00:00:00 2001 From: mitch prewitt Date: Tue, 15 Jul 2025 11:36:58 -0400 Subject: [PATCH 5/8] fix up tests and issues --- .../anonymousUserEventManager.ts | 2 +- .../criteriaCompletionChecker.ts | 15 ++++++++++++--- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/src/anonymousUserTracking/anonymousUserEventManager.ts b/src/anonymousUserTracking/anonymousUserEventManager.ts index b4251c05..0e9c7f1d 100644 --- a/src/anonymousUserTracking/anonymousUserEventManager.ts +++ b/src/anonymousUserTracking/anonymousUserEventManager.ts @@ -382,7 +382,7 @@ export class AnonymousUserEventManager { ); const criteriaId = this.checkCriteriaCompletion(); if (criteriaId !== null) { - this.createKnownUser(criteriaId); + this.createAnonymousUser(criteriaId); } } diff --git a/src/anonymousUserTracking/criteriaCompletionChecker.ts b/src/anonymousUserTracking/criteriaCompletionChecker.ts index 50721b7b..8c4866c7 100644 --- a/src/anonymousUserTracking/criteriaCompletionChecker.ts +++ b/src/anonymousUserTracking/criteriaCompletionChecker.ts @@ -9,7 +9,8 @@ import { KEY_EVENT_NAME, UPDATECART_ITEM_PREFIX, PURCHASE_ITEM_PREFIX, - PURCHASE_ITEM + PURCHASE_ITEM, + UPDATE_USER } from '../constants'; interface SearchQuery { @@ -179,7 +180,8 @@ class CriteriaCompletionChecker { this.localStoredEventList.forEach((localEventData) => { if ( localEventData[SHARED_PREFS_EVENT_TYPE] && - localEventData[SHARED_PREFS_EVENT_TYPE] === TRACK_EVENT + (localEventData[SHARED_PREFS_EVENT_TYPE] === TRACK_EVENT || + localEventData[SHARED_PREFS_EVENT_TYPE] === UPDATE_USER) ) { const updatedItem: any = localEventData; if (localEventData.dataFields) { @@ -434,15 +436,22 @@ class CriteriaCompletionChecker { private getFieldValue(data: any, field: string): any { const fields: string[] = field.split('.'); + let startingData = data; + if (data?.eventType === TRACK_EVENT && data?.eventName === fields[0]) { fields.shift(); + // After stripping the event name, look for the remaining path in dataFields if it exists + if (data.dataFields) { + startingData = data.dataFields; + } } + return fields.reduce( (value, currentField) => value && value[currentField] !== undefined ? value[currentField] : undefined, - data + startingData ); } From 8bcc7f1fa6e08dc85c2d3cd12973b9ed6bb76a1b Mon Sep 17 00:00:00 2001 From: mitch prewitt Date: Wed, 16 Jul 2025 15:57:59 -0400 Subject: [PATCH 6/8] update types --- .../anonymousUserEventManager.ts | 45 ++++++++++++++----- 1 file changed, 35 insertions(+), 10 deletions(-) diff --git a/src/anonymousUserTracking/anonymousUserEventManager.ts b/src/anonymousUserTracking/anonymousUserEventManager.ts index 0e9c7f1d..91dc77b3 100644 --- a/src/anonymousUserTracking/anonymousUserEventManager.ts +++ b/src/anonymousUserTracking/anonymousUserEventManager.ts @@ -43,6 +43,39 @@ import { updateUserSchema } from '../users/users.schema'; import { InAppTrackRequestParams } from '../events'; import config from '../utils/config'; +// Type definitions for anonymous event data objects +interface AnonTrackEventData { + eventName: string; + createdAt: number; + dataFields?: Record; + createNewFields: boolean; + eventType: string; +} + +interface AnonTrackPurchaseData { + items: any[]; + createdAt: number; + dataFields?: Record; + total: number; + eventType: string; +} + +interface AnonUpdateCartData { + items: any[]; + eventType: string; + preferUserId: boolean; + createdAt: number; +} + +interface AnonUserUpdateData extends Record { + eventType: string; +} + +type AnonEventData = + | AnonTrackEventData + | AnonTrackPurchaseData + | AnonUpdateCartData; + type AnonUserFunction = (userId: string) => void; let anonUserIdSetter: AnonUserFunction | null = null; @@ -310,12 +343,7 @@ export class AnonymousUserEventManager { localStorage.removeItem(SHARED_PREFS_USER_UPDATE_OBJECT_KEY); } - private async storeEventListToLocalStorage( - newDataObject: Record< - any /* eslint-disable-line @typescript-eslint/no-explicit-any */, - any /* eslint-disable-line @typescript-eslint/no-explicit-any */ - > - ) { + private async storeEventListToLocalStorage(newDataObject: AnonEventData) { const anonymousUsageTracked = isAnonymousUsageTracked(); if (!anonymousUsageTracked) return; @@ -353,10 +381,7 @@ export class AnonymousUserEventManager { } private async storeUserUpdateToLocalStorage( - newDataObject: Record< - any /* eslint-disable-line @typescript-eslint/no-explicit-any */, - any /* eslint-disable-line @typescript-eslint/no-explicit-any */ - > + newDataObject: AnonUserUpdateData ) { const anonymousUsageTracked = isAnonymousUsageTracked(); From 118bb82128af6bfbca6fa98d690d7291a3eb35de Mon Sep 17 00:00:00 2001 From: mitch prewitt Date: Wed, 16 Jul 2025 16:10:43 -0400 Subject: [PATCH 7/8] update types some more --- .../anonymousUserEventManager.ts | 23 ++++++++++--------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/src/anonymousUserTracking/anonymousUserEventManager.ts b/src/anonymousUserTracking/anonymousUserEventManager.ts index 91dc77b3..64219aa8 100644 --- a/src/anonymousUserTracking/anonymousUserEventManager.ts +++ b/src/anonymousUserTracking/anonymousUserEventManager.ts @@ -2,7 +2,8 @@ import { v4 as uuidv4 } from 'uuid'; import { UpdateCartRequestParams, - TrackPurchaseRequestParams + TrackPurchaseRequestParams, + CommerceItem } from '../commerce/types'; import { @@ -44,32 +45,32 @@ import { InAppTrackRequestParams } from '../events'; import config from '../utils/config'; // Type definitions for anonymous event data objects -interface AnonTrackEventData { +type AnonTrackEventData = { eventName: string; createdAt: number; dataFields?: Record; createNewFields: boolean; eventType: string; -} +}; -interface AnonTrackPurchaseData { - items: any[]; +type AnonTrackPurchaseData = { + items: CommerceItem[]; createdAt: number; dataFields?: Record; total: number; eventType: string; -} +}; -interface AnonUpdateCartData { - items: any[]; +type AnonUpdateCartData = { + items: CommerceItem[]; eventType: string; preferUserId: boolean; createdAt: number; -} +}; -interface AnonUserUpdateData extends Record { +type AnonUserUpdateData = Record & { eventType: string; -} +}; type AnonEventData = | AnonTrackEventData From dca4dda899450eb9f406c0966939a4842313b4ed Mon Sep 17 00:00:00 2001 From: mitch prewitt Date: Thu, 17 Jul 2025 09:06:53 -0400 Subject: [PATCH 8/8] forgot to commit this --- src/commerce/types.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/commerce/types.ts b/src/commerce/types.ts index e5505e3b..7d5b2142 100644 --- a/src/commerce/types.ts +++ b/src/commerce/types.ts @@ -1,4 +1,4 @@ -interface CommerceItem { +export interface CommerceItem { id: string; sku?: string; name: string;