diff --git a/src/constants/store-actions.js b/src/constants/store-actions.js index 9d7d3ea6a..00a2dffea 100644 --- a/src/constants/store-actions.js +++ b/src/constants/store-actions.js @@ -62,6 +62,7 @@ const storeActions = { SAVE_VEHICLE_MAKE: "saveVehicleMake", SAVE_VEHICLE_MODEL: "saveVehicleModel", SAVE_VEHICLE_STYLE: "saveVehicleStyle", + SAVE_VEHICLE: "saveVehicle", SAVE_VEHICLE_DAMAGE: "saveVehicleDamage", SAVE_VIN_LOOKUP: "saveVinLookup", SAVE_SERVICE_ZIP_CODE_INFO: "saveServiceZipCodeInfo", diff --git a/src/digital-components/dropdown-vehicle/dropdown-vehicle.spec.js b/src/digital-components/dropdown-vehicle/dropdown-vehicle.spec.js new file mode 100644 index 000000000..17045e490 --- /dev/null +++ b/src/digital-components/dropdown-vehicle/dropdown-vehicle.spec.js @@ -0,0 +1,117 @@ +import { shallowMount } from "@vue/test-utils"; +import dropdownVehicle from "./dropdown-vehicle"; + +// Mock CMS content +const questionText = "Question Text"; +const mockMixin = { + methods: { + getCmsContent: jest.fn().mockImplementation(() => { + return questionText; + }), + }, +}; + +// TODO: Remove the following from dropdown-question.vue -> :class="(errors && errors.length) || hasError ? 'has-error' : ''" +// It is not being used. +describe("dropdownVehicle.vue", () => { + it("Should render a select input", async () => { + // Arrange + const wrapper = shallowMount(dropdownVehicle, { + propsData: { + options: {}, + }, + mixins: [mockMixin], + }); + + // Act + const select = wrapper.find("select"); + + // Assert + expect(select.exists()).toBe(true); + }); + + it("Should render the 'questionText' data value as the label text.", async () => { + // Arrange + const wrapper = shallowMount(dropdownVehicle, { + propsData: { + options: {}, + }, + mixins: [mockMixin], + }); + + // Act + const label = wrapper.find("label"); + + // Assert + expect(label.text()).toContain(questionText); + }); + + it("Should render the 'questionText' data value as the aria-label attribute.", async () => { + // Arrange + const wrapper = shallowMount(dropdownVehicle, { + propsData: { + options: {}, + }, + mixins: [mockMixin], + }); + + // Act + const label = wrapper.find("label"); + + // Assert + expect(label.attributes("aria-label")).toContain(questionText); + }); + + it("Should return aria-disabled state as disabled", async () => { + // Arrange + const wrapper = shallowMount(dropdownVehicle, { + propsData: { + options: {}, + isDisabled: true, + }, + mixins: [mockMixin], + }); + + // Act + const select = wrapper.find("select"); + + // Assert + expect(select.attributes("aria-disabled")).toEqual("true"); + }); + + it("Should emit new value when modelValue is changed", async () => { + // Arrange + const wrapper = shallowMount(dropdownVehicle, { + propsData: { + options: {}, + modelValue: "val", + }, + mixins: [mockMixin], + }); + + // Act + await wrapper.find("select").setValue("val2"); + + // Assert + expect(wrapper.emitted()).toHaveProperty("change"); + }); + + it("Should call this.handleChange with new value when selectedOption is changed", async () => { + // Arrange + const wrapper = shallowMount(dropdownVehicle, { + propsData: { + options: {}, + modelValue: "0", + }, + mixins: [mockMixin], + }); + + wrapper.vm.handleChange = jest.fn().mockImplementation(() => {}); + + // Act + wrapper.vm.$options.watch.selectedOption.call(wrapper.vm, 1); + + // Assert + expect(wrapper.vm.handleChange).toHaveBeenCalled; + }); +}); diff --git a/src/digital-components/dropdown-vehicle/dropdown-vehicle.vue b/src/digital-components/dropdown-vehicle/dropdown-vehicle.vue new file mode 100644 index 000000000..1d4d6f0b4 --- /dev/null +++ b/src/digital-components/dropdown-vehicle/dropdown-vehicle.vue @@ -0,0 +1,147 @@ + + + + + diff --git a/src/layouts/vehicle/vehicle-question/vehicle-question.vue b/src/layouts/vehicle/vehicle-question/vehicle-question.vue index 9f5fc52a9..f2863564d 100644 --- a/src/layouts/vehicle/vehicle-question/vehicle-question.vue +++ b/src/layouts/vehicle/vehicle-question/vehicle-question.vue @@ -1,67 +1,29 @@