From 5cac5d9cfbf44ee7be5c4cc73c37c30ad6492f68 Mon Sep 17 00:00:00 2001 From: Moriz Wahl Date: Mon, 16 May 2022 16:02:12 +0200 Subject: [PATCH] loggers are created only once, unify logger for unit tests --- backend/src/apis/HttpRequest.ts | 3 +- .../graphql/resolver/AdminResolver.test.ts | 24 -------------- .../src/graphql/resolver/BalanceResolver.ts | 4 +-- .../graphql/resolver/TransactionResolver.ts | 4 +-- .../src/graphql/resolver/UserResolver.test.ts | 33 ++----------------- backend/src/graphql/resolver/UserResolver.ts | 5 +-- backend/src/mailer/sendEMail.test.ts | 29 ++-------------- backend/src/mailer/sendEMail.ts | 4 +-- .../mailer/sendTransactionReceivedEmail.ts | 4 +-- backend/src/server/createServer.ts | 7 ++-- backend/src/server/logger.ts | 12 ++++--- backend/src/typeorm/DBVersion.ts | 5 +-- backend/test/testSetup.ts | 25 +++++++++++--- 13 files changed, 40 insertions(+), 119 deletions(-) diff --git a/backend/src/apis/HttpRequest.ts b/backend/src/apis/HttpRequest.ts index ea25da5ca..4039e3a98 100644 --- a/backend/src/apis/HttpRequest.ts +++ b/backend/src/apis/HttpRequest.ts @@ -1,7 +1,6 @@ import axios from 'axios' -import log4js from '@/server/logger' -const logger = log4js.getLogger('http') +import { backendLogger as logger } from '@/server/logger' // eslint-disable-next-line @typescript-eslint/no-explicit-any export const apiPost = async (url: string, payload: unknown): Promise => { diff --git a/backend/src/graphql/resolver/AdminResolver.test.ts b/backend/src/graphql/resolver/AdminResolver.test.ts index c0245cdfd..ca6bf0fe7 100644 --- a/backend/src/graphql/resolver/AdminResolver.test.ts +++ b/backend/src/graphql/resolver/AdminResolver.test.ts @@ -25,30 +25,6 @@ import { sendAccountActivationEmail } from '@/mailer/sendAccountActivationEmail' import Decimal from 'decimal.js-light' import { AdminPendingCreation } from '@entity/AdminPendingCreation' import { Transaction as DbTransaction } from '@entity/Transaction' -/* eslint-disable-next-line @typescript-eslint/no-unused-vars */ -import { logger } from './UserResolver' - -/* eslint-disable-next-line @typescript-eslint/no-unused-vars */ -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(), - } - }), - } -}) // mock account activation email to avoid console spam jest.mock('@/mailer/sendAccountActivationEmail', () => { diff --git a/backend/src/graphql/resolver/BalanceResolver.ts b/backend/src/graphql/resolver/BalanceResolver.ts index a7d873ba8..176b45354 100644 --- a/backend/src/graphql/resolver/BalanceResolver.ts +++ b/backend/src/graphql/resolver/BalanceResolver.ts @@ -1,4 +1,4 @@ -import { getLogger } from '@/server/logger' +import { backendLogger as logger } from '@/server/logger' import { Context, getUser } from '@/server/context' import { Resolver, Query, Ctx, Authorized } from 'type-graphql' @@ -12,8 +12,6 @@ import { TransactionLink as dbTransactionLink } from '@entity/TransactionLink' import { getCustomRepository } from '@dbTools/typeorm' import { TransactionLinkRepository } from '@repository/TransactionLink' -const logger = getLogger('backend') - @Resolver() export class BalanceResolver { @Authorized([RIGHTS.BALANCE]) diff --git a/backend/src/graphql/resolver/TransactionResolver.ts b/backend/src/graphql/resolver/TransactionResolver.ts index 456999d3c..023e5b2ff 100644 --- a/backend/src/graphql/resolver/TransactionResolver.ts +++ b/backend/src/graphql/resolver/TransactionResolver.ts @@ -1,7 +1,7 @@ /* eslint-disable new-cap */ /* eslint-disable @typescript-eslint/no-non-null-assertion */ -import { getLogger } from '@/server/logger' +import { backendLogger as logger } from '@/server/logger' import CONFIG from '@/config' import { Context, getUser } from '@/server/context' @@ -35,8 +35,6 @@ import Decimal from 'decimal.js-light' import { BalanceResolver } from './BalanceResolver' -const logger = getLogger('backend') - const MEMO_MAX_CHARS = 255 const MEMO_MIN_CHARS = 5 diff --git a/backend/src/graphql/resolver/UserResolver.test.ts b/backend/src/graphql/resolver/UserResolver.test.ts index 3cc1daf5a..1afce832b 100644 --- a/backend/src/graphql/resolver/UserResolver.test.ts +++ b/backend/src/graphql/resolver/UserResolver.test.ts @@ -12,28 +12,9 @@ import { User } from '@entity/User' import CONFIG from '@/config' import { sendAccountActivationEmail } from '@/mailer/sendAccountActivationEmail' import { sendResetPasswordEmail } from '@/mailer/sendResetPasswordEmail' -import { printTimeDuration, activationLink, logger } from './UserResolver' +import { printTimeDuration, activationLink } 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 { logger } from '@test/testSetup' // import { klicktippSignIn } from '@/apis/KlicktippController' @@ -77,16 +58,6 @@ afterAll(async () => { }) describe('UserResolver', () => { - describe('logger', () => { - it('creates a logger', () => { - expect(getLogger).toBeCalledWith('backend') - }) - - it('adds user context to logger', () => { - expect(logger.addContext).toBeCalledWith('user', 'unknown') - }) - }) - describe('createUser', () => { const variables = { email: 'peter@lustig.de', diff --git a/backend/src/graphql/resolver/UserResolver.ts b/backend/src/graphql/resolver/UserResolver.ts index c2415c9f5..7080ad68b 100644 --- a/backend/src/graphql/resolver/UserResolver.ts +++ b/backend/src/graphql/resolver/UserResolver.ts @@ -1,5 +1,5 @@ import fs from 'fs' -import { getLogger } from '@/server/logger' +import { backendLogger as logger } from '@/server/logger' import { Context, getUser } from '@/server/context' import { Resolver, Query, Args, Arg, Authorized, Ctx, UseMiddleware, Mutation } from 'type-graphql' @@ -28,9 +28,6 @@ const sodium = require('sodium-native') // eslint-disable-next-line @typescript-eslint/no-var-requires const random = require('random-bigint') -export const logger = getLogger('backend') -logger.addContext('user', 'unknown') - // We will reuse this for changePassword const isPassword = (password: string): boolean => { return !!password.match(/^(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?=.*[^a-zA-Z0-9 \\t\\n\\r]).{8,}$/) diff --git a/backend/src/mailer/sendEMail.test.ts b/backend/src/mailer/sendEMail.test.ts index b03a43357..8a13c027d 100644 --- a/backend/src/mailer/sendEMail.test.ts +++ b/backend/src/mailer/sendEMail.test.ts @@ -1,8 +1,8 @@ -import { sendEMail, logger } from './sendEMail' +import { sendEMail } from './sendEMail' import { createTransport } from 'nodemailer' import CONFIG from '@/config' -import { getLogger } from '@/server/logger' +import { logger } from '@test/testSetup' CONFIG.EMAIL = false CONFIG.EMAIL_SMTP_URL = 'EMAIL_SMTP_URL' @@ -10,25 +10,6 @@ CONFIG.EMAIL_SMTP_PORT = '1234' CONFIG.EMAIL_USERNAME = 'user' CONFIG.EMAIL_PASSWORD = 'pwd' -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(), - } - }), - } -}) - jest.mock('nodemailer', () => { return { __esModule: true, @@ -46,12 +27,6 @@ jest.mock('nodemailer', () => { describe('sendEMail', () => { let result: boolean - describe('logger', () => { - it('initializes the logger', () => { - expect(getLogger).toBeCalledWith('backend.mailer.sendEMail') - }) - }) - describe('config email is false', () => { beforeEach(async () => { result = await sendEMail({ diff --git a/backend/src/mailer/sendEMail.ts b/backend/src/mailer/sendEMail.ts index 222813426..640dd7f4c 100644 --- a/backend/src/mailer/sendEMail.ts +++ b/backend/src/mailer/sendEMail.ts @@ -1,10 +1,8 @@ -import { getLogger } from '@/server/logger' +import { backendLogger as logger } from '@/server/logger' import { createTransport } from 'nodemailer' import CONFIG from '@/config' -export const logger = getLogger('backend.mailer.sendEMail') - export const sendEMail = async (emailDef: { to: string subject: string diff --git a/backend/src/mailer/sendTransactionReceivedEmail.ts b/backend/src/mailer/sendTransactionReceivedEmail.ts index df4844ca4..692f92f9a 100644 --- a/backend/src/mailer/sendTransactionReceivedEmail.ts +++ b/backend/src/mailer/sendTransactionReceivedEmail.ts @@ -1,10 +1,8 @@ -import log4js from '@/server/logger' +import { backendLogger as logger } from '@/server/logger' import Decimal from 'decimal.js-light' import { sendEMail } from './sendEMail' import { transactionReceived } from './text/transactionReceived' -const logger = log4js.getLogger('backend.mailer.sendTransactionReceivedEmail') - export const sendTransactionReceivedEmail = (data: { senderFirstName: string senderLastName: string diff --git a/backend/src/server/createServer.ts b/backend/src/server/createServer.ts index 02fc5f899..a0b294281 100644 --- a/backend/src/server/createServer.ts +++ b/backend/src/server/createServer.ts @@ -22,7 +22,7 @@ import schema from '@/graphql/schema' import { elopageWebhook } from '@/webhook/elopage' import { Connection } from '@dbTools/typeorm' -import { getLogger } from './logger' +import { apolloLogger } from './logger' import { Logger } from 'log4js' // TODO implement @@ -30,14 +30,11 @@ import { Logger } from 'log4js' type ServerDef = { apollo: ApolloServer; app: Express; con: Connection } -const serverLogger = getLogger('apollo') - const createServer = async ( // eslint-disable-next-line @typescript-eslint/no-explicit-any context: any = serverContext, - logger: Logger = serverLogger, + logger: Logger = apolloLogger, ): Promise => { - logger.addContext('user', 'unknown') logger.debug('createServer...') // open mysql connection diff --git a/backend/src/server/logger.ts b/backend/src/server/logger.ts index b46628273..939d7eaba 100644 --- a/backend/src/server/logger.ts +++ b/backend/src/server/logger.ts @@ -1,4 +1,4 @@ -import log4js, { Logger } from 'log4js' +import log4js from 'log4js' import CONFIG from '@/config' import { readFileSync } from 'fs' @@ -9,8 +9,10 @@ options.categories.default.level = CONFIG.LOG_LEVEL log4js.configure(options) -export const getLogger = (name: string): Logger => { - return log4js.getLogger(name) -} +const apolloLogger = log4js.getLogger('apollo') +const backendLogger = log4js.getLogger('backend') -export default log4js +apolloLogger.addContext('user', 'unknown') +backendLogger.addContext('user', 'unknown') + +export { apolloLogger, backendLogger } diff --git a/backend/src/typeorm/DBVersion.ts b/backend/src/typeorm/DBVersion.ts index 94d17007a..cb53c49f1 100644 --- a/backend/src/typeorm/DBVersion.ts +++ b/backend/src/typeorm/DBVersion.ts @@ -1,8 +1,5 @@ import { Migration } from '@entity/Migration' -import log4js from '@/server/logger' - -const logger = log4js.getLogger('backend.DBVersion') -logger.addContext('user', 'unknown') +import { backendLogger as logger } from '@/server/logger' const getDBVersion = async (): Promise => { try { diff --git a/backend/test/testSetup.ts b/backend/test/testSetup.ts index d42836626..a43335e55 100644 --- a/backend/test/testSetup.ts +++ b/backend/test/testSetup.ts @@ -1,7 +1,22 @@ -/* eslint-disable no-console */ +import { backendLogger as logger } from '@/server/logger' -// disable console.info for apollo log - -// eslint-disable-next-line @typescript-eslint/no-empty-function -console.info = () => {} jest.setTimeout(1000000) + +jest.mock('@/server/logger', () => { + const originalModule = jest.requireActual('@/server/logger') + return { + __esModule: true, + ...originalModule, + backendLogger: { + addContext: jest.fn(), + trace: jest.fn(), + debug: jest.fn(), + warn: jest.fn(), + info: jest.fn(), + error: jest.fn(), + fatal: jest.fn(), + }, + } +}) + +export { logger }