diff --git a/admin/src/components/UserTable.vue b/admin/src/components/UserTable.vue index 4a8ca8e84..9a0e876b2 100644 --- a/admin/src/components/UserTable.vue +++ b/admin/src/components/UserTable.vue @@ -237,7 +237,7 @@ export default { }, }) .then(() => { - this.$emit('remove-confirm-result', item, 'remove') + this.$emit('remove-confirm-result', item, 'confirmed') }) .catch((error) => { this.$toasted.error(error.message) diff --git a/admin/src/graphql/createPendingCreation.js b/admin/src/graphql/createPendingCreation.js index 72c3249de..183fa5b15 100644 --- a/admin/src/graphql/createPendingCreation.js +++ b/admin/src/graphql/createPendingCreation.js @@ -3,7 +3,7 @@ import gql from 'graphql-tag' export const createPendingCreation = gql` mutation ( $email: String! - $amount: Int! + $amount: Float! $memo: String! $creationDate: String! $moderator: Int! diff --git a/admin/src/graphql/updatePendingCreation.js b/admin/src/graphql/updatePendingCreation.js index b137d961c..77668f15b 100644 --- a/admin/src/graphql/updatePendingCreation.js +++ b/admin/src/graphql/updatePendingCreation.js @@ -4,7 +4,7 @@ export const updatePendingCreation = gql` mutation ( $id: Int! $email: String! - $amount: Int! + $amount: Float! $memo: String! $creationDate: String! $moderator: Int! diff --git a/admin/src/pages/CreationConfirm.spec.js b/admin/src/pages/CreationConfirm.spec.js index 90db3a93f..fb59d1598 100644 --- a/admin/src/pages/CreationConfirm.spec.js +++ b/admin/src/pages/CreationConfirm.spec.js @@ -81,7 +81,7 @@ describe('CreationConfirm', () => { }) }) - describe('confirm creation delete with success', () => { + describe('delete creation delete with success', () => { beforeEach(async () => { apolloQueryMock.mockResolvedValue({ data: { @@ -130,7 +130,7 @@ describe('CreationConfirm', () => { }) }) - describe('confirm creation delete with error', () => { + describe('delete creation delete with error', () => { beforeEach(async () => { apolloMutateMock.mockRejectedValue({ message: 'Ouchhh!' }) await wrapper @@ -143,6 +143,67 @@ describe('CreationConfirm', () => { }) }) + describe('confirm creation delete with success', () => { + beforeEach(async () => { + apolloQueryMock.mockResolvedValue({ + data: { + getPendingCreations: [ + { + id: 1, + firstName: 'Bibi', + lastName: 'Bloxberg', + email: 'bibi@bloxberg.de', + amount: 500, + memo: 'Danke für alles', + date: new Date(), + moderator: 0, + }, + { + id: 2, + firstName: 'Räuber', + lastName: 'Hotzenplotz', + email: 'raeuber@hotzenplotz.de', + amount: 1000000, + memo: 'Gut Ergatert', + date: new Date(), + moderator: 0, + }, + ], + }, + }) + await wrapper + .findComponent({ name: 'UserTable' }) + .vm.$emit('remove-confirm-result', { id: 1 }, 'confirmed') + }) + + it('calls the deletePendingCreation mutation', () => { + expect(apolloMutateMock).not.toBeCalledWith({ + mutation: deletePendingCreation, + variables: { id: 1 }, + }) + }) + + it('commits openCreationsMinus to store', () => { + expect(storeCommitMock).toBeCalledWith('openCreationsMinus', 1) + }) + + it('toasts a success message', () => { + expect(toastedSuccessMock).toBeCalledWith('Pending Creation has been deleted') + }) + }) + + describe('delete creation delete with error', () => { + beforeEach(async () => { + await wrapper + .findComponent({ name: 'UserTable' }) + .vm.$emit('remove-confirm-result', { id: 1 }, 'confirm') + }) + + it('toasts an error message', () => { + expect(toastedErrorMock).toBeCalledWith('Case confirm is not supported') + }) + }) + describe('server response is error', () => { beforeEach(() => { jest.clearAllMocks() diff --git a/admin/src/pages/CreationConfirm.vue b/admin/src/pages/CreationConfirm.vue index 0f180ffbc..578c9b23f 100644 --- a/admin/src/pages/CreationConfirm.vue +++ b/admin/src/pages/CreationConfirm.vue @@ -51,25 +51,34 @@ export default { }, methods: { removeConfirmResult(e, event) { - if (event === 'remove') { - let index = 0 - const findArr = this.confirmResult.find((arr) => arr.id === e.id) - this.$apollo - .mutate({ - mutation: deletePendingCreation, - variables: { - id: findArr.id, - }, - }) - .then((result) => { - index = this.confirmResult.indexOf(findArr) - this.confirmResult.splice(index, 1) - this.$store.commit('openCreationsMinus', 1) - this.$toasted.success('Pending Creation has been deleted') - }) - .catch((error) => { - this.$toasted.error(error.message) - }) + let index = 0 + const findArr = this.confirmResult.find((arr) => arr.id === e.id) + switch (event) { + case 'remove': + this.$apollo + .mutate({ + mutation: deletePendingCreation, + variables: { + id: findArr.id, + }, + }) + .then((result) => { + index = this.confirmResult.indexOf(findArr) + this.confirmResult.splice(index, 1) + this.$store.commit('openCreationsMinus', 1) + this.$toasted.success('Pending Creation has been deleted') + }) + .catch((error) => { + this.$toasted.error(error.message) + }) + break + case 'confirmed': + this.confirmResult.splice(index, 1) + this.$store.commit('openCreationsMinus', 1) + this.$toasted.success('Pending Creation has been deleted') + break + default: + this.$toasted.error('Case ' + event + ' is not supported') } }, getPendingCreations() { @@ -80,7 +89,7 @@ export default { }) .then((result) => { this.$store.commit('resetOpenCreations') - this.confirmResult = result.data.getPendingCreations.reverse() + this.confirmResult = result.data.getPendingCreations this.$store.commit('setOpenCreations', result.data.getPendingCreations.length) }) .catch((error) => { diff --git a/backend/src/graphql/arg/CreatePendingCreationArgs.ts b/backend/src/graphql/arg/CreatePendingCreationArgs.ts index d2c17abf1..dfd4a4e85 100644 --- a/backend/src/graphql/arg/CreatePendingCreationArgs.ts +++ b/backend/src/graphql/arg/CreatePendingCreationArgs.ts @@ -1,11 +1,11 @@ -import { ArgsType, Field, Int } from 'type-graphql' +import { ArgsType, Field, Float, Int } from 'type-graphql' @ArgsType() export default class CreatePendingCreationArgs { @Field(() => String) email: string - @Field(() => Int) + @Field(() => Float) amount: number @Field(() => String) diff --git a/backend/src/graphql/arg/UpdatePendingCreationArgs.ts b/backend/src/graphql/arg/UpdatePendingCreationArgs.ts index bde7133aa..8cd9ccc4c 100644 --- a/backend/src/graphql/arg/UpdatePendingCreationArgs.ts +++ b/backend/src/graphql/arg/UpdatePendingCreationArgs.ts @@ -1,4 +1,4 @@ -import { ArgsType, Field, Int } from 'type-graphql' +import { ArgsType, Field, Float, Int } from 'type-graphql' @ArgsType() export default class CreatePendingCreationArgs { @@ -8,7 +8,7 @@ export default class CreatePendingCreationArgs { @Field(() => String) email: string - @Field(() => Int) + @Field(() => Float) amount: number @Field(() => String) diff --git a/backend/src/graphql/resolver/AdminResolver.ts b/backend/src/graphql/resolver/AdminResolver.ts index 416838c1c..88d240cf0 100644 --- a/backend/src/graphql/resolver/AdminResolver.ts +++ b/backend/src/graphql/resolver/AdminResolver.ts @@ -133,7 +133,7 @@ export class AdminResolver { return newPendingCreation }), ) - return pendingCreationsPromise + return pendingCreationsPromise.reverse() } @Mutation(() => Boolean) diff --git a/frontend/src/views/Pages/Login.spec.js b/frontend/src/views/Pages/Login.spec.js index 34175d8b3..f9fde0e1e 100644 --- a/frontend/src/views/Pages/Login.spec.js +++ b/frontend/src/views/Pages/Login.spec.js @@ -251,6 +251,44 @@ describe('Login', () => { it('toasts an error message', () => { expect(toastErrorMock).toBeCalledWith('error.no-account') }) + + describe('login fails with "User email not validated"', () => { + beforeEach(async () => { + apolloQueryMock.mockRejectedValue({ + message: 'User email not validated', + }) + wrapper = Wrapper() + jest.clearAllMocks() + await wrapper.find('input[placeholder="Email"]').setValue('user@example.org') + await wrapper.find('input[placeholder="form.password"]').setValue('1234') + await flushPromises() + await wrapper.find('form').trigger('submit') + await flushPromises() + }) + + it('redirects to /thx/login', () => { + expect(mockRouterPush).toBeCalledWith('/thx/login') + }) + }) + + describe('login fails with "User has no password set yet"', () => { + beforeEach(async () => { + apolloQueryMock.mockRejectedValue({ + message: 'User has no password set yet', + }) + wrapper = Wrapper() + jest.clearAllMocks() + await wrapper.find('input[placeholder="Email"]').setValue('user@example.org') + await wrapper.find('input[placeholder="form.password"]').setValue('1234') + await flushPromises() + await wrapper.find('form').trigger('submit') + await flushPromises() + }) + + it('redirects to /reset/login', () => { + expect(mockRouterPush).toBeCalledWith('/reset/login') + }) + }) }) }) }) diff --git a/frontend/src/views/Pages/Login.vue b/frontend/src/views/Pages/Login.vue index d5d3e25a4..4d2b75d2a 100755 --- a/frontend/src/views/Pages/Login.vue +++ b/frontend/src/views/Pages/Login.vue @@ -105,10 +105,10 @@ export default { loader.hide() }) .catch((error) => { - if (error.message.includes('No user with this credentials')) { - this.$toasted.global.error(this.$t('error.no-account')) - } else { - // : this.$t('error.no-email-verify') + this.$toasted.global.error(this.$t('error.no-account')) + if (error.message.includes('User email not validated')) { + this.$router.push('/thx/login') + } else if (error.message.includes('User has no password set yet')) { this.$router.push('/reset/login') } loader.hide()