diff --git a/jest.config.js b/jest.config.js
index c1edf3074..1273d62c1 100644
--- a/jest.config.js
+++ b/jest.config.js
@@ -17,11 +17,9 @@ module.exports = {
"!src/layouts/vin-lookup/vin-lookup.vue",
"!src/layouts/vehicle-damage/windshield-damage-type-question/windshield-damage-type-question.vue",
"!src/layouts/vehicle-damage/windshield-options/windshield-options.vue",
- "!src/layouts/address-poc/address-poc.vue",
- "!src/layouts/nested-radio-poc/nested-radio.vue",
- "!src/layouts/button-question-examples/**/*.vue",
"!src/layouts/part-questions/**/*.vue",
"!src/layouts/reveal/**/*.vue",
+ "!src/layouts/estimate/**/*.vue",
// REMOVE THESE AFTER WRITING UNIT TESTS
"!src/layouts/address-lookup/address-lookup.vue",
"!src/layouts/address-lookup/customer-questions/customer-questions.vue",
diff --git a/src/common-components/funnel-footer/funnel-footer.vue b/src/common-components/funnel-footer/funnel-footer.vue
index c6e7659b9..424003708 100644
--- a/src/common-components/funnel-footer/funnel-footer.vue
+++ b/src/common-components/funnel-footer/funnel-footer.vue
@@ -22,13 +22,13 @@
isPrimary
:buttonText="buttonText"
loaderColor="white"
- :class="isDisabled && 'form-test-invalid'"
- :aria-disabled="isDisabled"
- :isDisabled="isDisabled"
+ :class="isForwardActionDisabled && 'form-test-invalid'"
+ :aria-disabled="isForwardActionDisabled"
+ :isDisabled="isForwardActionDisabled"
@click-event="buttonClick"
/>
-
+
@@ -56,7 +56,7 @@ export default {
setup(props) {
const fieldOptions = {
type: "text",
- value: props.modelValue,
+ value: props.modelValue,
};
const {
@@ -64,15 +64,17 @@ export default {
handleBlur,
handleChange,
meta,
- validate
+ validate,
+ errors,
} = useField(props.inputId, props.validationRules, fieldOptions);
- return {
+ return {
errorMessage,
handleBlur,
handleChange,
validate,
- meta,
+ meta,
+ errors,
};
},
computed: {
@@ -86,7 +88,7 @@ export default {
set: function(newValue) {
this.$emit("update:modelValue", newValue);
}
- },
+ },
labelText: {
get: function () {
let labelText = this.questionText;
@@ -98,7 +100,7 @@ export default {
return labelText;
}
- }
+ }
},
watch: {
value(newValue) {
diff --git a/src/constants/error-messages.js b/src/constants/error-messages.js
index 311e747b0..c3976d0f9 100644
--- a/src/constants/error-messages.js
+++ b/src/constants/error-messages.js
@@ -16,6 +16,8 @@ const errorMessages = {
LAST_NAME_REQUIRED: "Please enter your last name",
EMAIL_ADDRESS_REQUIRED: "Please enter your email address",
EMAIL_ADDRESS_FORMAT: "Please enter a valid email address",
+ VIN_REQUIRED: "Please enter your VIN",
+ VIN_FORMAT: "Please enter a valid VIN",
};
-
-export { errorMessages };
\ No newline at end of file
+
+export { errorMessages };
diff --git a/src/helpers/heritage-integration/cookie-helper.spec.js b/src/helpers/heritage-integration/cookie-helper.spec.js
index 9d14389e2..b4498f61b 100644
--- a/src/helpers/heritage-integration/cookie-helper.spec.js
+++ b/src/helpers/heritage-integration/cookie-helper.spec.js
@@ -1,4 +1,4 @@
-import {getFunnelCookie} from "@/helpers/heritage-integration/cookie-helper.js";
+import {getFunnelCookie, getDeviceIdValue, getSessionKeyValue} from "@/helpers/heritage-integration/cookie-helper.js";
import { removeAllTestCookies, setupCookies } from "@/helpers/unit-test-helper";
describe("cookies", () => {
@@ -100,5 +100,31 @@ describe("cookies", () => {
expect(actualCookieValue).toBeNull();
});
})
+
+ describe("getDeviceIdValue", () => {
+ test("getDeviceIdValue, should return GUID", () => {
+ // Arrange
+ setupCookies({});
+
+ // Act
+ const result = getDeviceIdValue();
+
+ //Assert
+ expect(result).toBe('21b9b94a-ec23-42c1-aaac-e2ae4e4dbffe');
+
+ });
+
+ test("getSessionKeyValue, should return session key int", () => {
+ // Arrange
+ setupCookies({});
+
+ // Act
+ const result = getSessionKeyValue();
+
+ //Assert
+ expect(result).toBe('12345');
+
+ });
+ });
})
\ No newline at end of file
diff --git a/src/helpers/heritage-integration/navigation-helper.js b/src/helpers/heritage-integration/navigation-helper.js
index 77d6abe92..581d81bb6 100644
--- a/src/helpers/heritage-integration/navigation-helper.js
+++ b/src/helpers/heritage-integration/navigation-helper.js
@@ -2,55 +2,38 @@ import { queryStrings } from "@/constants/query-strings";
import { externalUrls } from "@/router/router-constants/externalUrl-values";
import { lazyLoadComponent } from "@/router/dynamic-routing/component-loader.js";
import { saveOrder } from "@/helpers/heritage-integration/order-helper.js";
+import { fmgPageValues } from "@/router/router-constants/fmgPage-values";
import store from "@/store";
import router from "@/router";
/*
If the user has visited the funnel before this method will determine the bets place to
drop them so they don't start at the beginning again. This method will return 'heritage' if
- the user has an existing order and they come back in from the Safelite.com CTA.
+ the user has an existing order and they come back in from the Safelite.com CTA.
*/
export async function getPageToRouteExistingOrderTo(toRoute = {}, existingHeritageOrder = false) {
// If the user is coming in via the Safelite.Com CTA
if (toRoute.query[queryStrings.START_TYPE] === 'fmg') {
-
// If they have an existing order, return 'heritage' for the page name.
if (existingHeritageOrder) {
return 'heritage';
}
+
+ return await getLatestPageForRedirection();
}
-
- // If this is a non-CTA navigation, determine where to send the user based on page prerequisites.
- // This also works if a user has a 'fmg' start_type query string but no current order.
- // That shouldn't happen, but it's possible.
- const vehicleMakeComponent = (await lazyLoadComponent('vehicle-make')()).default;
- const vehicleModelComponent = (await lazyLoadComponent('vehicle-model')()).default;
- const vehicleStyleComponent = (await lazyLoadComponent('vehicle-style')()).default;
- const vehicleDamageComponent = (await lazyLoadComponent('vehicle-damage')()).default;
-
-
- if (!vehicleMakeComponent.methods.arePagePrerequisitesValid()) {
- return "vehicle-year";
- } else if (!vehicleModelComponent.methods.arePagePrerequisitesValid()) {
- return "vehicle-make";
- } else if (!vehicleStyleComponent.methods.arePagePrerequisitesValid()) {
- return "vehicle-model";
- } else if (!vehicleDamageComponent.methods.arePagePrerequisitesValid()) {
- return "vehicle-style";
- } else if (store.getters.damage.isRepair == null || !store.getters.vehicle.carId) {
- return 'vehicle-damage'
- } else {
- if (store.getters.vehicle.vin) {
- return 'vehicle-damage';
- //return "vin-lookup"; (uncomment)
- } else {
- return 'vehicle-damage';
- //return "estimate" (uncomment)
- }
+ // If navigating to a specific page, and that page is not part of the vin pages.
+ // Return that page, so that it can navigate like normal.
+ if (toRoute.query[queryStrings.FMG_PAGE] !== undefined && !isVinRelatedPage(toRoute)) {
+ return overrideYmmsDirectionIfNeeded(toRoute);
}
+ // If this is not a direct link to a page using fmgPage, not from Safelite.com CTA or this is a vin related page.
+ // Get the latest page for redirection.
+ const latestPageRoute = await getLatestPageForRedirection();
+
+ return latestPageRoute;
}
/*
@@ -65,10 +48,81 @@ export async function navigateToHeritageFunnel() {
externalUrls.HERITAGE_FUNNEL,
{
corid: store.getters.order.referralCorrelationId,
- src: "concept-funnel",
- // TODO CSR-28, remove this
- cns: "all",
- experiments: "RemoveServiceAreaPage=ServAreaRemoval_V7=NoShowPackages_CONTROL=true,ConceptFunnel=ConceptFunnel_V1=ConceptFunnel_TEST=true"
+ src: "concept-funnel"
}
);
-}
\ No newline at end of file
+}
+
+/*
+ Logic for getting the last "valid" page a user visited.
+*/
+async function getLatestPageForRedirection() {
+ // If this is a non-CTA navigation, determine where to send the user based on page prerequisites.
+ // This also works if a user has a 'fmg' start_type query string but no current order.
+ // That shouldn't happen, but it's possible.
+ const vehicleMakeComponent = (await lazyLoadComponent('vehicle-make')()).default;
+ const vehicleModelComponent = (await lazyLoadComponent('vehicle-model')()).default;
+ const vehicleStyleComponent = (await lazyLoadComponent('vehicle-style')()).default;
+ const vehicleDamageComponent = (await lazyLoadComponent('vehicle-damage')()).default;
+
+
+ if (!vehicleMakeComponent.methods.arePagePrerequisitesValid()) {
+ return fmgPageValues.VEHICLE_YEAR;
+ } else if (!vehicleModelComponent.methods.arePagePrerequisitesValid()) {
+ return fmgPageValues.VEHICLE_MAKE;
+ } else if (!vehicleStyleComponent.methods.arePagePrerequisitesValid()) {
+ return fmgPageValues.VEHICLE_MODEL;
+ } else if (!vehicleDamageComponent.methods.arePagePrerequisitesValid()) {
+ return fmgPageValues.VEHICLE_STYLE;
+ } else if (store.getters.damage.isRepair == null || !store.getters.vehicle.carId) {
+ return fmgPageValues.VEHICLE_DAMAGE;
+ } else {
+ if (store.getters.vehicle.vin) {
+ return fmgPageValues.VIN_LOOKUP;
+ } else {
+ return fmgPageValues.ESTIMATE;
+ }
+ }
+}
+
+/*
+ Overrides functionality to go to the YMMS pages in certain cases.
+ If this is not one of the cases, it returns the 'to' fmgPage value.
+*/
+
+/* istanbul ignore next */
+function overrideYmmsDirectionIfNeeded(toRoute) {
+ const fmgPageValue = toRoute.query[queryStrings.FMG_PAGE];
+
+ if (store.getters.payment.insuranceCoverage.isVerified) {
+ switch (fmgPageValue) {
+ case fmgPageValues.VEHICLE_YEAR:
+ case fmgPageValues.VEHICLE_MAKE:
+ case fmgPageValues.VEHICLE_MODEL:
+ case fmgPageValues.VEHICLE_STYLE:
+ {
+ return fmgPageValues.VEHICLE_DAMAGE;
+ }
+ default: {
+ return fmgPageValue;
+ }
+ }
+ } else {
+ return fmgPageValue;
+ }
+}
+
+/*
+ Determine if the page is a vin related page.
+*/
+
+/* istanbul ignore next */
+function isVinRelatedPage(toRoute) {
+ const fmgPageValue = toRoute.query[queryStrings.FMG_PAGE];
+
+ return fmgPageValue === fmgPageValues.VIN_LOOKUP ||
+ fmgPageValue === fmgPageValues.LICENSE_PLATE_LOOKUP ||
+ fmgPageValue === fmgPageValues.ADDRESS_LOOKUP ||
+ fmgPageValue === fmgPageValues.ADDRESS_VEHICLES ||
+ fmgPageValue === fmgPageValues.ESTIMATE;
+}
diff --git a/src/helpers/heritage-integration/navigation-helper.spec.js b/src/helpers/heritage-integration/navigation-helper.spec.js
index be1136e63..fd06920c2 100644
--- a/src/helpers/heritage-integration/navigation-helper.spec.js
+++ b/src/helpers/heritage-integration/navigation-helper.spec.js
@@ -228,8 +228,7 @@ describe("getPageToRouteExistingOrderTo", () => {
const result = await getPageToRouteExistingOrderTo(toRoute, false);
//Assert
- //expect(result).toBe('vin-lookup');
- expect(result).toBe('vehicle-damage');
+ expect(result).toBe('vin-lookup');
});
test("getPageToRouteExistingOrderTo, should return estimate", async () => {
@@ -284,8 +283,7 @@ describe("getPageToRouteExistingOrderTo", () => {
const result = await getPageToRouteExistingOrderTo(toRoute, false);
//Assert
- //expect(result).toBe('estimate');
- expect(result).toBe('vehicle-damage');
+ expect(result).toBe('estimate');
});
test("getPageToRouteExistingOrderTo, existing order, should return heritage", async () => {
diff --git a/src/helpers/unit-test-helper.js b/src/helpers/unit-test-helper.js
index 4b9aeaccd..20fad7ba2 100644
--- a/src/helpers/unit-test-helper.js
+++ b/src/helpers/unit-test-helper.js
@@ -60,7 +60,9 @@ export const cookies = {
[cookieNames.FUNNEL_SESSION_INFO]: `{"ReferralNumber":"1566818","ReferralDate":"2022-03-15T10:56:24.597","ReferralCorrelationId":"404d2b04-f86e-45c3-b373-127b6217b060","ShouldResetState":false,"DidHeritageFunnelUpdateLast":true}`,
"UNIQUE_SESSION_ID": "33756020-b58e-4ec7-b8b8-3f1576719c40",
"anotherCookie": "{}",
- "someOtherCookie": "{}"
+ "someOtherCookie": "{}",
+ "dxdev": "did=21b9b94a-ec23-42c1-aaac-e2ae4e4dbffe",
+ "skey": "12345"
};
export function removeAllTestCookies() {
diff --git a/src/layouts/address-lookup/address-lookup.vue b/src/layouts/address-lookup/address-lookup.vue
index 2086cd032..7a90ee123 100644
--- a/src/layouts/address-lookup/address-lookup.vue
+++ b/src/layouts/address-lookup/address-lookup.vue
@@ -12,7 +12,7 @@
diff --git a/src/layouts/estimate/estimate.vue b/src/layouts/estimate/estimate.vue
new file mode 100644
index 000000000..0e41b24ed
--- /dev/null
+++ b/src/layouts/estimate/estimate.vue
@@ -0,0 +1,13 @@
+