Merge pull request #1054 from Safelite/feature/INSR-8130

INSR-8130: Fixid issue of not being able to launch any duplicate referrals.
This commit is contained in:
Jeremy-Z 2026-02-06 15:58:13 -05:00 committed by GitHub
commit de44f50d3a
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 385 additions and 35 deletions

View file

@ -1586,7 +1586,7 @@ export const useMainStore = defineStore({
endpoint: endpoints.LoadSession.url,
payload: {
referralNumber: duplicate.referralNumber,
referralDate: duplicate.responseDate,
referralDate: duplicate.referralDate,
parentAccountNumber: order.parentAccountNumber,
referralCorrelationId: duplicate.correlationId
}
@ -1596,22 +1596,35 @@ export const useMainStore = defineStore({
return;
}
if (this.isPolicyLookupSuccessful) {
order.customer.address.streetAddress = data.customer?.address?.streetAddress;
order.customer.address.streetAddress2 = data.customer?.address?.streetAddress2;
order.customer.address.city = data.customer?.address?.city;
order.customer.address.state = data.customer?.address?.state;
order.customer.address.zipCode = data.customer?.address?.zipCode;
if (data?.customer) {
order.customer.firstName = data?.customer?.firstName;
order.customer.lastName = data?.customer?.lastName;
order.customer.emailAddress = data?.customer?.emailAddress;
order.contactInfo.extension = data?.customer?.homePhone?.slice(10);
order.contactInfo.homePhone = data?.customer?.homePhone?.slice(0, 10);
order.contactInfo.servicePhone = data?.customer?.servicePhone;
order.contactInfo.alternativePhone = data?.customer?.alternativePhone;
order.contactInfo.requestTextUpdates = data?.customer?.isSmsOptIn;
if (data?.customer?.address) {
order.customer.address.streetAddress = data.customer?.address?.streetAddress;
order.customer.address.streetAddress2 = data.customer?.address?.streetAddress2;
order.customer.address.city = data.customer?.address?.city;
order.customer.address.state = data.customer?.address?.state;
order.customer.address.zipCode = data.customer?.address?.zipCode;
}
}
if (data?.vehicle) {
order.vehicle.year = data?.vehicle?.year;
order.vehicle.make = data?.vehicle?.make;
order.vehicle.model = data?.vehicle?.model;
order.vehicle.style = data?.vehicle?.style;
}
if (this.isPolicyLookupSuccessful) {
if (data.insuranceCoverage) {
order.insuranceCoverage.coverageType = data?.insuranceCoverage?.coverageType;
order.insuranceCoverage.coverageStatus = data?.insuranceCoverage?.coverageStatus;
@ -1644,11 +1657,6 @@ export const useMainStore = defineStore({
}
}
}
order.vehicle.year = data.vehicle.year;
order.vehicle.make = data.vehicle.make;
order.vehicle.model = data.vehicle.model;
order.vehicle.style = data.vehicle.style;
}
}

View file

@ -14,6 +14,7 @@ import endpoints from '@/constants/endpoints';
import { AppointmentTypeStrings } from '@/constants/schedule-constants';
import coverageType from '@/constants/coverage-type';
import { getEnumName } from '@/helpers/unit-test-helper';
import { strictEqual } from 'assert';
describe('Store', () => {
let store;
@ -1071,28 +1072,29 @@ describe('Store', () => {
experiments: getRandomString(6, 6)
};
const vehicle = {
year: getRandomString(6, 6),
make: getRandomString(6, 6),
model: getRandomString(6, 6),
style: getRandomString(6, 6),
vin: getRandomString(6, 6),
carId: getRandomString(6, 6),
licensePlateNumber: getRandomString(6, 6)
year: getRandomInt(2000, 2024).toString(),
make: getRandomString(5, 15),
model: getRandomString(5, 15),
style: getRandomString(5, 15),
carId: getRandomInt(1000, 9999),
vin: getRandomString(17, 17),
licensePlateNumber: getRandomString(7, 7)
};
const customer = {
firstName: getRandomString(6, 6),
lastName: getRandomString(6, 6),
emailAddress: getRandomString(6, 6),
phoneNumber: getRandomString(6, 6),
isSmsOptIn: getRandomString(6, 6),
const customer= {
address: {
streetAddress: getRandomString(6, 6),
streetAddress2: getRandomString(6, 6),
city: getRandomString(6, 6),
state: getRandomString(6, 6),
zipCode: getRandomString(6, 6),
zipCodeCtu: getRandomString(6, 6)
}
streetAddress: getRandomString(10, 50),
streetAddress2: getRandomString(5, 20),
city: getRandomString(5, 20),
state: getRandomString(2, 2),
zipCode: getRandomString(5, 5)
},
firstName: getRandomString(5, 15),
lastName: getRandomString(5, 15),
emailAddress: `${getRandomString(5, 10)}@test.com`,
homePhone: getRandomString(10, 10),
servicePhone: getRandomString(10, 10),
alternativePhone: getRandomString(10, 10),
isSmsOptIn: getRandomBoolean()
};
const fullApiResponse = {
data: {
@ -1140,7 +1142,7 @@ describe('Store', () => {
};
store.order.insuranceCoverage.coverageType = coverageType.Deductible;
store.policy.vehicles = [{ vin: vehicle.vin }];
store.policy.vehicles = [{ vehicle }];
// Act
await store.loadSession(duplicate);
@ -1150,7 +1152,7 @@ describe('Store', () => {
expect(store.vehicle.make).toBe(vehicle.make);
expect(store.vehicle.model).toBe(vehicle.model);
expect(store.vehicle.style).toBe(vehicle.style);
expect(store.vehicle.vin).toBe(vehicle.vin);
// vin is not set directly by loadSession, it's set by updateVehicle after lookupVehicleByVin
expect(store.vehicle.registration.licensePlate).toBe(vehicle.licensePlateNumber);
});
it('sets expected customer data', async () => {
@ -2135,4 +2137,344 @@ describe('Store', () => {
expect(result).toBe(expected);
});
});
describe('loadSession method', () => {
let mockDuplicate;
let mockResponse;
beforeEach(() => {
mockDuplicate = {
referralNumber: getRandomString(10, 10),
referralDate: new Date().toISOString(),
correlationId: getRandomGuid()
};
mockResponse = {
data: {
customer: {
address: {
streetAddress: getRandomString(10, 50),
streetAddress2: getRandomString(5, 20),
city: getRandomString(5, 20),
state: getRandomString(2, 2),
zipCode: getRandomString(5, 5)
},
firstName: getRandomString(5, 15),
lastName: getRandomString(5, 15),
emailAddress: `${getRandomString(5, 10)}@test.com`,
homePhone: getRandomString(10, 10),
servicePhone: getRandomString(10, 10),
alternativePhone: getRandomString(10, 10),
isSmsOptIn: getRandomBoolean()
},
vehicle: {
year: getRandomInt(2000, 2024).toString(),
make: getRandomString(5, 15),
model: getRandomString(5, 15),
style: getRandomString(5, 15),
carId: getRandomInt(1000, 9999),
vin: getRandomString(17, 17),
licensePlateNumber: getRandomString(7, 7)
},
insuranceCoverage: {
coverageType: getRandomEnum(coverageType),
coverageStatus: getRandomEnum(coverageStatuses),
claimNumber: getRandomString(10, 10)
},
referralNumber: getRandomString(10, 10),
referralDate: new Date().toISOString(),
referralCorrelationId: getRandomGuid(),
referralSequenceNumber: getRandomInt(1, 100),
eon: getRandomString(10, 10)
}
};
store.order.parentAccountNumber = getRandomString(6, 6);
store.order.insuranceCoverage.coverageType = coverageType.Deductible;
});
it('should call callHttpClient with correct parameters', async () => {
// Arrange
globalMethods.callHttpClient = jest.fn().mockReturnValue(Promise.resolve(mockResponse));
// Act
await store.loadSession(mockDuplicate);
// Assert
expect(globalMethods.callHttpClient).toHaveBeenCalledWith({
method: endpoints.LoadSession.method,
endpoint: endpoints.LoadSession.url,
payload: {
referralNumber: mockDuplicate.referralNumber,
referralDate: mockDuplicate.referralDate,
parentAccountNumber: store.order.parentAccountNumber,
referralCorrelationId: mockDuplicate.correlationId
}
});
});
it('should return early when response data is null/undefined', async () => {
// Arrange
globalMethods.callHttpClient = jest.fn().mockReturnValue(Promise.resolve({ data: null }));
const originalStreetAddress = store.order.customer.address.streetAddress;
const originalLoadedFromDupeCheck = store.order.loadedFromDupeCheck;
// Act
await store.loadSession(mockDuplicate);
// Assert
expect(store.order.customer.address.streetAddress).toBe(originalStreetAddress);
expect(store.order.loadedFromDupeCheck).toBe(originalLoadedFromDupeCheck);
});
it('should update customer address fields from response data', async () => {
// Arrange
globalMethods.callHttpClient = jest.fn().mockReturnValue(Promise.resolve(mockResponse));
// Act
await store.loadSession(mockDuplicate);
// Assert
expect(store.order.customer.address.streetAddress).toBe(mockResponse.data.customer.address.streetAddress);
expect(store.order.customer.address.streetAddress2).toBe(mockResponse.data.customer.address.streetAddress2);
expect(store.order.customer.address.city).toBe(mockResponse.data.customer.address.city);
expect(store.order.customer.address.state).toBe(mockResponse.data.customer.address.state);
expect(store.order.customer.address.zipCode).toBe(mockResponse.data.customer.address.zipCode);
});
it('should update contact information from response data', async () => {
// Arrange
globalMethods.callHttpClient = jest.fn().mockReturnValue(Promise.resolve(mockResponse));
// Act
await store.loadSession(mockDuplicate);
// Assert
expect(store.order.customer.firstName).toBe(mockResponse.data.customer.firstName);
expect(store.order.customer.lastName).toBe(mockResponse.data.customer.lastName);
expect(store.order.customer.emailAddress).toBe(mockResponse.data.customer.emailAddress);
expect(store.order.contactInfo.servicePhone).toBe(mockResponse.data.customer.servicePhone);
expect(store.order.contactInfo.alternativePhone).toBe(mockResponse.data.customer.alternativePhone);
expect(store.order.contactInfo.requestTextUpdates).toBe(mockResponse.data.customer.isSmsOptIn);
});
it('should extract extension from homePhone correctly', async () => {
// Arrange
mockResponse.data.customer.homePhone = '12345678901234';
globalMethods.callHttpClient = jest.fn().mockReturnValue(Promise.resolve(mockResponse));
// Act
await store.loadSession(mockDuplicate);
// Assert
expect(store.order.contactInfo.homePhone).toBe('1234567890');
expect(store.order.contactInfo.extension).toBe('1234');
});
it('should update vehicle information from response data', async () => {
// Arrange
globalMethods.callHttpClient = jest.fn().mockReturnValue(Promise.resolve(mockResponse));
// Act
await store.loadSession(mockDuplicate);
// Assert
expect(store.order.vehicle.year).toBe(mockResponse.data.vehicle.year);
expect(store.order.vehicle.make).toBe(mockResponse.data.vehicle.make);
expect(store.order.vehicle.model).toBe(mockResponse.data.vehicle.model);
expect(store.order.vehicle.style).toBe(mockResponse.data.vehicle.style);
});
it('should update insurance coverage when isPolicyLookupSuccessful is true and insuranceCoverage exists in response', async () => {
// Arrange
store.order.insuranceCoverage.coverageType = coverageType.Deductible; // Make isPolicyLookupSuccessful true
globalMethods.callHttpClient = jest.fn().mockReturnValue(Promise.resolve(mockResponse));
// Act
await store.loadSession(mockDuplicate);
// Assert
expect(store.order.insuranceCoverage.coverageType).toBe(mockResponse.data.insuranceCoverage.coverageType);
expect(store.order.insuranceCoverage.coverageStatus).toBe(mockResponse.data.insuranceCoverage.coverageStatus);
expect(store.order.insuranceCoverage.claimNumber).toBe(mockResponse.data.insuranceCoverage.claimNumber);
});
it('should update insurance coverage from payment.insuranceCoverage when main insuranceCoverage does not exist', async () => {
// Arrange
store.order.insuranceCoverage.coverageType = coverageType.Deductible;
mockResponse.data.insuranceCoverage = null;
mockResponse.data.payment = {
insuranceCoverage: {
isVerified: true,
claimNumber: getRandomString(10, 10)
}
};
globalMethods.callHttpClient = jest.fn().mockReturnValue(Promise.resolve(mockResponse));
// Act
await store.loadSession(mockDuplicate);
// Assert
expect(store.order.insuranceCoverage.coverageStatus).toBe(coverageStatuses.VERIFIED);
expect(store.order.insuranceCoverage.claimNumber).toBe(mockResponse.data.payment.insuranceCoverage.claimNumber);
});
it('should update vehicle registration license plate when policy vehicles exist and carId is present', async () => {
// Arrange
store.order.insuranceCoverage.coverageType = coverageType.Deductible;
store.order.policy.vehicles = [
{ id: 1, vin: mockResponse.data.vehicle.vin }
];
globalMethods.callHttpClient = jest.fn().mockReturnValue(Promise.resolve(mockResponse));
// Act
await store.loadSession(mockDuplicate);
// Assert
expect(store.order.vehicle.registration.licensePlate).toBe(mockResponse.data.vehicle.licensePlateNumber);
});
it('should call lookupVehicleByVin and update vehicle when vin matches policy vehicle', async () => {
// Arrange
const mockVehicleLookupResponse = {
data: {
carId: getRandomInt(1000, 9999),
year: getRandomInt(2000, 2024).toString()
}
};
const policyVehicle = {
id: getRandomInt(1, 100),
vin: mockResponse.data.vehicle.vin,
deductible: 100,
repairWaived: false,
endorsements: ['OEM Approved']
};
store.order.insuranceCoverage.coverageType = coverageType.Deductible;
store.order.policy.vehicles = [policyVehicle];
globalMethods.callHttpClient = jest.fn().mockReturnValue(Promise.resolve(mockResponse));
store.lookupVehicleByVin = jest.fn().mockReturnValue(Promise.resolve(mockVehicleLookupResponse));
store.updateVehicle = jest.fn();
store.updateVehicleCoverage = jest.fn();
// Act
await store.loadSession(mockDuplicate);
// Assert
expect(store.lookupVehicleByVin).toHaveBeenCalledWith(mockResponse.data.vehicle.vin);
expect(store.updateVehicle).toHaveBeenCalledWith({
...mockVehicleLookupResponse.data,
policyVehicleId: policyVehicle.id,
vin: policyVehicle.vin
});
expect(store.updateVehicleCoverage).toHaveBeenCalled();
});
it('should not call lookupVehicleByVin when policy vehicles array is empty', async () => {
// Arrange
store.order.insuranceCoverage.coverageType = coverageType.Deductible;
store.order.policy.vehicles = [];
globalMethods.callHttpClient = jest.fn().mockReturnValue(Promise.resolve(mockResponse));
store.lookupVehicleByVin = jest.fn();
// Act
await store.loadSession(mockDuplicate);
// Assert
expect(store.lookupVehicleByVin).not.toHaveBeenCalled();
});
it('should not call lookupVehicleByVin when carId is not present', async () => {
// Arrange
store.order.insuranceCoverage.coverageType = coverageType.Deductible;
store.order.policy.vehicles = [{ id: 1, vin: 'TEST123456789' }];
mockResponse.data.vehicle.carId = null;
globalMethods.callHttpClient = jest.fn().mockReturnValue(Promise.resolve(mockResponse));
store.lookupVehicleByVin = jest.fn();
// Act
await store.loadSession(mockDuplicate);
// Assert
expect(store.lookupVehicleByVin).not.toHaveBeenCalled();
});
it('should not call lookupVehicleByVin when vin is not present', async () => {
// Arrange
store.order.insuranceCoverage.coverageType = coverageType.Deductible;
store.order.policy.vehicles = [{ id: 1, vin: 'TEST123456789' }];
mockResponse.data.vehicle.vin = null;
globalMethods.callHttpClient = jest.fn().mockReturnValue(Promise.resolve(mockResponse));
store.lookupVehicleByVin = jest.fn();
// Act
await store.loadSession(mockDuplicate);
// Assert
expect(store.lookupVehicleByVin).not.toHaveBeenCalled();
});
it('should not update insurance coverage when isPolicyLookupSuccessful is false', async () => {
// Arrange
store.order.insuranceCoverage.coverageType = coverageType.NONE; // Make isPolicyLookupSuccessful false
const originalCoverageStatus = store.order.insuranceCoverage.coverageStatus;
globalMethods.callHttpClient = jest.fn().mockReturnValue(Promise.resolve(mockResponse));
// Act
await store.loadSession(mockDuplicate);
// Assert
expect(store.order.insuranceCoverage.coverageStatus).toBe(originalCoverageStatus);
});
it('should update referral information from response data', async () => {
// Arrange
globalMethods.callHttpClient = jest.fn().mockReturnValue(Promise.resolve(mockResponse));
// Act
await store.loadSession(mockDuplicate);
// Assert
expect(store.order.referralNumber).toBe(mockResponse.data.referralNumber);
expect(store.order.referralDate).toBe(mockResponse.data.referralDate);
expect(store.order.referralCorrelationId).toBe(mockResponse.data.referralCorrelationId);
expect(store.order.referralSequenceNumber).toBe(mockResponse.data.referralSequenceNumber);
expect(store.order.eon).toBe(mockResponse.data.eon);
});
it('should set loadedFromDupeCheck and loadedSessionClearedPreviousData flags', async () => {
// Arrange
globalMethods.callHttpClient = jest.fn().mockReturnValue(Promise.resolve(mockResponse));
// Act
await store.loadSession(mockDuplicate);
// Assert
expect(store.order.loadedFromDupeCheck).toBe(true);
expect(store.order.loadedSessionClearedPreviousData).toBe(false);
});
it('should handle API error gracefully', async () => {
// Arrange
const error = new Error('API Error');
globalMethods.callHttpClient = jest.fn().mockReturnValue(Promise.reject(error));
// Act & Assert
await expect(store.loadSession(mockDuplicate)).rejects.toThrow('API Error');
});
it('should handle missing optional fields in response data', async () => {
// Arrange
mockResponse.data.customer.address.streetAddress2 = undefined;
mockResponse.data.customer.alternativePhone = undefined;
globalMethods.callHttpClient = jest.fn().mockReturnValue(Promise.resolve(mockResponse));
// Act
await store.loadSession(mockDuplicate);
// Assert
expect(store.order.customer.address.streetAddress2).toBeUndefined();
expect(store.order.contactInfo.alternativePhone).toBeUndefined();
});
});
});