diff --git a/backend/src/graphql/resolver/UserResolver.test.ts b/backend/src/graphql/resolver/UserResolver.test.ts index 947636aa4..6bcbbfc74 100644 --- a/backend/src/graphql/resolver/UserResolver.test.ts +++ b/backend/src/graphql/resolver/UserResolver.test.ts @@ -1,9 +1,15 @@ /* eslint-disable @typescript-eslint/no-explicit-any */ /* eslint-disable @typescript-eslint/explicit-module-boundary-types */ -import { testEnvironment, createUser, headerPushMock, cleanDB, resetToken } from '@test/helpers' -import { createUserMutation, setPasswordMutation } from '@test/graphql' -import gql from 'graphql-tag' +import { + testEnvironment, + createConfirmedUser, + headerPushMock, + cleanDB, + resetToken, +} from '@test/helpers' +import { createUser, setPassword } from '@/seeds/graphql/mutations' +import { login, logout } from '@/seeds/graphql/queries' import { GraphQLError } from 'graphql' import { LoginEmailOptIn } from '@entity/LoginEmailOptIn' import { User } from '@entity/User' @@ -11,8 +17,6 @@ import CONFIG from '@/config' import { sendAccountActivationEmail } from '@/mailer/sendAccountActivationEmail' // import { klicktippSignIn } from '@/apis/KlicktippController' -jest.setTimeout(1000000) - jest.mock('@/mailer/sendAccountActivationEmail', () => { return { __esModule: true, @@ -31,24 +35,6 @@ jest.mock('@/apis/KlicktippController', () => { let mutate: any, query: any, con: any -const loginQuery = gql` - query ($email: String!, $password: String!, $publisherId: Int) { - login(email: $email, password: $password, publisherId: $publisherId) { - email - firstName - lastName - language - coinanimation - klickTipp { - newsletterState - } - hasElopage - publisherId - isAdmin - } - } -` - beforeAll(async () => { const testEnv = await testEnvironment() mutate = testEnv.mutate @@ -77,7 +63,7 @@ describe('UserResolver', () => { beforeAll(async () => { jest.clearAllMocks() - result = await mutate({ mutation: createUserMutation, variables }) + result = await mutate({ mutation: createUser, variables }) }) afterAll(async () => { @@ -149,7 +135,7 @@ describe('UserResolver', () => { describe('email already exists', () => { it('throws an error', async () => { - await expect(mutate({ mutation: createUserMutation, variables })).resolves.toEqual( + await expect(mutate({ mutation: createUser, variables })).resolves.toEqual( expect.objectContaining({ errors: [new GraphQLError('User already exists.')], }), @@ -160,7 +146,7 @@ describe('UserResolver', () => { describe('unknown language', () => { it('sets "de" as default language', async () => { await mutate({ - mutation: createUserMutation, + mutation: createUser, variables: { ...variables, email: 'bibi@bloxberg.de', language: 'es' }, }) await expect(User.find()).resolves.toEqual( @@ -177,7 +163,7 @@ describe('UserResolver', () => { describe('no publisher id', () => { it('sets publisher id to null', async () => { await mutate({ - mutation: createUserMutation, + mutation: createUser, variables: { ...variables, email: 'raeuber@hotzenplotz.de', publisherId: undefined }, }) await expect(User.find()).resolves.toEqual( @@ -208,11 +194,11 @@ describe('UserResolver', () => { let newUser: any beforeAll(async () => { - await mutate({ mutation: createUserMutation, variables: createUserVariables }) + await mutate({ mutation: createUser, variables: createUserVariables }) const loginEmailOptIn = await LoginEmailOptIn.find() emailOptIn = loginEmailOptIn[0].verificationCode.toString() result = await mutate({ - mutation: setPasswordMutation, + mutation: setPassword, variables: { code: emailOptIn, password: 'Aa12345_' }, }) newUser = await User.find() @@ -252,11 +238,11 @@ describe('UserResolver', () => { describe('no valid password', () => { beforeAll(async () => { - await mutate({ mutation: createUserMutation, variables: createUserVariables }) + await mutate({ mutation: createUser, variables: createUserVariables }) const loginEmailOptIn = await LoginEmailOptIn.find() emailOptIn = loginEmailOptIn[0].verificationCode.toString() result = await mutate({ - mutation: setPasswordMutation, + mutation: setPassword, variables: { code: emailOptIn, password: 'not-valid' }, }) }) @@ -280,9 +266,9 @@ describe('UserResolver', () => { describe('no valid optin code', () => { beforeAll(async () => { - await mutate({ mutation: createUserMutation, variables: createUserVariables }) + await mutate({ mutation: createUser, variables: createUserVariables }) result = await mutate({ - mutation: setPasswordMutation, + mutation: setPassword, variables: { code: 'not valid', password: 'Aa12345_' }, }) }) @@ -316,7 +302,7 @@ describe('UserResolver', () => { describe('no users in database', () => { beforeAll(async () => { - result = await query({ query: loginQuery, variables }) + result = await query({ query: login, variables }) }) it('throws an error', () => { @@ -330,14 +316,14 @@ describe('UserResolver', () => { describe('user is in database and correct login data', () => { beforeAll(async () => { - await createUser(mutate, { + await createConfirmedUser(mutate, { email: 'peter@lustig.de', firstName: 'Peter', lastName: 'Lustig', language: 'de', publisherId: 1234, }) - result = await query({ query: loginQuery, variables }) + result = await query({ query: login, variables }) }) afterAll(async () => { @@ -373,7 +359,7 @@ describe('UserResolver', () => { describe('user is in database and wrong password', () => { beforeAll(async () => { - await createUser(mutate, { + await createConfirmedUser(mutate, { email: 'peter@lustig.de', firstName: 'Peter', lastName: 'Lustig', @@ -388,7 +374,7 @@ describe('UserResolver', () => { it('returns an error', () => { expect( - query({ query: loginQuery, variables: { ...variables, password: 'wrong' } }), + query({ query: login, variables: { ...variables, password: 'wrong' } }), ).resolves.toEqual( expect.objectContaining({ errors: [new GraphQLError('No user with this credentials')], @@ -399,16 +385,10 @@ describe('UserResolver', () => { }) describe('logout', () => { - const logoutQuery = gql` - query { - logout - } - ` - describe('unauthenticated', () => { it('throws an error', async () => { resetToken() - await expect(query({ query: logoutQuery })).resolves.toEqual( + await expect(query({ query: logout })).resolves.toEqual( expect.objectContaining({ errors: [new GraphQLError('401 Unauthorized')], }), @@ -423,14 +403,14 @@ describe('UserResolver', () => { } beforeAll(async () => { - await createUser(mutate, { + await createConfirmedUser(mutate, { email: 'peter@lustig.de', firstName: 'Peter', lastName: 'Lustig', language: 'de', publisherId: 1234, }) - await query({ query: loginQuery, variables }) + await query({ query: login, variables }) }) afterAll(async () => { @@ -438,7 +418,7 @@ describe('UserResolver', () => { }) it('returns true', async () => { - await expect(query({ query: logoutQuery })).resolves.toEqual( + await expect(query({ query: logout })).resolves.toEqual( expect.objectContaining({ data: { logout: 'true' }, errors: undefined, diff --git a/backend/src/seeds/graphql/enums.ts b/backend/src/seeds/graphql/enums.ts new file mode 100644 index 000000000..6e40dd19c --- /dev/null +++ b/backend/src/seeds/graphql/enums.ts @@ -0,0 +1,9 @@ +export const GdtEntryType = { + FORM: 'FORM', + CVS: 'CVS', + ELOPAGE: 'ELOPAGE', + ELOPAGE_PUBLISHER: 'ELOPAGE_PUBLISHER', + DIGISTORE: 'DIGISTORE', + CVS2: 'CVS2', + GLOBAL_MODIFICATOR: 'GLOBAL_MODIFICATOR', +} diff --git a/backend/src/seeds/graphql/mutations.ts b/backend/src/seeds/graphql/mutations.ts new file mode 100644 index 000000000..8f425cdec --- /dev/null +++ b/backend/src/seeds/graphql/mutations.ts @@ -0,0 +1,71 @@ +import gql from 'graphql-tag' + +export const subscribeNewsletter = gql` + mutation ($email: String!, $language: String!) { + subscribeNewsletter(email: $email, language: $language) + } +` + +export const unsubscribeNewsletter = gql` + mutation ($email: String!) { + unsubscribeNewsletter(email: $email) + } +` + +export const setPassword = gql` + mutation ($code: String!, $password: String!) { + setPassword(code: $code, password: $password) + } +` + +export const updateUserInfos = gql` + mutation ( + $firstName: String + $lastName: String + $password: String + $passwordNew: String + $locale: String + $coinanimation: Boolean + ) { + updateUserInfos( + firstName: $firstName + lastName: $lastName + password: $password + passwordNew: $passwordNew + language: $locale + coinanimation: $coinanimation + ) + } +` + +export const createUser = gql` + mutation ( + $firstName: String! + $lastName: String! + $email: String! + $language: String! + $publisherId: Int + ) { + createUser( + email: $email + firstName: $firstName + lastName: $lastName + language: $language + publisherId: $publisherId + ) + } +` + +export const sendCoins = gql` + mutation ($email: String!, $amount: Decimal!, $memo: String!) { + sendCoins(email: $email, amount: $amount, memo: $memo) + } +` + +export const createTransactionLink = gql` + mutation ($amount: Decimal!, $memo: String!) { + createTransactionLink(amount: $amount, memo: $memo) { + code + } + } +` diff --git a/backend/src/seeds/graphql/queries.ts b/backend/src/seeds/graphql/queries.ts new file mode 100644 index 000000000..942258fde --- /dev/null +++ b/backend/src/seeds/graphql/queries.ts @@ -0,0 +1,144 @@ +import gql from 'graphql-tag' + +export const login = gql` + query ($email: String!, $password: String!, $publisherId: Int) { + login(email: $email, password: $password, publisherId: $publisherId) { + email + firstName + lastName + language + coinanimation + klickTipp { + newsletterState + } + hasElopage + publisherId + isAdmin + } + } +` + +export const verifyLogin = gql` + query { + verifyLogin { + email + firstName + lastName + language + coinanimation + klickTipp { + newsletterState + } + hasElopage + publisherId + isAdmin + } + } +` + +export const logout = gql` + query { + logout + } +` + +export const transactionsQuery = gql` + query ( + $currentPage: Int = 1 + $pageSize: Int = 25 + $order: Order = DESC + $onlyCreations: Boolean = false + ) { + transactionList( + currentPage: $currentPage + pageSize: $pageSize + order: $order + onlyCreations: $onlyCreations + ) { + balanceGDT + count + balance + decayStartBlock + transactions { + id + typeId + amount + balance + balanceDate + memo + linkedUser { + firstName + lastName + } + decay { + decay + start + end + duration + } + } + } + } +` + +export const sendResetPasswordEmail = gql` + query ($email: String!) { + sendResetPasswordEmail(email: $email) + } +` + +export const listGDTEntriesQuery = gql` + query ($currentPage: Int!, $pageSize: Int!) { + listGDTEntries(currentPage: $currentPage, pageSize: $pageSize) { + count + gdtEntries { + id + amount + date + comment + gdtEntryType + factor + gdt + } + gdtSum + } + } +` + +export const communityInfo = gql` + query { + getCommunityInfo { + name + description + registerUrl + url + } + } +` + +export const communities = gql` + query { + communities { + id + name + url + description + registerUrl + } + } +` + +export const queryTransactionLink = gql` + query ($code: String!) { + queryTransactionLink(code: $code) { + amount + memo + createdAt + validUntil + user { + firstName + publisherId + } + } + } +` diff --git a/backend/test/graphql.ts b/backend/test/graphql.ts deleted file mode 100644 index 89393876e..000000000 --- a/backend/test/graphql.ts +++ /dev/null @@ -1,25 +0,0 @@ -import gql from 'graphql-tag' - -export const createUserMutation = gql` - mutation ( - $email: String! - $firstName: String! - $lastName: String! - $language: String! - $publisherId: Int - ) { - createUser( - email: $email - firstName: $firstName - lastName: $lastName - language: $language - publisherId: $publisherId - ) - } -` - -export const setPasswordMutation = gql` - mutation ($code: String!, $password: String!) { - setPassword(code: $code, password: $password) - } -` diff --git a/backend/test/helpers.ts b/backend/test/helpers.ts index edb4eb3e4..95d1b3e59 100644 --- a/backend/test/helpers.ts +++ b/backend/test/helpers.ts @@ -4,7 +4,7 @@ import { createTestClient } from 'apollo-server-testing' import createServer from '../src/server/createServer' import { initialize } from '@dbTools/helpers' -import { createUserMutation, setPasswordMutation } from './graphql' +import { createUser, setPassword } from '@/seeds/graphql/mutations' import { LoginEmailOptIn } from '@entity/LoginEmailOptIn' import { User } from '@entity/User' import { entities } from '@entity/index' @@ -46,15 +46,15 @@ export const resetEntity = async (entity: any) => { } } -export const createUser = async (mutate: any, user: any) => { +export const createConfirmedUser = async (mutate: any, user: any) => { // resetToken() - await mutate({ mutation: createUserMutation, variables: user }) + await mutate({ mutation: createUser, variables: user }) const dbUser = await User.findOne({ where: { email: user.email } }) if (!dbUser) throw new Error('Ups, no user found') const optin = await LoginEmailOptIn.findOne({ where: { userId: dbUser.id } }) if (!optin) throw new Error('Ups, no optin found') await mutate({ - mutation: setPasswordMutation, + mutation: setPassword, variables: { password: 'Aa12345_', code: optin.verificationCode }, }) }