Merge pull request #955 from Safelite/feature/INSR-2205
INSR-2205: Catch non-serviceable big trucks in the flow / display error message
This commit is contained in:
commit
a59e96e18c
17 changed files with 450 additions and 59 deletions
|
|
@ -2,7 +2,8 @@ const vehicleLookupAlertTypes = Object.freeze({
|
|||
NOT_FOUND: 'notFound',
|
||||
NOT_MATCHED: 'notMatched',
|
||||
TWO_IDENTICAL_YMM_MATCHED: 'twoIdenticalYMMMatched',
|
||||
PERFECT_MATCH: 'perfectMatch'
|
||||
PERFECT_MATCH: 'perfectMatch',
|
||||
NO_SERVICE: 'noService'
|
||||
});
|
||||
|
||||
export default vehicleLookupAlertTypes;
|
||||
|
|
|
|||
|
|
@ -110,7 +110,8 @@ describe('address-lookup.vue', () => {
|
|||
vinVehicles: [
|
||||
{
|
||||
vehicle: {
|
||||
carId: 'C00000'
|
||||
carId: 'C00000',
|
||||
canSafeliteService: true
|
||||
}
|
||||
}
|
||||
]
|
||||
|
|
@ -144,7 +145,8 @@ describe('address-lookup.vue', () => {
|
|||
vinVehicles: [
|
||||
{
|
||||
vehicle: {
|
||||
carId: 'C00000'
|
||||
carId: 'C00000',
|
||||
canSafeliteService: true
|
||||
}
|
||||
}
|
||||
]
|
||||
|
|
@ -275,7 +277,8 @@ describe('address-lookup.vue', () => {
|
|||
vinVehicles: [
|
||||
{
|
||||
vehicle: {
|
||||
carId: 'C11111'
|
||||
carId: 'C11111',
|
||||
canSafeliteService: true
|
||||
}
|
||||
}
|
||||
]
|
||||
|
|
@ -468,5 +471,76 @@ describe('address-lookup.vue', () => {
|
|||
// Assert
|
||||
expect(wrapper.vm.navigateForwardWithSingleCarMatch).toHaveBeenCalledTimes(1);
|
||||
});
|
||||
|
||||
test('selected vehicle is a non-serviceable big truck, display no service alert', async () => {
|
||||
// Arrange
|
||||
const mockRegistrationAddress = {
|
||||
streetAddress: '1234 Main St',
|
||||
city: 'Columbus',
|
||||
state: 'OH',
|
||||
zipCode: '43215'
|
||||
};
|
||||
|
||||
const { wrapper } = setupMocks({
|
||||
vinVehicles: [
|
||||
{
|
||||
vehicle: {
|
||||
carId: 'BIGTRUCKCARID',
|
||||
isBigTruck: true,
|
||||
canSafeliteService: false
|
||||
}
|
||||
}
|
||||
]
|
||||
});
|
||||
|
||||
useMainStore().order.vehicle.carId = 'BIGTRUCKCARID';
|
||||
|
||||
await wrapper.setData({
|
||||
customerQuestions: {
|
||||
addressQuestions: mockRegistrationAddress
|
||||
},
|
||||
});
|
||||
|
||||
// Act
|
||||
await wrapper.vm.forwardButtonAction();
|
||||
|
||||
// Assert
|
||||
expect(wrapper.findComponent({ ref: 'alertNoService' }).isVisible()).toBe(true);
|
||||
});
|
||||
test('selected vehicle is a serviceable big truck, do not display no service alert', async () => {
|
||||
// Arrange
|
||||
const mockRegistrationAddress = {
|
||||
streetAddress: '1234 Main St',
|
||||
city: 'Columbus',
|
||||
state: 'OH',
|
||||
zipCode: '43215'
|
||||
};
|
||||
|
||||
const { wrapper } = setupMocks({
|
||||
vinVehicles: [
|
||||
{
|
||||
vehicle: {
|
||||
carId: 'BIGTRUCKCARID2',
|
||||
isBigTruck: true,
|
||||
canSafeliteService: true
|
||||
}
|
||||
}
|
||||
]
|
||||
});
|
||||
|
||||
useMainStore().order.vehicle.carId = 'BIGTRUCKCARID2';
|
||||
|
||||
await wrapper.setData({
|
||||
customerQuestions: {
|
||||
addressQuestions: mockRegistrationAddress
|
||||
},
|
||||
});
|
||||
|
||||
// Act
|
||||
await wrapper.vm.$nextTick();
|
||||
|
||||
// Assert
|
||||
expect(wrapper.findComponent({ ref: 'alertNoService' }).exists()).toBe(false);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
|
|
|||
|
|
@ -53,6 +53,13 @@
|
|||
cmsWidgetName="AlertVinLookupsByHomeAddressNotAllowedWidget"
|
||||
alertClass="alert-danger"
|
||||
:isDismissible="false" />
|
||||
<alert
|
||||
v-if="displayNoServiceAlert"
|
||||
ref="alertNoService"
|
||||
class="mt-5"
|
||||
cmsWidgetName="AlertNoServiceWidget"
|
||||
alertClass="alert-danger"
|
||||
:isDismissable="false" />
|
||||
<customerQuestions
|
||||
ref="customerQuestions"
|
||||
v-model="customerQuestions" />
|
||||
|
|
@ -137,7 +144,8 @@ export default {
|
|||
isCarIdDifferent: false,
|
||||
isSelectedGlassAvailableForVehicle: true,
|
||||
customAlertData: {},
|
||||
forwardButtonCarStyle: ''
|
||||
forwardButtonCarStyle: '',
|
||||
displayNoServiceAlert: false
|
||||
};
|
||||
},
|
||||
computed: {
|
||||
|
|
@ -262,6 +270,12 @@ export default {
|
|||
// Single VIN found
|
||||
const carFound = carsFound[0].vehicle;
|
||||
|
||||
if (!carFound.canSafeliteService) {
|
||||
this.displayNoServiceAlert = true;
|
||||
this.$refs.siteFooter.disableForwardButton();
|
||||
return this.$refs.siteFooter.removeLoader();
|
||||
}
|
||||
|
||||
this.isCarIdDifferent =
|
||||
carFound.carId !== useMainStore().order.vehicle.carId;
|
||||
if (this.isCarIdDifferent && carFound.carId !== this.previouslyEnteredCarId) {
|
||||
|
|
@ -370,6 +384,7 @@ export default {
|
|||
this.displayVinNotFoundAlert = false;
|
||||
this.displayMatchedDifferentVehicleAlert = false;
|
||||
this.displayVinLookupByHomeAddressNotAllowedAlert = false;
|
||||
this.displayNoServiceAlert = false;
|
||||
this.$refs.siteFooter.enableForwardAction();
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -120,6 +120,7 @@ function setupMocks({
|
|||
wrapper.vm.navigateBack = baseMixin.methods.navigateBack;
|
||||
wrapper.vm.$refs.siteFooter.updateButtonText = jest.fn();
|
||||
wrapper.vm.$refs.siteFooter.removeLoader = jest.fn();
|
||||
wrapper.vm.$refs.siteFooter.disableForwardButton = jest.fn();
|
||||
|
||||
return { wrapper };
|
||||
}
|
||||
|
|
@ -248,4 +249,94 @@ describe('address-vehicles.vue', () => {
|
|||
// Assert
|
||||
expect(arePagePrerequisitesValid).toBe(true);
|
||||
});
|
||||
|
||||
test('selected vehicle is a non-serviceable big truck, display no service alert', async () => {
|
||||
// Arrange
|
||||
const { wrapper } = setupMocks({});
|
||||
useMainStore().order.vehicle.carId = 'BIGTRUCKCARID';
|
||||
useMainStore().applicationUser = {
|
||||
pageData: {
|
||||
'address-vehicles':
|
||||
[
|
||||
{
|
||||
vehicle: {
|
||||
carId: 'BIGTRUCKCARID',
|
||||
make: 'Isuzu',
|
||||
model: 'Reach',
|
||||
style: 'Step Van',
|
||||
year: 2015,
|
||||
isBigTruck: true,
|
||||
canSafeliteService: false
|
||||
},
|
||||
vin: 'BIGTRUCKVIN'
|
||||
}
|
||||
]
|
||||
}
|
||||
};
|
||||
|
||||
await wrapper.setData({
|
||||
selectedVehicleVin: 'BIGTRUCKVIN',
|
||||
previouslyEnteredCarId: 'BIGTRUCKCARID'
|
||||
});
|
||||
|
||||
wrapper.vm.selectedVehicle = {
|
||||
vin: 'BIGTRUCKVIN',
|
||||
vehicle: {
|
||||
carId: 'BIGTRUCKCARID',
|
||||
isBigTruck: true,
|
||||
canSafeliteService: false
|
||||
}
|
||||
}
|
||||
|
||||
// Act
|
||||
await wrapper.vm.$nextTick();
|
||||
|
||||
// Assert
|
||||
expect(wrapper.findComponent({ ref: 'AlertNoService' }).isVisible()).toBe(true);
|
||||
});
|
||||
|
||||
test('selected vehicle is a serviceable big truck, do not display no service alert', async () => {
|
||||
// Arrange
|
||||
const { wrapper } = setupMocks({});
|
||||
useMainStore().order.vehicle.carId = 'BIGTRUCKCARID2';
|
||||
useMainStore().applicationUser = {
|
||||
pageData: {
|
||||
'address-vehicles':
|
||||
[
|
||||
{
|
||||
vehicle: {
|
||||
carId: 'BIGTRUCKCARID2',
|
||||
make: 'Mack',
|
||||
model: 'Terrapro',
|
||||
style: 'Cabover',
|
||||
year: 2024,
|
||||
isBigTruck: true,
|
||||
canSafeliteService: true
|
||||
},
|
||||
vin: 'BIGTRUCKVIN2'
|
||||
}
|
||||
]
|
||||
}
|
||||
};
|
||||
|
||||
await wrapper.setData({
|
||||
selectedVehicleVin: 'BIGTRUCKVIN2',
|
||||
previouslyEnteredCarId: 'BIGTRUCKCARID2'
|
||||
});
|
||||
2
|
||||
wrapper.vm.selectedVehicle = {
|
||||
vin: 'BIGTRUCKVIN2',
|
||||
vehicle: {
|
||||
carId: 'BIGTRUCKCARID2',
|
||||
isBigTruck: true,
|
||||
canSafeliteService: true
|
||||
}
|
||||
}
|
||||
|
||||
// Act
|
||||
await wrapper.vm.$nextTick();
|
||||
|
||||
// Assert
|
||||
expect(wrapper.findComponent({ ref: 'AlertNoService' }).exists()).toBe(false);
|
||||
});
|
||||
});
|
||||
|
|
|
|||
|
|
@ -26,6 +26,13 @@
|
|||
:manualHeadline="AlertFoundMultipleVehiclesHeader"
|
||||
manualCopy=""
|
||||
:isDismissible="false" />
|
||||
<alert
|
||||
ref="AlertNoService"
|
||||
v-if="displayNoServiceAlert"
|
||||
class="mt-5"
|
||||
cmsWidgetName="AlertVehicleSelection"
|
||||
alertClass="alert-danger"
|
||||
:isDismissable="false" />
|
||||
<addressVehiclesQuestion
|
||||
ref="addressVehiclesQuestion"
|
||||
v-model="selectedVehicleVin"
|
||||
|
|
@ -156,7 +163,8 @@ export default {
|
|||
displayMatchedDifferentVehicleAlert: false,
|
||||
displayMatchedTwoIdenticalYMMVehicleAlert: false,
|
||||
previouslyEnteredCarId: '',
|
||||
forwardButtonCarStyle: ''
|
||||
forwardButtonCarStyle: '',
|
||||
displayNoServiceAlert: false
|
||||
};
|
||||
},
|
||||
computed: {
|
||||
|
|
@ -211,6 +219,10 @@ export default {
|
|||
selectedVehicleVin: {
|
||||
handler() {
|
||||
this.resetWarningsAndErrors();
|
||||
if (!this.selectedVehicle?.vehicle.canSafeliteService) {
|
||||
this.displayNoServiceAlert = true;
|
||||
return this.$refs.siteFooter.disableForwardButton();
|
||||
}
|
||||
// does this vehicle match the previously selected carId?
|
||||
this.isCarIdDifferent =
|
||||
this.selectedVehicle?.vehicle.carId
|
||||
|
|
|
|||
|
|
@ -34,7 +34,8 @@ function setupMocks({
|
|||
data: lookupVinByPlateResponse || {
|
||||
vin: 'TEST_VIN',
|
||||
vehicle: {
|
||||
carId: 'CARID'
|
||||
carId: 'CARID',
|
||||
canSafeliteService: true
|
||||
}
|
||||
},
|
||||
error: vinLookupResponseError
|
||||
|
|
@ -151,6 +152,68 @@ describe('license-plate-lookup.vue', () => {
|
|||
// Assert
|
||||
expect(wrapper.findComponent({ ref: 'alertVinNotFound' }).isVisible()).toBe(true);
|
||||
});
|
||||
test('non-serviceable big truck found, display NoServiceAlert', async () => {
|
||||
// Arrange
|
||||
const mockRegistrationLicensePlate = {
|
||||
licensePlate: 'BIGTRUCKTEST'
|
||||
};
|
||||
|
||||
const { wrapper } = setupMocks({
|
||||
lookupVinByPlateResponse: {
|
||||
vin: 'BIGTRUCKVIN',
|
||||
vehicle: {
|
||||
carId: 'BIGTRUCKTESTCARID',
|
||||
isBigTruck: true,
|
||||
canSafeliteService: false
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
useMainStore().order.vehicle.carId = 'BIGTRUCKTESTCARID';
|
||||
|
||||
await wrapper.setData({
|
||||
licensePlate: mockRegistrationLicensePlate
|
||||
});
|
||||
|
||||
wrapper.vm.navigateForward = jest.fn();
|
||||
|
||||
// Act
|
||||
await wrapper.vm.forwardButtonAction();
|
||||
|
||||
// Assert
|
||||
expect(wrapper.findComponent({ ref: 'alertNoService' }).isVisible()).toBe(true);
|
||||
});
|
||||
test('serviceable big truck found, do not display NoServiceAlert', async () => {
|
||||
// Arrange
|
||||
const mockRegistrationLicensePlate = {
|
||||
licensePlate: 'BIGTRUCKTEST2'
|
||||
};
|
||||
|
||||
const { wrapper } = setupMocks({
|
||||
lookupVinByPlateResponse: {
|
||||
vin: 'BIGTRUCKVIN2',
|
||||
vehicle: {
|
||||
carId: 'BIGTRUCKTESTCARID2',
|
||||
isBigTruck: true,
|
||||
canSafeliteService: true
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
useMainStore().order.vehicle.carId = 'BIGTRUCKTESTCARID2';
|
||||
|
||||
await wrapper.setData({
|
||||
licensePlate: mockRegistrationLicensePlate
|
||||
});
|
||||
|
||||
wrapper.vm.navigateForward = jest.fn();
|
||||
|
||||
// Act
|
||||
await wrapper.vm.forwardButtonAction();
|
||||
|
||||
// Assert
|
||||
expect(wrapper.findComponent({ ref: 'alertNoService' }).exists()).toBe(false);
|
||||
});
|
||||
});
|
||||
|
||||
describe('navigation', () => {
|
||||
|
|
|
|||
|
|
@ -47,6 +47,13 @@
|
|||
:manualCopy="AlertMatchedTwoIdenticalYMMVehicleBody"
|
||||
alertClass="alert-warning"
|
||||
:isDismissible="false" />
|
||||
<alert
|
||||
v-if="displayNoServiceAlert"
|
||||
ref="alertNoService"
|
||||
class="my-5"
|
||||
cmsWidgetName="AlertNoServiceWidget"
|
||||
alertClass="alert-danger"
|
||||
:isDismissable="false" />
|
||||
<textboxQuestion
|
||||
id="license-plate-question-wrapper"
|
||||
v-model="licensePlate"
|
||||
|
|
@ -156,7 +163,8 @@ export default {
|
|||
isCarIdDifferent: false,
|
||||
customAlertData: {},
|
||||
isSelectedGlassAvailableForVehicle: true,
|
||||
forwardButtonCarStyle: ''
|
||||
forwardButtonCarStyle: '',
|
||||
displayNoServiceAlert: false
|
||||
};
|
||||
},
|
||||
computed: {
|
||||
|
|
@ -273,6 +281,12 @@ export default {
|
|||
// Vehicle found from VIN lookup
|
||||
const vehicleFromLookup = vinLookupResponse.data.vehicle;
|
||||
|
||||
if (!vehicleFromLookup.canSafeliteService) {
|
||||
this.displayNoServiceAlert = true;
|
||||
this.$refs.siteFooter.disableForwardButton();
|
||||
return this.$refs.siteFooter.removeLoader();
|
||||
}
|
||||
|
||||
// Check if the CarId has changed
|
||||
this.isCarIdDifferent = vehicleFromLookup.carId !== useMainStore().order.vehicle.carId;
|
||||
// Handle changing car
|
||||
|
|
@ -333,6 +347,7 @@ export default {
|
|||
resetWarningsAndErrors() {
|
||||
this.displayVinNotFoundAlert = false;
|
||||
this.displayMatchedDifferentVehicleAlert = false;
|
||||
this.displayNoServiceAlert = false;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
|
|
|||
|
|
@ -73,6 +73,7 @@ function setupMocks() {
|
|||
wrapper.vm.setCmsContent = baseMixin.methods.setCmsContent;
|
||||
wrapper.vm.$refs.siteFooter.updateButtonText = jest.fn();
|
||||
wrapper.vm.$refs.siteFooter.removeLoader = jest.fn();
|
||||
wrapper.vm.$refs.siteFooter.disableForwardButton = jest.fn();
|
||||
return { wrapper };
|
||||
}
|
||||
|
||||
|
|
@ -737,4 +738,54 @@ describe('policy-vehicles.vue', () => {
|
|||
// Assert
|
||||
expect(wrapper.vm.selectedVehicleVin).toBe(vin);
|
||||
});
|
||||
|
||||
test('selected vehicle is a non-serviceable big truck, display no service alert', async () => {
|
||||
// Arrange
|
||||
const vin = getRandomString(17, 17);
|
||||
const policyVehicle = {
|
||||
vin,
|
||||
isBigTruck: true,
|
||||
canSafeliteService: false
|
||||
};
|
||||
|
||||
const { wrapper } = setupMocks({});
|
||||
|
||||
await wrapper.setData({
|
||||
selectedVehicleVin: vin,
|
||||
selectedPolicyVehicle: policyVehicle,
|
||||
policyVehicles: [policyVehicle],
|
||||
policyVinFound: true
|
||||
});
|
||||
|
||||
wrapper.vm.displayNoServiceAlert = true;
|
||||
await wrapper.vm.$nextTick();
|
||||
|
||||
// Assert
|
||||
expect(wrapper.findComponent({ ref: 'AlertNoService' }).isVisible()).toBe(true);
|
||||
});
|
||||
|
||||
test('selected vehicle is a serviceable big truck, do not display no service alert', async () => {
|
||||
// Arrange
|
||||
const vin = getRandomString(17, 17);
|
||||
const policyVehicle = {
|
||||
vin,
|
||||
isBigTruck: true,
|
||||
canSafeliteService: true
|
||||
};
|
||||
|
||||
const { wrapper } = setupMocks({});
|
||||
|
||||
await wrapper.setData({
|
||||
selectedVehicleVin: vin,
|
||||
selectedPolicyVehicle: policyVehicle,
|
||||
policyVehicles: [policyVehicle],
|
||||
policyVinFound: true
|
||||
});
|
||||
|
||||
wrapper.vm.displayNoServiceAlert = false;
|
||||
await wrapper.vm.$nextTick();
|
||||
|
||||
// Assert
|
||||
expect(wrapper.findComponent({ ref: 'AlertNoService' }).exists()).toBe(false);
|
||||
});
|
||||
});
|
||||
|
|
|
|||
|
|
@ -24,6 +24,13 @@
|
|||
cmsWidgetName="PolicyVehiclesQuestion"
|
||||
:vehicles="VehiclesForQuestions"
|
||||
:validationRules="rules.optionRequired" />
|
||||
<alert
|
||||
ref="AlertNoService"
|
||||
v-if="displayNoServiceAlert"
|
||||
class="mt-3"
|
||||
cmsWidgetName="AlertVehicleSelection"
|
||||
alertClass="alert-danger"
|
||||
:isDismissable="false" />
|
||||
<siteFooter
|
||||
ref="siteFooter"
|
||||
cmsWidgetName="SiteFooterWidget"
|
||||
|
|
@ -58,6 +65,7 @@ import {
|
|||
repairWaivedForSelectedVehicle
|
||||
} from '@/helpers/policy-vehicle-helper';
|
||||
import coverageType from '@/constants/coverage-type';
|
||||
import alert from '@/ux-components/alert/alert.vue';
|
||||
|
||||
export default {
|
||||
name: 'policy-vehicles',
|
||||
|
|
@ -67,7 +75,8 @@ export default {
|
|||
vehicleBanner,
|
||||
policyVehiclesQuestion,
|
||||
// eslint-disable-next-line vue/no-reserved-component-names
|
||||
Form
|
||||
Form,
|
||||
alert
|
||||
},
|
||||
mixins: [BaseFormMixin],
|
||||
async beforeRouteEnter(to, from, next) {
|
||||
|
|
@ -89,7 +98,8 @@ export default {
|
|||
policyVinFound: true,
|
||||
rules: {
|
||||
optionRequired: globalRules.OPTION_REQUIRED
|
||||
}
|
||||
},
|
||||
displayNoServiceAlert: false
|
||||
};
|
||||
},
|
||||
computed: {
|
||||
|
|
@ -115,7 +125,6 @@ export default {
|
|||
if (this.selectedVehicleVin !== vehicleSelectionOptions.VEHICLE_NOT_LISTED) {
|
||||
return this.policyVehicles.find((p) => p.vin === this.selectedVehicleVin);
|
||||
}
|
||||
|
||||
return null;
|
||||
},
|
||||
noCoverageForSelectedVehicle() {
|
||||
|
|
@ -137,6 +146,7 @@ export default {
|
|||
},
|
||||
watch: {
|
||||
async selectedVehicleVin(value) {
|
||||
this.displayNoServiceAlert = false;
|
||||
if (value === vehicleSelectionOptions.VEHICLE_NOT_LISTED) {
|
||||
// clear previously selected vehicle and image
|
||||
this.mainStore.resetVehicleState();
|
||||
|
|
@ -151,6 +161,10 @@ export default {
|
|||
this.displayGeneric = true;
|
||||
return;
|
||||
}
|
||||
if (!vehicle?.data.canSafeliteService) {
|
||||
this.displayNoServiceAlert = true;
|
||||
this.$refs.siteFooter.disableForwardButton();
|
||||
}
|
||||
if (vehicle) {
|
||||
// save selected vehicle to the store
|
||||
this.displayGeneric = false;
|
||||
|
|
|
|||
|
|
@ -52,18 +52,23 @@
|
|||
:updateValues="updateStyleValues"
|
||||
validationRules="style-required"
|
||||
inputId="styleQuestionField" />
|
||||
|
||||
<vehicleBanner
|
||||
ref="banner"
|
||||
cmsWidgetName="VehicleBannerWidget"
|
||||
:displayGenericVehicleImage="displayGeneric"
|
||||
class="mt-5 mb-3" />
|
||||
|
||||
<alert
|
||||
ref="AlertNoService"
|
||||
v-if="displayNoServiceAlert"
|
||||
class="mt-5"
|
||||
cmsWidgetName="AlertVehicleSelection"
|
||||
alertClass="alert-danger"
|
||||
:isDismissable="false" />
|
||||
<siteFooter
|
||||
ref="siteFooter"
|
||||
class="mt-5"
|
||||
cmsWidgetName="SiteFooterWidget"
|
||||
:isForwardActionDisabled="!meta.valid"
|
||||
:isForwardActionDisabled="!meta.valid || displayNoServiceAlert"
|
||||
@ForwardClicked="forwardButtonAction"
|
||||
@backClicked="navigateBack" />
|
||||
</div>
|
||||
|
|
@ -79,6 +84,7 @@ import siteFooter from '@/iss-components/site-footer/site-footer.vue';
|
|||
import siteSubHeader from '@/iss-components/site-sub-header/site-sub-header.vue';
|
||||
import vehicleBanner from '@/iss-components/vehicle-banner/vehicle-banner.vue';
|
||||
import vehicleQuestion from '@/layouts/vehicle-selection/vehicle-question/vehicle-question.vue';
|
||||
import alert from '@/ux-components/alert/alert.vue';
|
||||
import { useMainStore } from '@/store';
|
||||
|
||||
// Supporting files
|
||||
|
|
@ -105,7 +111,8 @@ export default {
|
|||
siteFooter,
|
||||
// eslint-disable-next-line vue/no-reserved-component-names
|
||||
Form,
|
||||
vehicleQuestion
|
||||
vehicleQuestion,
|
||||
alert
|
||||
},
|
||||
mixins: [baseFormMixin],
|
||||
|
||||
|
|
@ -138,7 +145,8 @@ export default {
|
|||
selectedYear: year,
|
||||
selectedMake: make,
|
||||
selectedModel: model,
|
||||
selectedStyle: style
|
||||
selectedStyle: style,
|
||||
displayNoServiceAlert: false
|
||||
};
|
||||
},
|
||||
computed: {
|
||||
|
|
@ -146,9 +154,9 @@ export default {
|
|||
return !this.selectedStyle;
|
||||
}
|
||||
},
|
||||
|
||||
watch: {
|
||||
selectedYear(value) {
|
||||
this.resetAlert();
|
||||
this.mainStore.updateVehicleYear(value);
|
||||
this.$refs.vehicleMakeQuestion.clearValues();
|
||||
if (value) {
|
||||
|
|
@ -156,6 +164,7 @@ export default {
|
|||
}
|
||||
},
|
||||
selectedMake(value) {
|
||||
this.resetAlert();
|
||||
this.mainStore.updateVehicleMake(value);
|
||||
this.$refs.vehicleModelQuestion.clearValues();
|
||||
if (value) {
|
||||
|
|
@ -163,6 +172,7 @@ export default {
|
|||
}
|
||||
},
|
||||
selectedModel(value) {
|
||||
this.resetAlert();
|
||||
this.mainStore.updateVehicleModel(value);
|
||||
this.$refs.vehicleStyleQuestion.clearValues();
|
||||
if (value) {
|
||||
|
|
@ -170,8 +180,16 @@ export default {
|
|||
}
|
||||
},
|
||||
selectedStyle(value) {
|
||||
this.resetAlert();
|
||||
this.mainStore.updateVehicleStyle(value);
|
||||
this.mainStore.setVehicle();
|
||||
this.mainStore.setVehicle(
|
||||
this.selectedYear,
|
||||
this.selectedMake,
|
||||
this.selectedModel,
|
||||
this.selectedStyle
|
||||
).then((result) => {
|
||||
this.displayNoServiceAlert = !result.data.canSafeliteService;
|
||||
});
|
||||
}
|
||||
},
|
||||
mounted() {
|
||||
|
|
@ -185,6 +203,16 @@ export default {
|
|||
if (this.selectedModel) {
|
||||
this.$refs.vehicleStyleQuestion.getNewValues();
|
||||
}
|
||||
if (this.selectedStyle) {
|
||||
this.mainStore.setVehicle(
|
||||
this.selectedYear,
|
||||
this.selectedMake,
|
||||
this.selectedModel,
|
||||
this.selectedStyle
|
||||
).then((result) => {
|
||||
this.displayNoServiceAlert = !result.data.canSafeliteService;
|
||||
});
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
arePagePrerequisitesValid() {
|
||||
|
|
@ -264,7 +292,10 @@ export default {
|
|||
this.$route
|
||||
);
|
||||
});
|
||||
}
|
||||
},
|
||||
resetAlert() {
|
||||
this.displayNoServiceAlert = false;
|
||||
}
|
||||
}
|
||||
};
|
||||
</script>
|
||||
|
|
|
|||
|
|
@ -0,0 +1,26 @@
|
|||
<template>
|
||||
<alert
|
||||
id="no-service-alert"
|
||||
alertClass="alert-danger"
|
||||
cmsWidgetName="AlertNoServiceWidget"
|
||||
aria-label="no-service-alert" />
|
||||
</template>
|
||||
<script>
|
||||
import alert from '@/ux-components/alert/alert.vue';
|
||||
|
||||
export default {
|
||||
name: 'no-service-alert',
|
||||
components: {
|
||||
alert
|
||||
},
|
||||
inject: ['vehicleFromLookup']
|
||||
};
|
||||
</script>
|
||||
<style>
|
||||
/**
|
||||
Override wrong margin-bottom rule in the Alert component.
|
||||
*/
|
||||
#no-service-alert p:last-of-type {
|
||||
margin-bottom: 0 !important;
|
||||
}
|
||||
</style>
|
||||
|
|
@ -68,4 +68,17 @@ describe('vin-lookup-alerts.vue', () => {
|
|||
|
||||
expect(twoIdenticalYMMVehicleAlert).toBeVisible();
|
||||
});
|
||||
test('NoServiceAlert is displayed on the screen', () => {
|
||||
mountOptions.props = {
|
||||
activeAlertType: vehicleLookupAlertTypes.NO_SERVICE
|
||||
};
|
||||
mountOptions.global.provide = {
|
||||
vehicleFromLookup: {}
|
||||
};
|
||||
|
||||
const { queryByRole } = render(VinLookupAlertsComponent, mountOptions);
|
||||
const noServiceAlert = queryByRole('alert', { name: 'no-service-alert' });
|
||||
|
||||
expect(noServiceAlert).toBeVisible();
|
||||
});
|
||||
});
|
||||
|
|
|
|||
|
|
@ -10,6 +10,8 @@
|
|||
v-else-if="isVehicleNotMatchedVisible" />
|
||||
<perfectMatchAlert
|
||||
v-else-if="isPerfectMatchVisible" />
|
||||
<noServiceAlert
|
||||
v-else-if="isNoServiceVisible" />
|
||||
</div>
|
||||
</template>
|
||||
<script>
|
||||
|
|
@ -19,6 +21,7 @@ import vehicleNotMatchedAlert from '@/layouts/vin-lookup/vin-lookup-alerts/vehic
|
|||
import twoIdenticalYMMVehicleAlert from
|
||||
'@/layouts/vin-lookup/vin-lookup-alerts/two-identical-ymm-vehicle-alert/two-identical-ymm-vehicle-alert.vue';
|
||||
import perfectMatchAlert from '@/layouts/vin-lookup/vin-lookup-alerts//perfect-match-alert/perfect-match-alert.vue';
|
||||
import noServiceAlert from './no-service-alert/no-service-alert.vue';
|
||||
|
||||
export default {
|
||||
name: 'vin-lookup-alerts',
|
||||
|
|
@ -26,7 +29,8 @@ export default {
|
|||
vehicleNotFoundAlert,
|
||||
vehicleNotMatchedAlert,
|
||||
twoIdenticalYMMVehicleAlert,
|
||||
perfectMatchAlert
|
||||
perfectMatchAlert,
|
||||
noServiceAlert
|
||||
},
|
||||
props: {
|
||||
activeAlertType: {
|
||||
|
|
@ -51,6 +55,9 @@ export default {
|
|||
isPerfectMatchVisible() {
|
||||
return this.activeAlertType === vehicleLookupAlertTypes.PERFECT_MATCH;
|
||||
},
|
||||
isNoServiceVisible() {
|
||||
return this.activeAlertType === vehicleLookupAlertTypes.NO_SERVICE;
|
||||
},
|
||||
wrapperCssClass() {
|
||||
return {
|
||||
'mb-5': this.activeAlertType !== null
|
||||
|
|
|
|||
|
|
@ -34,6 +34,7 @@ const lookupVehicleByVinCannotService = {
|
|||
mockResponse: {
|
||||
data: {
|
||||
carId: mockCarId,
|
||||
isBigTruck: true,
|
||||
canSafeliteService: false
|
||||
}
|
||||
}
|
||||
|
|
@ -494,7 +495,7 @@ describe('vin-lookup.vue', () => {
|
|||
);
|
||||
});
|
||||
});
|
||||
test('Bailout if entered vin cannot be serviced', async () => {
|
||||
test('Display no service alert if entered vin cannot be serviced', async () => {
|
||||
const user = userEvent.setup();
|
||||
mountOptions.global.stubs.vinQuestion = false;
|
||||
|
||||
|
|
@ -521,12 +522,7 @@ describe('vin-lookup.vue', () => {
|
|||
|
||||
await flushPromises();
|
||||
await waitFor(() => {
|
||||
expect(mockRouter.navigate).toHaveBeenCalledTimes(1);
|
||||
expect(mockRouter.navigate)
|
||||
.toHaveBeenCalledWith(
|
||||
navigationScenarios.CLICKED_FORWARD_WITH_BAILOUT,
|
||||
mockRoute
|
||||
);
|
||||
expect(container).toContainHTML('noService');
|
||||
});
|
||||
});
|
||||
|
||||
|
|
|
|||
|
|
@ -197,13 +197,13 @@ export default {
|
|||
}
|
||||
|
||||
if (!vehicleLookupResponse.data.canSafeliteService) {
|
||||
this.mainStore.setBailout(bailoutMessage.HeavyTruckVehicle(vehicleLookupResponse.data.carId));
|
||||
this.$router.navigate(this.navigationScenarios.CLICKED_FORWARD_WITH_BAILOUT, this.$route);
|
||||
this.activeVehicleLookupAlertType = vehicleLookupAlertTypes.NO_SERVICE;
|
||||
this.resetVehicleFromLookup();
|
||||
this.$refs.siteFooter.disableForwardButton();
|
||||
this.$refs.siteFooter.removeLoader();
|
||||
return;
|
||||
}
|
||||
|
||||
this.mainStore.resetBailout();
|
||||
|
||||
// Add vin bcs the response from the service doesn't contain vin
|
||||
this.vehicleFromLookup = Object.assign(
|
||||
vehicleLookupResponse.data,
|
||||
|
|
|
|||
|
|
@ -90,7 +90,8 @@ export const getDefaultState = () => ({
|
|||
firstName: null,
|
||||
lastName: null
|
||||
},
|
||||
isBigTruck: false
|
||||
isBigTruck: null,
|
||||
canSafeliteService: null
|
||||
},
|
||||
damage: {
|
||||
isRepair: null,
|
||||
|
|
@ -1342,19 +1343,17 @@ export const useMainStore = defineStore({
|
|||
});
|
||||
},
|
||||
|
||||
setVehicle() {
|
||||
async setVehicle() {
|
||||
const encodedMake = encodeURIComponent(this.order.vehicle.make);
|
||||
const encodedModel = encodeURIComponent(this.order.vehicle.model);
|
||||
return globalMethods
|
||||
const response = await globalMethods
|
||||
.callHttpClient({
|
||||
method: endpoints.GetVehicle.method,
|
||||
endpoint: `${endpoints.GetVehicle.url}/${this.order.vehicle.year}/${encodedMake}/${encodedModel}/${this.order.vehicle.style}`,
|
||||
payload: {}
|
||||
})
|
||||
.then((response) => {
|
||||
this.updateVehicle(response.data);
|
||||
return response;
|
||||
});
|
||||
this.updateVehicle(response.data);
|
||||
return response;
|
||||
},
|
||||
|
||||
setSaveSessionInfo(response) {
|
||||
|
|
@ -1986,13 +1985,8 @@ export const useMainStore = defineStore({
|
|||
this.order.vehicle.imageUrl = vehicle.imageUrl;
|
||||
this.order.vehicle.imageVifNumber = vehicle.imageVifNumber;
|
||||
this.order.vehicle.imageColor = vehicle.imageVifColor;
|
||||
this.order.vehicle.isBigTruck = vehicle.isBigTruck
|
||||
|
||||
if (vehicle.canSafeliteService !== undefined && !vehicle.canSafeliteService) {
|
||||
this.setBailout(bailoutMessage.HeavyTruckVehicle(vehicle.carId));
|
||||
} else if (this.isBailout && this.bailoutCode === bailoutCode.HeavyTruckVehicle) {
|
||||
this.resetBailout();
|
||||
}
|
||||
this.order.vehicle.isBigTruck = vehicle.isBigTruck;
|
||||
this.order.vehicle.canSafeliteService = vehicle.canSafeliteService;
|
||||
|
||||
this.updateSupportingItems(null);
|
||||
this.updateVaps(null);
|
||||
|
|
@ -2117,6 +2111,8 @@ export const useMainStore = defineStore({
|
|||
this.order.vehicle.registration.zipCode = null;
|
||||
this.order.vehicle.registration.firstName = null;
|
||||
this.order.vehicle.registration.lastName = null;
|
||||
this.order.vehicle.isBigTruck = null;
|
||||
this.order.vehicle.canSafeliteService = null;
|
||||
|
||||
if (this.isBailout && this.bailoutCode === bailoutCode.HeavyTruckVehicle) {
|
||||
this.resetBailout();
|
||||
|
|
|
|||
|
|
@ -238,20 +238,6 @@ describe('Store', () => {
|
|||
expect(store.order.insuranceCoverage.coverageType).toBe(expected);
|
||||
});
|
||||
});
|
||||
it('setVehicle is bailout if the vehicle cannot be serviced by Safelite', () => {
|
||||
// Arrange
|
||||
const vehicle = {
|
||||
carId: getRandomString(6, 6),
|
||||
canSafeliteService: false
|
||||
};
|
||||
|
||||
// Act
|
||||
store.updateVehicle(vehicle);
|
||||
|
||||
// Assert
|
||||
expect(store.isBailout).toBe(true);
|
||||
expect(store.bailoutCode).toBe(bailoutCode.HeavyTruckVehicle);
|
||||
});
|
||||
|
||||
// TODO update test to work also checking store values
|
||||
it('setVehicle should call globalMethods.callHttpClient', () => {
|
||||
|
|
|
|||
Loading…
Reference in a new issue