204 lines
7 KiB
JavaScript
204 lines
7 KiB
JavaScript
import { mount } from '@vue/test-utils';
|
|
import { navigationScenarios } from '@/router/router-constants/navigation-scenarios';
|
|
import { issPageValues } from '@/router/router-constants/issPage-values';
|
|
import { queryStrings } from '@/constants/query-strings';
|
|
import { GaActions } from "@/constants/analytics";
|
|
import ProviderPreference from "@/layouts/provider-preference/provider-preference.vue"
|
|
import { useMainStore } from '@/store';
|
|
import { createTestingPinia } from '@pinia/testing';
|
|
import { mapStores } from "pinia";
|
|
|
|
const pinia = createTestingPinia();
|
|
useMainStore(pinia);
|
|
|
|
const ProviderPreferenceMockData = {
|
|
QuestionText: 'Which auto glass shop would you like to work with?',
|
|
Answers: [
|
|
{
|
|
Name: 'Schedule with Safelite',
|
|
Text: 'Schedule with Safelite',
|
|
SubText: '',
|
|
ImageId: '',
|
|
SubWidgetName: '',
|
|
},
|
|
{
|
|
Name: 'Find another shop',
|
|
Text: 'Find another shop',
|
|
SubText: '',
|
|
ImageId: '',
|
|
SubWidgetName: '',
|
|
},
|
|
],
|
|
};
|
|
|
|
const siteFooterWidgetMockData = {
|
|
ForwardButtonText: 'Continue',
|
|
};
|
|
|
|
function setupMocks() {
|
|
const mockRoute = {
|
|
query: {
|
|
issPage: 'provider-preference',
|
|
},
|
|
};
|
|
|
|
const mockRouter = {
|
|
navigate: jest.fn(),
|
|
};
|
|
|
|
const wrapper = mount(ProviderPreference, {
|
|
data() {
|
|
return {
|
|
SelectedshopLocation: null,
|
|
};
|
|
},
|
|
global: {
|
|
mixins: [
|
|
{
|
|
computed: {
|
|
...mapStores(useMainStore),
|
|
GaActions() {
|
|
return GaActions;
|
|
},
|
|
queryStrings() {
|
|
return queryStrings;
|
|
},
|
|
navigationScenarios() {
|
|
return navigationScenarios;
|
|
},
|
|
},
|
|
methods: {
|
|
getCmsContent: jest.fn((cmsWidgetName, fieldName) => {
|
|
if (cmsWidgetName === 'SiteFooterWidget') {
|
|
if (fieldName === 'ForwardButtonText') {
|
|
return siteFooterWidgetMockData.ForwardButtonText;
|
|
}
|
|
}
|
|
|
|
if (cmsWidgetName === 'StateSteeringModal') {
|
|
if (fieldName === 'BodyText') {
|
|
return "{if:custom:OH}ohioText{end}{if:custom:CA}cali's Text{end}";
|
|
}
|
|
}
|
|
|
|
if (cmsWidgetName === 'ProviderPreference') {
|
|
if (fieldName === 'QuestionText') {
|
|
return ProviderPreferenceMockData.QuestionText;
|
|
}
|
|
if (fieldName === 'Answers') {
|
|
return ProviderPreferenceMockData.Answers;
|
|
}
|
|
}
|
|
|
|
return '';
|
|
}),
|
|
getFooterInfoBoxHeight: jest.fn(() => 80),
|
|
getPageNameByQueryString: jest.fn(() => "provider-preference"),
|
|
pushEventToGA: jest.fn(),
|
|
},
|
|
},
|
|
],
|
|
mocks: {
|
|
$route: mockRoute,
|
|
$router: mockRouter,
|
|
},
|
|
stubs: {
|
|
SiteHeader: true,
|
|
SiteSubHeader: true,
|
|
},
|
|
},
|
|
});
|
|
|
|
return { mockRoute, mockRouter, wrapper };
|
|
}
|
|
describe('provider-preference.vue', () => {
|
|
|
|
test("getStateSpecificText returns true when values match", () => {
|
|
const { wrapper } = setupMocks();
|
|
|
|
useMainStore().order.customer.address.state = "ohio";
|
|
const actual = wrapper.vm.getStateSpecificText("Ohio")
|
|
|
|
expect(actual).toBeTruthy();
|
|
});
|
|
|
|
test("getStateSpecificText returns false when values do not match", () => {
|
|
const { wrapper } = setupMocks();
|
|
|
|
useMainStore().order.customer.address.state = "delaware";
|
|
const actual = wrapper.vm.getStateSpecificText("Ohio")
|
|
|
|
expect(actual).toBeFalsy();
|
|
});
|
|
|
|
test("getStateSpecificText should return correct value for state", () => {
|
|
const { wrapper } = setupMocks();
|
|
useMainStore().order.customer.address.state = "ca";
|
|
|
|
let actual = wrapper.vm.steeringModalBody;
|
|
|
|
expect(actual).toBe("cali's Text");
|
|
|
|
useMainStore().order.customer.address.state = "oH";
|
|
|
|
actual = wrapper.vm.steeringModalBody;
|
|
|
|
expect(actual).toBe("ohioText");
|
|
});
|
|
|
|
test.skip('"Continue" button is disabled when no Shop Location is selected.', () => {
|
|
const { wrapper } = setupMocks();
|
|
|
|
const continueButton = wrapper.get('[data-test-id="site-footer-main-button"]');
|
|
expect(continueButton.attributes()['aria-disabled']).toBe('true');
|
|
});
|
|
|
|
test.skip('"Continue" button is enabled after a Shop Location is selected.', async () => {
|
|
const { wrapper } = setupMocks();
|
|
|
|
const ProviderPreferenceWrapper = wrapper.findComponent({ name: 'provider-preference' });
|
|
// Not using initializeComponent() because it doesn't trigger reactivity in test.
|
|
await ProviderPreferenceWrapper.setData({
|
|
questionTextFromCms: ProviderPreferenceMockData.QuestionText,
|
|
answersFromCms: ProviderPreferenceMockData.Answers,
|
|
SelectedshopLocation:"Schedule with Safelite"
|
|
});
|
|
|
|
|
|
const continueButton = wrapper.get('[data-test-id="site-footer-main-button"]');
|
|
expect(continueButton.attributes()['aria-disabled']).toBe('false');
|
|
});
|
|
|
|
|
|
test.skip('Select "Schedule with Safelite" then click "Continue". Navigates to "service-location" page.', async () => {
|
|
const { mockRoute, mockRouter, wrapper } = setupMocks();
|
|
|
|
const ProviderPreferenceWrapper = wrapper.findComponent({ name: 'provider-preference' });
|
|
// Not using initializeComponent() because it doesn't trigger reactivity in test.
|
|
await ProviderPreferenceWrapper.setData({
|
|
questionTextFromCms: ProviderPreferenceMockData.QuestionText,
|
|
answersFromCms: ProviderPreferenceMockData.Answers,
|
|
SelectedshopLocation:"Schedule with Safelite"
|
|
});
|
|
|
|
const continueButton = wrapper.get('[data-test-id="site-footer-main-button"]');
|
|
await continueButton.trigger('click');
|
|
|
|
expect(mockRouter.navigate).toHaveBeenCalledTimes(1);
|
|
expect(mockRouter.navigate)
|
|
.toHaveBeenCalledWith(navigationScenarios.CLICKED_FORWARD_WITH_SAFELITE, mockRoute);
|
|
/**
|
|
* To Do: find a way to confirm that Vue Router really routes to the expected page.
|
|
* Currently just trust that our custom navigate() method does its job properly.
|
|
*/
|
|
});
|
|
|
|
test.skip('Click the back button, trigger navigate function from Vue Router with CLICKED_BACK parameter.', async () => {
|
|
const { mockRoute, mockRouter, wrapper } = setupMocks();
|
|
|
|
await wrapper.get('[data-test-id="site-footer-back-button"]').trigger('click');
|
|
expect(mockRouter.navigate).toHaveBeenCalledTimes(1);
|
|
expect(mockRouter.navigate)
|
|
.toHaveBeenCalledWith(navigationScenarios.CLICKED_BACK, mockRoute);
|
|
});
|
|
});
|