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 @@
+
+
+
+
+
+ {{ errorMessage }}
+
+
+
+
+
+
+
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 @@
-
+