diff --git a/src/constants/endpoints.js b/src/constants/endpoints.js index 3b3bc8bde..8d5b33bec 100644 --- a/src/constants/endpoints.js +++ b/src/constants/endpoints.js @@ -72,7 +72,7 @@ const endpoints = { method: "GET", }, LogExperimentExposureIfAssigned:{ - url: "/analytics/api/v1/analytics/log-experiment-exposure", + url: "/experiments/api/v1/experiments/log-exposure", method: "POST", }, LogPageView:{ diff --git a/src/layouts/vehicle-year/vehicle-year.spec.js b/src/layouts/vehicle-year/vehicle-year.spec.js index 8dde9a01c..3e07acd32 100644 --- a/src/layouts/vehicle-year/vehicle-year.spec.js +++ b/src/layouts/vehicle-year/vehicle-year.spec.js @@ -15,6 +15,11 @@ import store from "@/store"; jest.mock("@/store", () => ({ commit: jest.fn(), dispatch: jest.fn(), + getters: { + applicationUser: { + experiments: [] + } + } })); // Mock our module for promises. diff --git a/src/layouts/vehicle-year/vehicle-year.vue b/src/layouts/vehicle-year/vehicle-year.vue index 4ef506eef..78fd8b05c 100644 --- a/src/layouts/vehicle-year/vehicle-year.vue +++ b/src/layouts/vehicle-year/vehicle-year.vue @@ -31,6 +31,7 @@ import { settleAllPromises } from "@/helpers/layout-helper"; import { storeActions } from "@/constants/store-actions"; import { experimentUniverses } from "@/constants/experiments"; import { getDeviceIdValue, getSessionKeyValue } from "@/helpers/heritage-integration/cookie-helper"; +import store from "@/store"; import baseMixin from "@/mixins/base-mixin"; @@ -48,13 +49,15 @@ export default { const cmsContentPromise = fetchCmsContentForPage(to.query.fmgPage); const yearQuestionInitialDataPromise = yearQuestion.methods.loadInitialData(); + const experimentForLogging = store.getters.applicationUser.experiments.find(e => e.universeName === experimentUniverses.CONCEPT_FUNNEL); + // Log experiment exposure - const logExperimentExposurePromise = baseMixin.methods.dispatchStoreAction(storeActions.LOG_EXPERIMENT_EXPOSURE, + baseMixin.methods.dispatchStoreAction(storeActions.LOG_EXPERIMENT_EXPOSURE, { userId: getDeviceIdValue(), sessionKey: getSessionKeyValue(), pageName: to.query.fmgPage, - universeName: experimentUniverses.CONCEPT_FUNNEL + experiment: experimentForLogging }, false); // Settle promises and get results @@ -67,10 +70,6 @@ export default { resultKey: "yearQuestionInitialData", promise: yearQuestionInitialDataPromise, }, - { - resultKey: "logExperimentExposure", - promise: logExperimentExposurePromise, - }, ]; let resultMap = await settleAllPromises(promiseResultMap); diff --git a/src/mixins/analytics-mixin.js b/src/mixins/analytics-mixin.js index e24a55e36..142131ae1 100644 --- a/src/mixins/analytics-mixin.js +++ b/src/mixins/analytics-mixin.js @@ -4,6 +4,7 @@ import { queryStrings } from "@/constants/query-strings"; import { experimentSettings } from "@/constants/experiments"; import { analyticsPageEvents, GaCategories, GaActions, GaLabels, GaEvents, ValueToLogTypes } from "@/constants/analytics"; import { cookieNames } from "@/constants/cookie-names"; +import store from "@/store"; import baseMixin from "@/mixins/base-mixin"; @@ -19,6 +20,7 @@ export default { action: '', event: pageEvent, shouldUseSessionId: false, + experimentsForUser: store.getters.applicationUser.experiments, }; baseMixin.methods.dispatchStoreAction(storeActions.LOG_PAGE_VIEW, payload, false); @@ -37,6 +39,7 @@ export default { label: label, value: value, shouldUseSessionId: false, + experimentsForUser: store.getters.applicationUser.experiments }; baseMixin.methods.dispatchStoreAction(storeActions.LOG_CUSTOM_EVENT, payload, false); @@ -57,7 +60,7 @@ export default { pushToDataLayerIfDefined(eventToBePushed); if (pushToLogApp) { - this.logCustomEvent(category, action, labelToLog, undefined); + this.logCustomEvent(category, action, labelToLog, undefined); } }, @@ -75,7 +78,8 @@ export default { this.logPageView(analyticsPageEvents.ENTRY); }, - pushExperimentsToDataLayer(experiments) { + pushExperimentsToDataLayer() { + const experiments = store.getters.applicationUser.experiments; experiments?.forEach(exp => { // Set Google Dimension Index based on experiment settings. diff --git a/src/mixins/analytics-mixin.spec.js b/src/mixins/analytics-mixin.spec.js index 9eed99fa7..bedcf8e2e 100644 --- a/src/mixins/analytics-mixin.spec.js +++ b/src/mixins/analytics-mixin.spec.js @@ -2,6 +2,7 @@ import analyticsMixin from "@/mixins/analytics-mixin"; import { setupMocksForJsFiles, setupCookies } from "@/helpers/unit-test-helper.js"; import { storeActions } from "@/constants/store-actions"; import { analyticsPageEvents, GaCategories, GaActions, GaLabels, GaEvents, ValueToLogTypes } from "@/constants/analytics"; +import store from "@/store"; describe("analyticsMixin.js", () => { test("logPageView: calls dispatch with type and payload", () => { @@ -119,6 +120,21 @@ describe("analyticsMixin.js", () => { } ] + // Mock store + jest.mock("@/store", () => { return {}; }, { virtual: true }); + + store.getters = { + applicationUser: { + experiments: [ + { + settings: {}, + variationName: 'test', + universeName: 'testUniverse' + } + ] + } + }; + // Act analyticsMixin.methods.pushExperimentsToDataLayer(mockExperimentData); @@ -147,6 +163,20 @@ describe("analyticsMixin.js", () => { } ] + // Mock store + jest.mock("@/store", () => { return {}; }, { virtual: true }); + + store.getters = { + applicationUser: { + experiments: [ + { + settings: { "Google Custom Dimension Index": "5" }, + variationName: 'test', + universeName: 'testUniverse' + } + ] + } + }; // Act analyticsMixin.methods.pushExperimentsToDataLayer(mockExperimentData); diff --git a/src/router/index.js b/src/router/index.js index 6fcd48c28..5b5c73d75 100644 --- a/src/router/index.js +++ b/src/router/index.js @@ -128,13 +128,12 @@ const router = createRouter({ router.afterEach((to, from) => { // Update lastPageVisited in the store store.commit(storeMutations.UPDATE_LAST_PAGE_VISITED, to.name); - // Push page view to GA - analyticsMixin.methods.pushPageViewToGA(to.query[queryStrings.FMG_PAGE]); - baseMixin.methods.dispatchStoreAction(storeActions.GET_EXPERIMENTS_BY_USER, { userId: getDeviceIdValue() }) - .then( (response) => { - analyticsMixin.methods.pushExperimentsToDataLayer(response.data); - }); + // Push page view to GA + analyticsMixin.methods.pushPageViewToGA(); + + // Push experiments to Data Layer + analyticsMixin.methods.pushExperimentsToDataLayer(); }); @@ -142,7 +141,6 @@ router.navigate = (scenario, currentRoute, optionalQuery = {}, optionalParams = navigate(scenario, currentRoute, optionalQuery, optionalParams, optionalPageData); } - router.navigateToExternalUrl = (url, optionalQuery = {}) => { navigateToUrl(url, optionalQuery); } diff --git a/src/store/index.js b/src/store/index.js index c3a2676ac..0220bf97e 100644 --- a/src/store/index.js +++ b/src/store/index.js @@ -547,15 +547,26 @@ export const actions = { }, // Analytics Actions - logExperimentExposure(context, { userId, sessionKey, pageName, universeName }) { + logExperimentExposure(context, { userId, sessionKey, pageName, experiment }) { return globalMethods.callHttpClient({ method: endpoints.LogExperimentExposureIfAssigned.method, endpoint: endpoints.LogExperimentExposureIfAssigned.url, payload: { - userId: userId, - sessionKey: sessionKey, - pageName: pageName, - universeName: universeName + experimentForLogging: { + userId: userId, + experimentUniverseId: experiment.universeId, + experimentUniverseName: experiment.universeName, + experimentTestId: experiment.testId, + experimentTestName: experiment.testName, + experimentVariationId: experiment.variationId, + experimentVariationName: experiment.variationName, + enabled: experiment.isActive, + isExposed: experiment.isExposed, + userPartitionNumber: experiment.userPartitionNumber, + assignmentId: experiment.assignmentId, + sessionKey: sessionKey, + pageName: pageName, + } } }); }, @@ -570,8 +581,7 @@ export const actions = { context.commit(storeMutations.UPDATE_SAVED_SESSION_ID, savedSessionId); context.commit(storeMutations.UPDATE_CRM_CUSTOMER_ID, crmCustomerId); }, - - logPageView(context, { userId, sessionKey, pageName, sessionId, action, event, shouldUseSessionId }) { + logPageView(context, { userId, sessionKey, pageName, sessionId, action, event, shouldUseSessionId, experimentsForUser }) { var payload = { userId: userId, sessionKey: sessionKey, @@ -580,7 +590,8 @@ export const actions = { applicationName: applicationConfig.APPLICATION_NAME, action: action, event: event, - shouldUseSessionId: shouldUseSessionId + shouldUseSessionId: shouldUseSessionId, + experimentsForUser: experimentsForUser }; return globalMethods.callHttpClient({ @@ -590,7 +601,7 @@ export const actions = { logApiCall: false }); }, - logCustomEvent(context, { userId, sessionKey, pageName, sessionId, category, action, label, value, shouldUseSessionId }) { + logCustomEvent(context, { userId, sessionKey, pageName, sessionId, category, action, label, value, shouldUseSessionId, experimentsForUser }) { var payload = { userId: userId, sessionKey: sessionKey, @@ -601,7 +612,8 @@ export const actions = { action: action, label: label, value: value, - shouldUseSessionId: shouldUseSessionId + shouldUseSessionId: shouldUseSessionId, + experimentsForUser: experimentsForUser }; return globalMethods.callHttpClient({