Skip to content
Merged
22 changes: 12 additions & 10 deletions src/store.ts
Original file line number Diff line number Diff line change
Expand Up @@ -740,9 +740,20 @@ export default function Store(
this.SDKConfig[baseUrlKeys] = baseUrls[baseUrlKeys];
}

// Extract privacy flags directly from config into Store BEFORE initializing timers
if (config.hasOwnProperty('noFunctional')) {
this.setNoFunctional(config.noFunctional);
}

if (config.hasOwnProperty('noTargeting')) {
this.setNoTargeting(config.noTargeting);
}
Comment thread
jaissica12 marked this conversation as resolved.
Outdated

if (workspaceToken) {
this.SDKConfig.workspaceToken = workspaceToken;
mpInstance._timeOnSiteTimer = new ForegroundTimer(workspaceToken);
if (!this.getPrivacyFlag('TimeOnSite')) {
mpInstance._timeOnSiteTimer = new ForegroundTimer(workspaceToken);
}
} else {
mpInstance.Logger.warning(
'You should have a workspaceToken on your config object for security purposes.'
Expand All @@ -752,15 +763,6 @@ export default function Store(
this.storageName = createMainStorageName(workspaceToken);
this.prodStorageName = createProductStorageName(workspaceToken);

// Extract privacy flags directly from config into Store
if (config.hasOwnProperty('noFunctional')) {
this.setNoFunctional(config.noFunctional);
}

if (config.hasOwnProperty('noTargeting')) {
this.setNoTargeting(config.noTargeting);
}

this.SDKConfig.requiredWebviewBridgeName =
requiredWebviewBridgeName || workspaceToken;

Expand Down
64 changes: 64 additions & 0 deletions test/jest/foregroundTimeTracker.spec.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,7 @@
import ForegroundTimeTracker from '../../src/foregroundTimeTracker';
import Store, { IStore } from '../../src/store';
import { SDKInitConfig } from '../../src/sdkRuntimeModels';
import { IMParticleWebSDKInstance } from '../../src/mp-instance';

describe('ForegroundTimeTracker', () => {
let foregroundTimeTracker: ForegroundTimeTracker;
Expand Down Expand Up @@ -490,4 +493,65 @@ describe('ForegroundTimeTracker', () => {
expect(updatePersistenceSpy).toHaveBeenCalled();
});
});

describe('#privacy flags', () => {
const workspaceToken = 'abcdef';
const tosKey = `mprtcl-tos-${workspaceToken}`;
let mockMPInstance: IMParticleWebSDKInstance;
let store: IStore;

beforeEach(() => {
jest.useFakeTimers({ now: Date.now(), advanceTimers: true });
localStorage.clear();

mockMPInstance = {
_Helpers: {
createMainStorageName: () => `mprtcl-v4_${workspaceToken}`,
createProductStorageName: () => `mprtcl-prodv4_${workspaceToken}`,
Validators: { isFunction: () => true },
extend: Object.assign,
},
_NativeSdkHelpers: { isWebviewEnabled: () => false },
_Persistence: {
update: jest.fn(),
savePersistence: jest.fn(),
getPersistence: () => ({ gs: {} }),
},
Logger: { verbose: jest.fn(), warning: jest.fn(), error: jest.fn() },
Identity: { getCurrentUser: () => ({ getMPID: () => 'mpid' }) },
_timeOnSiteTimer: undefined as any,
} as unknown as IMParticleWebSDKInstance;

store = {} as IStore;
(Store as any).call(store, {} as SDKInitConfig, mockMPInstance, 'apikey');
mockMPInstance._Store = store;
});

afterEach(() => {
jest.useRealTimers();
localStorage.clear();
});

it('should track time on site when noTargeting is false by default', () => {
store.processConfig({ workspaceToken } as SDKInitConfig);
expect(mockMPInstance._timeOnSiteTimer).toBeDefined();
jest.advanceTimersByTime(1000);
mockMPInstance._timeOnSiteTimer.getTimeInForeground();
expect(localStorage.getItem(tosKey)).not.toBeNull();
});

it('should NOT track time on site when noTargeting is true', () => {
store.processConfig({ workspaceToken, noTargeting: true } as SDKInitConfig);
expect(mockMPInstance._timeOnSiteTimer).toBeUndefined();
expect(localStorage.getItem(tosKey)).toBeNull();
});

it('should track time on site when noTargeting is false', () => {
store.processConfig({ workspaceToken, noTargeting: false } as SDKInitConfig);
expect(mockMPInstance._timeOnSiteTimer).toBeDefined();
jest.advanceTimersByTime(1000);
mockMPInstance._timeOnSiteTimer.getTimeInForeground();
expect(localStorage.getItem(tosKey)).not.toBeNull();
});
});
});
Loading