From d938814f1a50f804ae47b9b6a1994d212816e04d Mon Sep 17 00:00:00 2001 From: elweyn Date: Thu, 27 Jan 2022 10:24:03 +0100 Subject: [PATCH 1/6] Check if user account is not disabled to make a creation. --- backend/src/graphql/resolver/AdminResolver.ts | 30 +++++++++++-------- 1 file changed, 17 insertions(+), 13 deletions(-) diff --git a/backend/src/graphql/resolver/AdminResolver.ts b/backend/src/graphql/resolver/AdminResolver.ts index 8a7e034a5..7e61b4c1d 100644 --- a/backend/src/graphql/resolver/AdminResolver.ts +++ b/backend/src/graphql/resolver/AdminResolver.ts @@ -61,21 +61,25 @@ export class AdminResolver { const userRepository = getCustomRepository(UserRepository) const user = await userRepository.findByEmail(email) - const creations = await getUserCreations(user.id) - const creationDateObj = new Date(creationDate) - if (isCreationValid(creations, amount, creationDateObj)) { - const loginPendingTasksAdminRepository = getCustomRepository(LoginPendingTasksAdminRepository) - const loginPendingTaskAdmin = loginPendingTasksAdminRepository.create() - loginPendingTaskAdmin.userId = user.id - loginPendingTaskAdmin.amount = BigInt(amount * 10000) - loginPendingTaskAdmin.created = new Date() - loginPendingTaskAdmin.date = creationDateObj - loginPendingTaskAdmin.memo = memo - loginPendingTaskAdmin.moderator = moderator + if (!user.disabled) { + const creations = await getUserCreations(user.id) + const creationDateObj = new Date(creationDate) + if (isCreationValid(creations, amount, creationDateObj)) { + const loginPendingTasksAdminRepository = getCustomRepository(LoginPendingTasksAdminRepository) + const loginPendingTaskAdmin = loginPendingTasksAdminRepository.create() + loginPendingTaskAdmin.userId = user.id + loginPendingTaskAdmin.amount = BigInt(amount * 10000) + loginPendingTaskAdmin.created = new Date() + loginPendingTaskAdmin.date = creationDateObj + loginPendingTaskAdmin.memo = memo + loginPendingTaskAdmin.moderator = moderator - await loginPendingTasksAdminRepository.save(loginPendingTaskAdmin) + await loginPendingTasksAdminRepository.save(loginPendingTaskAdmin) + } + return getUserCreations(user.id) + } else { + throw new Error('Creation could not be saved, Email is not activated') } - return getUserCreations(user.id) } @Authorized([RIGHTS.CREATE_PENDING_CREATION]) From a12378ed8b25737bb131d546312fcbb50cd44c63 Mon Sep 17 00:00:00 2001 From: elweyn Date: Thu, 27 Jan 2022 10:33:06 +0100 Subject: [PATCH 2/6] Checks if User has activated his Email before saving a open creation. --- backend/src/graphql/resolver/AdminResolver.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/backend/src/graphql/resolver/AdminResolver.ts b/backend/src/graphql/resolver/AdminResolver.ts index 7e61b4c1d..8940c29ea 100644 --- a/backend/src/graphql/resolver/AdminResolver.ts +++ b/backend/src/graphql/resolver/AdminResolver.ts @@ -60,8 +60,8 @@ export class AdminResolver { ): Promise { const userRepository = getCustomRepository(UserRepository) const user = await userRepository.findByEmail(email) - - if (!user.disabled) { + const isActivated = await hasActivatedEmail(user.email) + if (isActivated) { const creations = await getUserCreations(user.id) const creationDateObj = new Date(creationDate) if (isCreationValid(creations, amount, creationDateObj)) { From 9e4d2498cad0638176bb0f409da36eabc38f2b43 Mon Sep 17 00:00:00 2001 From: elweyn Date: Thu, 27 Jan 2022 10:38:35 +0100 Subject: [PATCH 3/6] Throw exception before continuing the bussiness logic. --- backend/src/graphql/resolver/AdminResolver.ts | 33 +++++++++---------- 1 file changed, 16 insertions(+), 17 deletions(-) diff --git a/backend/src/graphql/resolver/AdminResolver.ts b/backend/src/graphql/resolver/AdminResolver.ts index 8940c29ea..2e9451a85 100644 --- a/backend/src/graphql/resolver/AdminResolver.ts +++ b/backend/src/graphql/resolver/AdminResolver.ts @@ -61,25 +61,24 @@ export class AdminResolver { const userRepository = getCustomRepository(UserRepository) const user = await userRepository.findByEmail(email) const isActivated = await hasActivatedEmail(user.email) - if (isActivated) { - const creations = await getUserCreations(user.id) - const creationDateObj = new Date(creationDate) - if (isCreationValid(creations, amount, creationDateObj)) { - const loginPendingTasksAdminRepository = getCustomRepository(LoginPendingTasksAdminRepository) - const loginPendingTaskAdmin = loginPendingTasksAdminRepository.create() - loginPendingTaskAdmin.userId = user.id - loginPendingTaskAdmin.amount = BigInt(amount * 10000) - loginPendingTaskAdmin.created = new Date() - loginPendingTaskAdmin.date = creationDateObj - loginPendingTaskAdmin.memo = memo - loginPendingTaskAdmin.moderator = moderator - - await loginPendingTasksAdminRepository.save(loginPendingTaskAdmin) - } - return getUserCreations(user.id) - } else { + if (!isActivated) { throw new Error('Creation could not be saved, Email is not activated') } + const creations = await getUserCreations(user.id) + const creationDateObj = new Date(creationDate) + if (isCreationValid(creations, amount, creationDateObj)) { + const loginPendingTasksAdminRepository = getCustomRepository(LoginPendingTasksAdminRepository) + const loginPendingTaskAdmin = loginPendingTasksAdminRepository.create() + loginPendingTaskAdmin.userId = user.id + loginPendingTaskAdmin.amount = BigInt(amount * 10000) + loginPendingTaskAdmin.created = new Date() + loginPendingTaskAdmin.date = creationDateObj + loginPendingTaskAdmin.memo = memo + loginPendingTaskAdmin.moderator = moderator + + await loginPendingTasksAdminRepository.save(loginPendingTaskAdmin) + } + return getUserCreations(user.id) } @Authorized([RIGHTS.CREATE_PENDING_CREATION]) From 05a4e23354d9e636e6e18230ddd611997da53219 Mon Sep 17 00:00:00 2001 From: ogerly Date: Thu, 27 Jan 2022 10:54:42 +0100 Subject: [PATCH 4/6] if email unconfirmed then no button for creation --- admin/src/components/UserTable.vue | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/admin/src/components/UserTable.vue b/admin/src/components/UserTable.vue index 3f8dface3..09738c3fb 100644 --- a/admin/src/components/UserTable.vue +++ b/admin/src/components/UserTable.vue @@ -47,7 +47,13 @@ From 648023e95c8575dfff8e832e93a5f568e54d3264 Mon Sep 17 00:00:00 2001 From: ogerly Date: Thu, 27 Jan 2022 11:18:24 +0100 Subject: [PATCH 5/6] yarn test fixed --- admin/src/components/UserTable.spec.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/admin/src/components/UserTable.spec.js b/admin/src/components/UserTable.spec.js index e26a548cc..4910c7e80 100644 --- a/admin/src/components/UserTable.spec.js +++ b/admin/src/components/UserTable.spec.js @@ -192,8 +192,10 @@ describe('UserTable', () => { expect(wrapper.findAll('tr:nth-child(1) > td').length).toBe(7) }) - it('click button on fifth column', () => { - wrapper.find('tbody tr td[aria-colindex="5"] button').trigger('click') + it('find button on fifth column', () => { + expect( + wrapper.findAll('tr:nth-child(1) > td').at(5).find('button').isVisible(), + ).toBeTruthy() }) }) }) From ffc4727e7a7105ac5dc97515b901be8dbe415627 Mon Sep 17 00:00:00 2001 From: Moriz Wahl Date: Thu, 27 Jan 2022 14:01:43 +0100 Subject: [PATCH 6/6] simple test for mass creation, improved test for single creation --- admin/src/components/CreationFormular.spec.js | 74 ++++++++++++++++--- 1 file changed, 64 insertions(+), 10 deletions(-) diff --git a/admin/src/components/CreationFormular.spec.js b/admin/src/components/CreationFormular.spec.js index 5b0ac09f5..b3807b16f 100644 --- a/admin/src/components/CreationFormular.spec.js +++ b/admin/src/components/CreationFormular.spec.js @@ -1,5 +1,7 @@ import { mount } from '@vue/test-utils' import CreationFormular from './CreationFormular.vue' +import { createPendingCreation } from '../graphql/createPendingCreation' +import { createPendingCreations } from '../graphql/createPendingCreations' const localVue = global.localVue @@ -145,10 +147,14 @@ describe('CreationFormular', () => { describe('with single creation', () => { beforeEach(async () => { jest.clearAllMocks() - await wrapper.setProps({ type: 'singleCreation', creation: [200, 400, 600] }) - await wrapper.setData({ rangeMin: 180 }) - await wrapper.setData({ text: 'Test create coins' }) - await wrapper.setData({ value: 90 }) + await wrapper.setProps({ + type: 'singleCreation', + creation: [200, 400, 600], + item: { email: 'benjamin@bluemchen.de' }, + }) + await wrapper.findAll('input[type="radio"]').at(1).setChecked() + await wrapper.find('textarea').setValue('Test create coins') + await wrapper.find('input[type="number"]').setValue(90) }) describe('first radio button', () => { @@ -156,12 +162,8 @@ describe('CreationFormular', () => { await wrapper.findAll('input[type="radio"]').at(0).setChecked() }) - it('sets rangeMin to 0', () => { - expect(wrapper.vm.rangeMin).toBe(0) - }) - it('sets rangeMax to 200', () => { - expect(wrapper.vm.rangeMax).toBe(200) + expect(wrapper.vm.rangeMax).toBe(400) }) describe('sendForm', () => { @@ -170,7 +172,18 @@ describe('CreationFormular', () => { }) it('sends ... to apollo', () => { - expect(apolloMutateMock).toBeCalled() + expect(apolloMutateMock).toBeCalledWith( + expect.objectContaining({ + mutation: createPendingCreation, + variables: { + email: 'benjamin@bluemchen.de', + creationDate: 'YYYY-MM-01', + amount: 90, + memo: 'Test create coins', + moderator: 0, + }, + }), + ) }) }) @@ -359,6 +372,47 @@ describe('CreationFormular', () => { }) }) }) + + describe('with mass creation', () => { + beforeEach(async () => { + jest.clearAllMocks() + await wrapper.setProps({ + type: 'massCreation', + creation: [200, 400, 600], + items: [{ email: 'bob@baumeister.de' }, { email: 'bibi@bloxberg.de' }], + }) + await wrapper.findAll('input[type="radio"]').at(1).setChecked() + await wrapper.find('textarea').setValue('Test mass create coins') + await wrapper.find('input[type="number"]').setValue(200) + await wrapper.find('.test-submit').trigger('click') + }) + + it('calls the API', () => { + expect(apolloMutateMock).toBeCalledWith( + expect.objectContaining({ + mutation: createPendingCreations, + variables: { + pendingCreations: [ + { + email: 'bob@baumeister.de', + creationDate: 'YYYY-MM-01', + amount: 200, + memo: 'Test mass create coins', + moderator: 0, + }, + { + email: 'bibi@bloxberg.de', + creationDate: 'YYYY-MM-01', + amount: 200, + memo: 'Test mass create coins', + moderator: 0, + }, + ], + }, + }), + ) + }) + }) }) }) })