From 4665d42405a1eb9a3650ecef1c27466021b7e0f3 Mon Sep 17 00:00:00 2001 From: einhorn_b Date: Thu, 23 Nov 2023 19:56:38 +0100 Subject: [PATCH] fix add add tests --- .../ContributionMessagesFormular.spec.js | 52 ++++++++++++++- .../ContributionMessagesFormular.vue | 17 +++-- .../ContributionMessagesList.spec.js | 11 ++++ .../Tables/OpenCreationsTable.spec.js | 1 + admin/src/components/input/TimePicker.spec.js | 63 +++++++++++++++++++ admin/src/components/input/TimePicker.vue | 4 +- admin/src/pages/CreationConfirm.spec.js | 9 +++ admin/src/pages/Overview.spec.js | 1 + 8 files changed, 145 insertions(+), 13 deletions(-) create mode 100644 admin/src/components/input/TimePicker.spec.js diff --git a/admin/src/components/ContributionMessages/ContributionMessagesFormular.spec.js b/admin/src/components/ContributionMessages/ContributionMessagesFormular.spec.js index f19459ce9..3638f5180 100644 --- a/admin/src/components/ContributionMessages/ContributionMessagesFormular.spec.js +++ b/admin/src/components/ContributionMessages/ContributionMessagesFormular.spec.js @@ -14,6 +14,7 @@ describe('ContributionMessagesFormular', () => { const propsData = { contributionId: 42, contributionMemo: 'It is a test memo', + hideResubmission: true, } const mocks = { @@ -95,13 +96,14 @@ describe('ContributionMessagesFormular', () => { await wrapper.find('button[data-test="submit-dialog"]').trigger('click') }) - it('moderatorMesage has `DIALOG`', () => { + it('moderatorMessage has `DIALOG`', () => { expect(apolloMutateMock).toBeCalledWith({ mutation: adminCreateContributionMessage, variables: { contributionId: 42, message: 'text form message', messageType: 'DIALOG', + resubmissionAt: null, }, }) }) @@ -128,6 +130,7 @@ describe('ContributionMessagesFormular', () => { contributionId: 42, message: 'text form message', messageType: 'MODERATOR', + resubmissionAt: null, }, }) }) @@ -137,6 +140,53 @@ describe('ContributionMessagesFormular', () => { }) }) + describe('send resubmission contribution message with success', () => { + const futureDate = new Date(Date.now() + 7 * 24 * 60 * 60 * 1000) // 7 days in milliseconds + + beforeEach(async () => { + await wrapper.setData({ + form: { + text: 'text form message', + }, + showResubmissionDate: true, + resubmissionDate: futureDate, + resubmissionTime: '08:46', + }) + await wrapper.find('button[data-test="submit-moderator"]').trigger('click') + }) + + it('graphql payload contain resubmission date', () => { + const futureDateExactTime = futureDate + futureDateExactTime.setHours(8) + futureDateExactTime.setMinutes(46) + expect(apolloMutateMock).toBeCalledWith({ + mutation: adminCreateContributionMessage, + variables: { + contributionId: 42, + message: 'text form message', + messageType: 'MODERATOR', + resubmissionAt: futureDateExactTime.toString(), + }, + }) + }) + + it('toasts an success message', () => { + expect(toastSuccessSpy).toBeCalledWith('message.request') + }) + }) + + describe('set memo', () => { + beforeEach(async () => { + await wrapper.setData({ + chatOrMemo: 0, + }) + await wrapper.find('button[data-test="submit-memo"]').trigger('click') + }) + it('check chatOrMemo value is 1', () => { + expect(wrapper.vm.chatOrMemo).toBe(1) + }) + }) + describe('update contribution memo from moderator for user created contributions', () => { beforeEach(async () => { await wrapper.setData({ diff --git a/admin/src/components/ContributionMessages/ContributionMessagesFormular.vue b/admin/src/components/ContributionMessages/ContributionMessagesFormular.vue index 41f88b1af..9b27f34a8 100644 --- a/admin/src/components/ContributionMessages/ContributionMessagesFormular.vue +++ b/admin/src/components/ContributionMessages/ContributionMessagesFormular.vue @@ -114,15 +114,11 @@ export default { }, methods: { combineResubmissionDateAndTime() { - if (this.resubmissionDate) { - const formattedDate = new Date(this.resubmissionDate) - const [hours, minutes] = this.resubmissionTime.split(':') - formattedDate.setHours(parseInt(hours)) - formattedDate.setMinutes(parseInt(minutes)) - return formattedDate - } else { - return null - } + const formattedDate = new Date(this.resubmissionDate) + const [hours, minutes] = this.resubmissionTime.split(':') + formattedDate.setHours(parseInt(hours)) + formattedDate.setMinutes(parseInt(minutes)) + return formattedDate }, onSubmit(mType) { this.loading = true @@ -196,7 +192,8 @@ export default { return ( (this.chatOrMemo === 0 && this.form.text === '') || this.loading || - (this.chatOrMemo === 1 && this.form.memo.length < 5) + (this.chatOrMemo === 1 && this.form.memo.length < 5) || + (this.showResubmissionDate && !this.resubmissionDate) ) }, moderatorDisabled() { diff --git a/admin/src/components/ContributionMessages/ContributionMessagesList.spec.js b/admin/src/components/ContributionMessages/ContributionMessagesList.spec.js index b38c4e7d4..fe91abe6c 100644 --- a/admin/src/components/ContributionMessages/ContributionMessagesList.spec.js +++ b/admin/src/components/ContributionMessages/ContributionMessagesList.spec.js @@ -89,6 +89,7 @@ describe('ContributionMessagesList', () => { contributionMemo: 'test memo', contributionUserId: 108, contributionStatus: 'PENDING', + hideResubmission: true, } const mocks = { @@ -155,5 +156,15 @@ describe('ContributionMessagesList', () => { expect(wrapper.emitted('reload-contribution')[0]).toEqual([3]) }) }) + + describe('test update-contributions', () => { + beforeEach(() => { + wrapper.vm.updateContributions() + }) + + it('emits update-contributions', () => { + expect(wrapper.emitted('update-contributions')).toBeTruthy() + }) + }) }) }) diff --git a/admin/src/components/Tables/OpenCreationsTable.spec.js b/admin/src/components/Tables/OpenCreationsTable.spec.js index 054ef9067..6babe9956 100644 --- a/admin/src/components/Tables/OpenCreationsTable.spec.js +++ b/admin/src/components/Tables/OpenCreationsTable.spec.js @@ -70,6 +70,7 @@ const propsData = { { key: 'confirm', label: 'save' }, ], toggleDetails: false, + hideResubmission: true, } const mocks = { diff --git a/admin/src/components/input/TimePicker.spec.js b/admin/src/components/input/TimePicker.spec.js new file mode 100644 index 000000000..82f51a969 --- /dev/null +++ b/admin/src/components/input/TimePicker.spec.js @@ -0,0 +1,63 @@ +import { mount } from '@vue/test-utils' +import TimePicker from './TimePicker.vue' + +describe('TimePicker', () => { + it('updates timeValue on input and emits input event', async () => { + const wrapper = mount(TimePicker, { + propsData: { + value: '12:34', // Set an initial value for testing + }, + }) + + const input = wrapper.find('input[type="text"]') + + // Simulate user input + await input.setValue('23:45') + + // Check if timeValue is updated + expect(wrapper.vm.timeValue).toBe('23:45') + + // Check if input event is emitted with updated value + expect(wrapper.emitted().input).toBeTruthy() + expect(wrapper.emitted().input[0]).toEqual(['23:45']) + }) + + it('validates and corrects time format on blur', async () => { + const wrapper = mount(TimePicker) + + const input = wrapper.find('input[type="text"]') + + // Simulate user input + await input.setValue('99:99') + expect(wrapper.emitted().input).toBeTruthy() + expect(wrapper.emitted().input[0]).toEqual(['99:99']) + + // Trigger blur event + await input.trigger('blur') + + // Check if timeValue is corrected to valid format + expect(wrapper.vm.timeValue).toBe('23:59') // Maximum allowed value for hours and minutes + + // Check if input event is emitted with corrected value + expect(wrapper.emitted().input).toBeTruthy() + expect(wrapper.emitted().input[1]).toEqual(['23:59']) + }) + + it('check handling of empty input', async () => { + const wrapper = mount(TimePicker) + const input = wrapper.find('input[type="text"]') + + // Simulate user input with non-numeric characters + await input.setValue('') + + // Trigger blur event + await input.trigger('blur') + + // Check if non-numeric characters are filtered out + expect(wrapper.vm.timeValue).toBe('00:00') + + // Check if input event is emitted with filtered value + expect(wrapper.emitted().input).toBeTruthy() + expect(wrapper.emitted().input[1]).toEqual(['00:00']) + }) +}) diff --git a/admin/src/components/input/TimePicker.vue b/admin/src/components/input/TimePicker.vue index 7a8111f1e..e8fb416ad 100644 --- a/admin/src/components/input/TimePicker.vue +++ b/admin/src/components/input/TimePicker.vue @@ -36,8 +36,8 @@ export default { let [hours, minutes] = this.timeValue.split(':') // Validate hours and minutes - hours = Math.min(Math.max(parseInt(hours) || 0, 0), 23) - minutes = Math.min(Math.max(parseInt(minutes) || 0, 0), 59) + hours = Math.min(parseInt(hours) || 0, 23) + minutes = Math.min(parseInt(minutes) || 0, 59) // Update the value with correct format this.timeValue = `${hours.toString().padStart(2, '0')}:${minutes.toString().padStart(2, '0')}` diff --git a/admin/src/pages/CreationConfirm.spec.js b/admin/src/pages/CreationConfirm.spec.js index 4842c8b3b..cba169655 100644 --- a/admin/src/pages/CreationConfirm.spec.js +++ b/admin/src/pages/CreationConfirm.spec.js @@ -347,6 +347,7 @@ describe('CreationConfirm', () => { it('refetches contributions with proper filter', () => { expect(adminListContributionsMock).toBeCalledWith({ currentPage: 1, + hideResubmission: false, noHashtag: null, order: 'DESC', pageSize: 25, @@ -364,6 +365,7 @@ describe('CreationConfirm', () => { it('refetches contributions with proper filter', () => { expect(adminListContributionsMock).toBeCalledWith({ currentPage: 1, + hideResubmission: true, noHashtag: null, order: 'DESC', pageSize: 25, @@ -382,6 +384,7 @@ describe('CreationConfirm', () => { it('refetches contributions with proper filter', () => { expect(adminListContributionsMock).toBeCalledWith({ currentPage: 1, + hideResubmission: false, noHashtag: null, order: 'DESC', pageSize: 25, @@ -400,6 +403,7 @@ describe('CreationConfirm', () => { it('refetches contributions with proper filter', () => { expect(adminListContributionsMock).toBeCalledWith({ currentPage: 1, + hideResubmission: false, noHashtag: null, order: 'DESC', pageSize: 25, @@ -418,6 +422,7 @@ describe('CreationConfirm', () => { it('refetches contributions with proper filter', () => { expect(adminListContributionsMock).toBeCalledWith({ currentPage: 1, + hideResubmission: false, noHashtag: null, order: 'DESC', pageSize: 25, @@ -440,6 +445,7 @@ describe('CreationConfirm', () => { it('calls the API again', () => { expect(adminListContributionsMock).toBeCalledWith({ currentPage: 2, + hideResubmission: false, noHashtag: null, order: 'DESC', pageSize: 25, @@ -457,6 +463,7 @@ describe('CreationConfirm', () => { it('refetches contributions with proper filter and current page = 1', () => { expect(adminListContributionsMock).toBeCalledWith({ currentPage: 1, + hideResubmission: true, noHashtag: null, order: 'DESC', pageSize: 25, @@ -480,6 +487,7 @@ describe('CreationConfirm', () => { it('calls the API with query', () => { expect(adminListContributionsMock).toBeCalledWith({ currentPage: 1, + hideResubmission: true, noHashtag: null, order: 'DESC', pageSize: 25, @@ -496,6 +504,7 @@ describe('CreationConfirm', () => { it('calls the API with empty query', () => { expect(adminListContributionsMock).toBeCalledWith({ currentPage: 1, + hideResubmission: true, noHashtag: null, order: 'DESC', pageSize: 25, diff --git a/admin/src/pages/Overview.spec.js b/admin/src/pages/Overview.spec.js index d5265f0e2..c0e358478 100644 --- a/admin/src/pages/Overview.spec.js +++ b/admin/src/pages/Overview.spec.js @@ -116,6 +116,7 @@ describe('Overview', () => { it('calls the adminListContributions query', () => { expect(adminListContributionsMock).toBeCalledWith({ currentPage: 1, + hideResubmission: true, order: 'DESC', pageSize: 25, statusFilter: ['IN_PROGRESS', 'PENDING'],