diff --git a/backend/src/graphql/resolver/ContributionMessageResolver.test.ts b/backend/src/graphql/resolver/ContributionMessageResolver.test.ts index dcf7d983e..bf61da47f 100644 --- a/backend/src/graphql/resolver/ContributionMessageResolver.test.ts +++ b/backend/src/graphql/resolver/ContributionMessageResolver.test.ts @@ -3,13 +3,19 @@ import { cleanDB, resetToken, testEnvironment } from '@test/helpers' import { GraphQLError } from 'graphql' -import { createContributionMessage } from '@/seeds/graphql/mutations' +import { + adminCreateContributionMessage, + createContribution, + createContributionMessage, +} from '@/seeds/graphql/mutations' import { listContributionMessages, login } from '@/seeds/graphql/queries' import { userFactory } from '@/seeds/factory/user' import { bibiBloxberg } from '@/seeds/users/bibi-bloxberg' +import { peterLustig } from '@/seeds/users/peter-lustig' let mutate: any, query: any, con: any let testEnv: any +let result: any beforeAll(async () => { testEnv = await testEnvironment() @@ -25,6 +31,99 @@ afterAll(async () => { }) describe('ContributionMessageResolver', () => { + describe('adminCreateContributionMessage', () => { + describe('unauthenticated', () => { + it('returns an error', async () => { + await expect( + mutate({ + mutation: adminCreateContributionMessage, + variables: { contributionId: 1, message: 'This is a test message' }, + }), + ).resolves.toEqual( + expect.objectContaining({ + errors: [new GraphQLError('401 Unauthorized')], + }), + ) + }) + }) + + describe('authenticated', () => { + beforeAll(async () => { + await userFactory(testEnv, bibiBloxberg) + await userFactory(testEnv, peterLustig) + await query({ + query: login, + variables: { email: 'bibi@bloxberg.de', password: 'Aa12345_' }, + }) + result = await mutate({ + mutation: createContribution, + variables: { + amount: 100.0, + memo: 'Test env contribution', + creationDate: new Date().toString(), + }, + }) + await query({ + query: login, + variables: { email: 'peter@lustig.de', password: 'Aa12345_' }, + }) + }) + + afterAll(async () => { + await cleanDB() + resetToken() + }) + + describe('input not valid', () => { + it('throws error when contribution does not exist', async () => { + await expect( + mutate({ + mutation: adminCreateContributionMessage, + variables: { + contributionId: -1, + message: 'Test', + }, + }), + ).resolves.toEqual( + expect.objectContaining({ + errors: [ + new GraphQLError( + 'ContributionMessage was not successful: Error: Contribution not found', + ), + ], + }), + ) + }) + }) + + describe('valid input', () => { + it('creates ContributionMessage', async () => { + await expect( + mutate({ + mutation: adminCreateContributionMessage, + variables: { + contributionId: result.data.createContribution.id, + message: 'Admin Test', + }, + }), + ).resolves.toEqual( + expect.objectContaining({ + data: { + adminCreateContributionMessage: expect.objectContaining({ + id: expect.any(Number), + message: 'Admin Test', + type: 'DIALOG', + userFirstName: 'Peter', + userLastName: 'Lustig', + }), + }, + }), + ) + }) + }) + }) + }) + describe('createContributionMessage', () => { describe('unauthenticated', () => { it('returns an error', async () => { @@ -44,10 +143,19 @@ describe('ContributionMessageResolver', () => { describe('authenticated', () => { beforeAll(async () => { await userFactory(testEnv, bibiBloxberg) + await userFactory(testEnv, peterLustig) await query({ query: login, variables: { email: 'bibi@bloxberg.de', password: 'Aa12345_' }, }) + result = await mutate({ + mutation: createContribution, + variables: { + amount: 100.0, + memo: 'Test env contribution', + creationDate: new Date().toString(), + }, + }) }) afterAll(async () => { @@ -75,6 +183,68 @@ describe('ContributionMessageResolver', () => { }), ) }) + + it('throws error when other user tries to send createContributionMessage', async () => { + await query({ + query: login, + variables: { email: 'peter@lustig.de', password: 'Aa12345_' }, + }) + await expect( + mutate({ + mutation: createContributionMessage, + variables: { + contributionId: result.data.createContribution.id, + message: 'Test', + }, + }), + ).resolves.toEqual( + expect.objectContaining({ + errors: [ + new GraphQLError( + 'ContributionMessage was not successful: Error: Can not send message to contribution of another user', + ), + ], + }), + ) + }) + }) + + describe('valid input', () => { + beforeAll(async () => { + await query({ + query: login, + variables: { email: 'bibi@bloxberg.de', password: 'Aa12345_' }, + }) + }) + + afterAll(async () => { + await cleanDB() + resetToken() + }) + + it('creates ContributionMessage', async () => { + await expect( + mutate({ + mutation: createContributionMessage, + variables: { + contributionId: result.data.createContribution.id, + message: 'Test', + }, + }), + ).resolves.toEqual( + expect.objectContaining({ + data: { + createContributionMessage: expect.objectContaining({ + id: expect.any(Number), + message: 'Test', + type: 'DIALOG', + userFirstName: 'Bibi', + userLastName: 'Bloxberg', + }), + }, + }), + ) + }) }) }) }) @@ -94,5 +264,84 @@ describe('ContributionMessageResolver', () => { ) }) }) + + describe('authenticated', () => { + beforeAll(async () => { + await userFactory(testEnv, bibiBloxberg) + await userFactory(testEnv, peterLustig) + await query({ + query: login, + variables: { email: 'bibi@bloxberg.de', password: 'Aa12345_' }, + }) + result = await mutate({ + mutation: createContribution, + variables: { + amount: 100.0, + memo: 'Test env contribution', + creationDate: new Date().toString(), + }, + }) + await query({ + query: login, + variables: { email: 'peter@lustig.de', password: 'Aa12345_' }, + }) + await mutate({ + mutation: adminCreateContributionMessage, + variables: { + contributionId: result.data.createContribution.id, + message: 'Admin Test', + }, + }) + await query({ + query: login, + variables: { email: 'bibi@bloxberg.de', password: 'Aa12345_' }, + }) + await mutate({ + mutation: createContributionMessage, + variables: { + contributionId: result.data.createContribution.id, + message: 'User Test', + }, + }) + }) + + afterAll(async () => { + await cleanDB() + resetToken() + }) + + it('returns a list of contributionmessages', async () => { + await expect( + mutate({ + mutation: listContributionMessages, + variables: { contributionId: result.data.createContribution.id }, + }), + ).resolves.toEqual( + expect.objectContaining({ + data: { + listContributionMessages: { + count: 2, + messages: expect.arrayContaining([ + expect.objectContaining({ + id: expect.any(Number), + message: 'Admin Test', + type: 'DIALOG', + userFirstName: 'Peter', + userLastName: 'Lustig', + }), + expect.objectContaining({ + id: expect.any(Number), + message: 'User Test', + type: 'DIALOG', + userFirstName: 'Bibi', + userLastName: 'Bloxberg', + }), + ]), + }, + }, + }), + ) + }) + }) }) })