diff --git a/src/common-components/textbox-question/textbox-question.spec.js b/src/common-components/textbox-question/textbox-question.spec.js index 1f15246f7..dc0124211 100644 --- a/src/common-components/textbox-question/textbox-question.spec.js +++ b/src/common-components/textbox-question/textbox-question.spec.js @@ -198,139 +198,6 @@ describe("textboxQuestion.vue", () => { expect(wrapper.vm.handleChange).toHaveBeenCalled; }); - it("Should call this.handleChange when image is submitted with valid value.", async () => { - // Arrange - const inputId = "test"; - const responseValue = "testResponse"; - - const storeMixin = { - methods: { - dispatchStoreAction: jest.fn().mockImplementation(() => { - return new Promise((resolve, reject) => - resolve({ - data: [responseValue], - }) - ); - }), - }, - }; - - const wrapper = shallowMount(textboxQuestion, { - global: { - directives: { - maska: maska, - }, - }, - propsData: { - modelValue: "", - includeCameraIcon: true, - inputId: inputId, - }, - mixins: [mockMixin, storeMixin], - attachTo: document.body, - }); - - wrapper.vm.handleChange = jest.fn().mockImplementation(() => {}); - - // Act - const imageUploadField = wrapper.find('[data-test="image-upload"]'); - - await imageUploadField.trigger("change"); - - await wrapper.vm.$nextTick(); - - // Assert - - expect(wrapper.vm.handleChange).toHaveBeenCalled(); - expect(wrapper.emitted()).toHaveProperty("update:modelValue"); - }); - - it("Should emit image-lookup-error when image is submitted with invalid value", async () => { - // Arrange - const inputId = "test"; - - const storeMixin = { - methods: { - dispatchStoreAction: jest.fn().mockImplementation(() => { - return new Promise((resolve, reject) => - resolve({ - data: [], - }) - ); - }), - }, - }; - - const wrapper = shallowMount(textboxQuestion, { - global: { - directives: { - maska: maska, - }, - }, - propsData: { - modelValue: "", - includeCameraIcon: true, - inputId: inputId, - }, - mixins: [mockMixin, storeMixin], - attachTo: document.body, - }); - - wrapper.vm.handleChange = jest.fn().mockImplementation(() => {}); - - // Act - const imageUploadField = wrapper.find('[data-test="image-upload"]'); - - await imageUploadField.trigger("change"); - - await wrapper.vm.$nextTick(); - - // Assert - expect(wrapper.vm.handleChange).not.toHaveBeenCalled(); - expect(wrapper.emitted()).toHaveProperty("imageLookupError"); - }); - - it("Should emit image-lookup-error when image endpoint responds with an error", async () => { - // Arrange - const inputId = "test"; - - const storeMixin = { - methods: { - dispatchStoreAction: jest.fn().mockImplementation(() => { - return new Promise((resolve, reject) => reject()); - }), - }, - }; - - const wrapper = shallowMount(textboxQuestion, { - global: { - directives: { - maska: maska, - }, - }, - propsData: { - modelValue: "", - includeCameraIcon: true, - inputId: inputId, - }, - mixins: [mockMixin, storeMixin], - attachTo: document.body, - }); - - wrapper.vm.handleChange = jest.fn().mockImplementation(() => {}); - - // Act - const imageUploadField = wrapper.find('[data-test="image-upload"]'); - - await imageUploadField.trigger("change"); - - await wrapper.vm.$nextTick(); - - // Assert - expect(wrapper.vm.handleChange).not.toHaveBeenCalled(); - expect(wrapper.emitted()).toHaveProperty("imageLookupError"); - }); - it("Should not display camera or spinner icon when disabled", () => { // Arrange const inputId = "test"; @@ -343,7 +210,7 @@ describe("textboxQuestion.vue", () => { }, propsData: { modelValue: "", - includeCameraIcon: true, + includeImageQuestion: true, inputId: inputId, isDisabled: true, }, @@ -359,4 +226,220 @@ describe("textboxQuestion.vue", () => { expect(cameraIcon.exists()).toBe(false); expect(loadingIcon.exists()).toBe(false); }); + + describe("Image Uploading", () => { + it("Should call this.handleChange & emit update when fully valid image is submitted.", async () => { + // Arrange + const inputId = "test"; + const responseValue = "testResponse"; + + const imageHandler = jest.fn().mockImplementation( + () => + new Promise((resolve, reject) => { + resolve({ + data: [responseValue], + }); + }) + ); + + const wrapper = shallowMount(textboxQuestion, { + global: { + directives: { + maska: maska, + }, + }, + propsData: { + modelValue: "", + "onUpdate:modelValue": (v) => wrapper.setProps({ modelValue: v }), + includeImageQuestion: true, + inputId: inputId, + imageQuestionSubmitHandler: imageHandler, + }, + mixins: [mockMixin], + attachTo: document.body, + }); + + wrapper.vm.handleChange = jest.fn().mockImplementation(() => {}); + wrapper.vm.isImageValid = jest.fn().mockImplementation(() => true); + + // Act + const imageUploadField = wrapper.find('[data-test="image-upload"]'); + + await imageUploadField.trigger("change"); + + await wrapper.vm.$nextTick(); + + // Assert + + expect(wrapper.vm.imageQuestionSubmitHandler).toHaveBeenCalled(); + expect(wrapper.vm.handleChange).toHaveBeenCalled(); + expect(wrapper.emitted()).toHaveProperty("update:modelValue"); + }); + + it("Should not call handler and emit image-lookup-error when image is invalid.", async () => { + // Arrange + const inputId = "test"; + const responseValue = "testResponse"; + + const imageHandler = jest.fn().mockImplementation( + () => + new Promise((resolve, reject) => { + resolve({ + data: [responseValue], + }); + }) + ); + + const wrapper = shallowMount(textboxQuestion, { + global: { + directives: { + maska: maska, + }, + }, + propsData: { + modelValue: "", + "onUpdate:modelValue": (v) => wrapper.setProps({ modelValue: v }), + includeImageQuestion: true, + inputId: inputId, + imageQuestionSubmitHandler: imageHandler, + }, + mixins: [mockMixin], + attachTo: document.body, + }); + + wrapper.vm.handleChange = jest.fn().mockImplementation(() => {}); + wrapper.vm.isImageValid = jest.fn().mockImplementation(() => false); + + // Act + const imageUploadField = wrapper.find('[data-test="image-upload"]'); + + await imageUploadField.trigger("change"); + + await wrapper.vm.$nextTick(); + + // Assert + expect(wrapper.vm.imageQuestionSubmitHandler).not.toHaveBeenCalled(); + expect(wrapper.vm.handleChange).not.toHaveBeenCalled(); + expect(wrapper.emitted()).toHaveProperty("imageValidityError"); + }); + + it("Should emit image-lookup-error when image lookup responds with an error.", async () => { + // Arrange + const inputId = "test"; + + const imageHandler = jest.fn().mockImplementation( + () => + new Promise((resolve, reject) => { + reject({}); + }) + ); + + const wrapper = shallowMount(textboxQuestion, { + global: { + directives: { + maska: maska, + }, + }, + propsData: { + modelValue: "", + "onUpdate:modelValue": (v) => wrapper.setProps({ modelValue: v }), + includeImageQuestion: true, + inputId: inputId, + imageQuestionSubmitHandler: imageHandler, + }, + mixins: [mockMixin], + attachTo: document.body, + }); + + wrapper.vm.handleChange = jest.fn().mockImplementation(() => {}); + wrapper.vm.isImageValid = jest.fn().mockImplementation(() => true); + + // Act + const imageUploadField = wrapper.find('[data-test="image-upload"]'); + + await imageUploadField.trigger("change"); + + await wrapper.vm.$nextTick(); + + // Assert + expect(wrapper.vm.imageQuestionSubmitHandler).toHaveBeenCalled(); + expect(wrapper.vm.handleChange).not.toHaveBeenCalled(); + expect(wrapper.emitted()).toHaveProperty("imageLookupError"); + }); + }); + + describe("Image Validation", () => { + it("Should return true if a valid image is tested.", () => { + // Arrange + const wrapper = shallowMount(textboxQuestion, { + global: { + directives: { + maska: maska, + }, + }, + propsData: { + inputId: "input ID", + }, + mixins: [mockMixin], + }); + + const image = { + size: 100 * 1028, + }; + + // Act + const result = wrapper.vm.isImageValid(image); + + // Assert + expect(result).toBeTruthy(); + }); + + it("Should return false if null image is tested.", () => { + // Arrange + const wrapper = shallowMount(textboxQuestion, { + global: { + directives: { + maska: maska, + }, + }, + propsData: { + inputId: "input ID", + }, + mixins: [mockMixin], + }); + + const image = null; + + // Act + const result = wrapper.vm.isImageValid(image); + + // Assert + expect(result).toBeFalsy(); + }); + + it("Should return false if oversized image is tested.", () => { + // Arrange + const wrapper = shallowMount(textboxQuestion, { + global: { + directives: { + maska: maska, + }, + }, + propsData: { + inputId: "input ID", + }, + mixins: [mockMixin], + }); + + const image = { + size: 10000000 * 1028, + }; + + // Act + const result = wrapper.vm.isImageValid(image); + + // Assert + expect(result).toBeFalsy(); + }); + }); }); diff --git a/src/common-components/textbox-question/textbox-question.vue b/src/common-components/textbox-question/textbox-question.vue index c080e4f91..146cdf33d 100644 --- a/src/common-components/textbox-question/textbox-question.vue +++ b/src/common-components/textbox-question/textbox-question.vue @@ -10,7 +10,7 @@ class="input-wrapper" :class="[ includeSearchIcon ? 'has-search-icon' : '', - includeCameraIcon ? 'has-camera-icon' : '', + includeImageQuestion ? 'has-camera-icon' : '', ]">