diff --git a/backend/src/graphql/resolver/UserResolver.test.ts b/backend/src/graphql/resolver/UserResolver.test.ts index c658476a4..67edceb59 100644 --- a/backend/src/graphql/resolver/UserResolver.test.ts +++ b/backend/src/graphql/resolver/UserResolver.test.ts @@ -12,7 +12,28 @@ import { User } from '@entity/User' import CONFIG from '@/config' import { sendAccountActivationEmail } from '@/mailer/sendAccountActivationEmail' import { sendResetPasswordEmail } from '@/mailer/sendResetPasswordEmail' -import { printTimeDuration, activationLink } from './UserResolver' +import { printTimeDuration, activationLink, logger } from './UserResolver' + +import { getLogger } from '@/server/logger' + +jest.mock('@/server/logger', () => { + const originalModule = jest.requireActual('@/server/logger') + return { + __esModule: true, + ...originalModule, + getLogger: jest.fn(() => { + return { + addContext: jest.fn(), + trace: jest.fn(), + debug: jest.fn(), + warn: jest.fn(), + info: jest.fn(), + error: jest.fn(), + fatal: jest.fn(), + } + }), + } +}) // import { klicktippSignIn } from '@/apis/KlicktippController' @@ -56,6 +77,16 @@ afterAll(async () => { }) describe('UserResolver', () => { + describe('logger', () => { + it('creates a logger', () => { + expect(getLogger).toBeCalledWith('backend.graphql.resolver.UserResolver') + }) + + it('adds user context to logger', () => { + expect(logger.addContext).toBeCalledWith('user', 'unknown') + }) + }) + describe('createUser', () => { const variables = { email: 'peter@lustig.de', @@ -149,12 +180,14 @@ describe('UserResolver', () => { }) describe('email already exists', () => { - it('throws an error', async () => { - await expect(mutate({ mutation: createUser, variables })).resolves.toEqual( + it('throws and logs an error', async () => { + const mutation = await mutate({ mutation: createUser, variables }) + expect(mutation).toEqual( expect.objectContaining({ errors: [new GraphQLError('User already exists.')], }), ) + expect(logger.error).toBeCalledWith('User already exists with this email=peter@lustig.de') }) }) diff --git a/backend/src/graphql/resolver/UserResolver.ts b/backend/src/graphql/resolver/UserResolver.ts index df6e1a715..9ad908111 100644 --- a/backend/src/graphql/resolver/UserResolver.ts +++ b/backend/src/graphql/resolver/UserResolver.ts @@ -1,5 +1,5 @@ import fs from 'fs' -import log4js from '@/server/logger' +import { getLogger } from '@/server/logger' import { Context, getUser } from '@/server/context' import { Resolver, Query, Args, Arg, Authorized, Ctx, UseMiddleware, Mutation } from 'type-graphql' @@ -28,7 +28,7 @@ const sodium = require('sodium-native') // eslint-disable-next-line @typescript-eslint/no-var-requires const random = require('random-bigint') -const logger = log4js.getLogger('backend.graphql.resolver.UserResolver') +export const logger = getLogger('backend.graphql.resolver.UserResolver') logger.addContext('user', 'unknown') // We will reuse this for changePassword diff --git a/backend/src/server/logger.ts b/backend/src/server/logger.ts index 057c55307..dc0fd8602 100644 --- a/backend/src/server/logger.ts +++ b/backend/src/server/logger.ts @@ -1,6 +1,10 @@ -import log4js from 'log4js' +import log4js, { Logger } from 'log4js' import CONFIG from '@/config' log4js.configure(CONFIG.LOG4JS_CONFIG) +export const getLogger = (name: string): Logger => { + return log4js.getLogger(name) +} + export default log4js