diff --git a/src/common-components/dropdown-question/dropdown-question.spec.js b/src/common-components/dropdown-question/dropdown-question.spec.js
new file mode 100644
index 00000000..381f3489
--- /dev/null
+++ b/src/common-components/dropdown-question/dropdown-question.spec.js
@@ -0,0 +1,170 @@
+import { shallowMount } from "@vue/test-utils";
+import dropdownQuestion from "./dropdown-question";
+
+// 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("dropdownQuestion.vue", () => {
+
+ it("Should render a select input", async () => {
+
+ // Arrange
+ const wrapper = shallowMount(dropdownQuestion, {
+ propsData: {
+ options: {},
+ },
+ mixins: [mockMixin]
+ });
+
+ wrapper.getCmsContent = jest.fn();
+
+ // 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(dropdownQuestion, {
+ propsData: {
+ options: {},
+ },
+ mixins: [mockMixin]
+ });
+
+ // Act
+ const label = wrapper.find("label");
+
+ // Assert
+ expect(label.text()).toContain(questionText);
+
+ });
+
+ it("Should render the 'questionText' data value with '⁠' after the first character of each word in the label text when disableAutoFill is true.", async () => {
+ // Arrange
+ const wrapper = shallowMount(dropdownQuestion, {
+ propsData: {
+ options: {},
+ disableAutoFill: true,
+ },
+ mixins: [mockMixin]
+ });
+
+ // Mock CMS content ...
+ // Trust me, the below instance of the string "Question Text" actually has the ⁠ in it. You just can't see it
+ // Don't believe me? Copy and paste it into Google. Then inspect the search field element in Dev Tools,
+ // you will see "Q⁠uestion T⁠ext"
+ const expectedQuestionText = "Question Text";
+
+ // Act
+ const label = wrapper.find("label");
+
+ // Assert
+ expect(label.text()).toContain(expectedQuestionText);
+
+ });
+
+ it("Should return input id as the id of the select field", async () => {
+ // Arrange
+ const wrapper = shallowMount(dropdownQuestion, {
+ propsData: {
+ inputId: "input ID",
+ options: {},
+ },
+ mixins: [mockMixin]
+ });
+
+ // Act
+ const select = wrapper.find("select");
+
+ // Assert
+ expect(select.attributes().id).toEqual("input ID");
+
+ });
+
+ it("Should render the 'questionText' data value as the aria-label attribute.", async () => {
+ // Arrange
+ const wrapper = shallowMount(dropdownQuestion, {
+ 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(dropdownQuestion, {
+ 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(dropdownQuestion, {
+ 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(dropdownQuestion, {
+ 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/common-components/dropdown-question/dropdown-question.vue b/src/common-components/dropdown-question/dropdown-question.vue
new file mode 100644
index 00000000..8e6ae0fa
--- /dev/null
+++ b/src/common-components/dropdown-question/dropdown-question.vue
@@ -0,0 +1,152 @@
+
+
Welcome Page Placeholder