From ad8de559aa66698bb6ac4b1d0631780480c20086 Mon Sep 17 00:00:00 2001 From: Moriz Wahl Date: Wed, 27 Apr 2022 10:11:14 +0200 Subject: [PATCH] test unDelete User mutation --- .../graphql/resolver/AdminResolver.test.ts | 100 +++++++++++++++++- backend/src/graphql/resolver/AdminResolver.ts | 5 +- 2 files changed, 102 insertions(+), 3 deletions(-) diff --git a/backend/src/graphql/resolver/AdminResolver.test.ts b/backend/src/graphql/resolver/AdminResolver.test.ts index 4460030fe..91a9db770 100644 --- a/backend/src/graphql/resolver/AdminResolver.test.ts +++ b/backend/src/graphql/resolver/AdminResolver.test.ts @@ -5,7 +5,7 @@ import { testEnvironment, resetToken, cleanDB } from '@test/helpers' import { userFactory } from '@/seeds/factory/user' import { bibiBloxberg } from '@/seeds/users/bibi-bloxberg' import { peterLustig } from '@/seeds/users/peter-lustig' -import { deleteUser } from '@/seeds/graphql/mutations' +import { deleteUser, unDeleteUser } from '@/seeds/graphql/mutations' import { GraphQLError } from 'graphql' import { User } from '@entity/User' /* eslint-disable-next-line @typescript-eslint/no-unused-vars */ @@ -147,4 +147,102 @@ describe('AdminResolver', () => { }) }) }) + + describe('unDelete user', () => { + describe('unauthenticated', () => { + it('returns an error', async () => { + await expect(mutate({ mutation: unDeleteUser, variables: { userId: 1 } })).resolves.toEqual( + expect.objectContaining({ + errors: [new GraphQLError('401 Unauthorized')], + }), + ) + }) + }) + + describe('authenticated', () => { + describe('with user rights', () => { + beforeAll(async () => { + user = await userFactory(testEnv, bibiBloxberg) + await query({ + query: login, + variables: { email: 'bibi@bloxberg.de', password: 'Aa12345_' }, + }) + }) + + afterAll(async () => { + await cleanDB() + resetToken() + }) + + it('returns an error', async () => { + await expect( + mutate({ mutation: unDeleteUser, variables: { userId: user.id + 1 } }), + ).resolves.toEqual( + expect.objectContaining({ + errors: [new GraphQLError('401 Unauthorized')], + }), + ) + }) + }) + + describe('with admin rights', () => { + beforeAll(async () => { + admin = await userFactory(testEnv, peterLustig) + await query({ + query: login, + variables: { email: 'peter@lustig.de', password: 'Aa12345_' }, + }) + }) + + afterAll(async () => { + await cleanDB() + resetToken() + }) + + describe('user to undelete user does not exist', () => { + it('throws an error', async () => { + await expect( + mutate({ mutation: unDeleteUser, variables: { userId: admin.id + 1 } }), + ).resolves.toEqual( + expect.objectContaining({ + errors: [new GraphQLError(`Could not find user with userId: ${admin.id + 1}`)], + }), + ) + }) + }) + + describe('user to undelete is not deleted', () => { + beforeAll(async () => { + user = await userFactory(testEnv, bibiBloxberg) + }) + + it('throws an error', async () => { + await expect( + mutate({ mutation: unDeleteUser, variables: { userId: user.id } }), + ).resolves.toEqual( + expect.objectContaining({ + errors: [new GraphQLError('User already deleted')], + }), + ) + }) + + describe('undelete deleted user', () => { + beforeAll(async () => { + await mutate({ mutation: deleteUser, variables: { userId: user.id } }) + }) + + it('returns null', async () => { + await expect( + mutate({ mutation: unDeleteUser, variables: { userId: user.id } }), + ).resolves.toEqual( + expect.objectContaining({ + data: { unDeleteUser: null }, + }), + ) + }) + }) + }) + }) + }) + }) }) diff --git a/backend/src/graphql/resolver/AdminResolver.ts b/backend/src/graphql/resolver/AdminResolver.ts index 2009af3b0..757b6d6dd 100644 --- a/backend/src/graphql/resolver/AdminResolver.ts +++ b/backend/src/graphql/resolver/AdminResolver.ts @@ -157,11 +157,12 @@ export class AdminResolver { @Mutation(() => Date, { nullable: true }) async unDeleteUser(@Arg('userId', () => Int) userId: number): Promise { const user = await dbUser.findOne({ id: userId }, { withDeleted: true }) - // user exists ? if (!user) { throw new Error(`Could not find user with userId: ${userId}`) } - // recover user account + if (!user.deletedAt) { + throw new Error('User already deleted') + } await user.recover() return null }