From 33265fe00616ffdd9e770c1a2309367ded6f935b Mon Sep 17 00:00:00 2001 From: Claus-Peter Huebner Date: Tue, 24 Oct 2023 01:14:33 +0200 Subject: [PATCH] reinsert test classes --- federation/test/extensions.ts | 37 +++++++++++++++++++ federation/test/helpers.test.ts | 7 ++++ federation/test/helpers.ts | 63 +++++++++++++++++++++++++++++++++ federation/test/testSetup.ts | 41 +++++++++++++++++++++ 4 files changed, 148 insertions(+) create mode 100644 federation/test/extensions.ts create mode 100644 federation/test/helpers.test.ts create mode 100644 federation/test/helpers.ts create mode 100644 federation/test/testSetup.ts diff --git a/federation/test/extensions.ts b/federation/test/extensions.ts new file mode 100644 index 000000000..262a9bcdb --- /dev/null +++ b/federation/test/extensions.ts @@ -0,0 +1,37 @@ +/* eslint-disable @typescript-eslint/no-unsafe-call */ +/* eslint-disable @typescript-eslint/no-unsafe-member-access */ +/* eslint-disable @typescript-eslint/restrict-template-expressions */ +/* eslint-disable @typescript-eslint/no-empty-interface */ +/* eslint-disable @typescript-eslint/no-unsafe-argument */ + +import { Decimal } from 'decimal.js-light' + +expect.extend({ + decimalEqual(received, value) { + const pass = new Decimal(value).equals(received.toString()) + if (pass) { + return { + message: () => `expected ${received} to not equal ${value}`, + pass: true, + } + } else { + return { + message: () => `expected ${received} to equal ${value}`, + pass: false, + } + } + }, +}) + +interface CustomMatchers { + decimalEqual(value: number): R +} + +declare global { + // eslint-disable-next-line @typescript-eslint/no-namespace + namespace jest { + interface Expect extends CustomMatchers {} + interface Matchers extends CustomMatchers {} + interface InverseAsymmetricMatchers extends CustomMatchers {} + } +} diff --git a/federation/test/helpers.test.ts b/federation/test/helpers.test.ts new file mode 100644 index 000000000..69d8f3fa4 --- /dev/null +++ b/federation/test/helpers.test.ts @@ -0,0 +1,7 @@ +import { contributionDateFormatter } from '@test/helpers' + +describe('contributionDateFormatter', () => { + it('formats the date correctly', () => { + expect(contributionDateFormatter(new Date('Thu Feb 29 2024 13:12:11'))).toEqual('2/29/2024') + }) +}) diff --git a/federation/test/helpers.ts b/federation/test/helpers.ts new file mode 100644 index 000000000..8a541e3e4 --- /dev/null +++ b/federation/test/helpers.ts @@ -0,0 +1,63 @@ +/* eslint-disable @typescript-eslint/unbound-method */ +/* eslint-disable @typescript-eslint/no-unsafe-assignment */ +/* eslint-disable @typescript-eslint/no-unsafe-member-access */ +/* eslint-disable @typescript-eslint/no-explicit-any */ +/* eslint-disable @typescript-eslint/no-unsafe-call */ +/* eslint-disable @typescript-eslint/no-unsafe-return */ + +import { entities } from '@entity/index' +import { createTestClient } from 'apollo-server-testing' + +import { createServer } from '@/server/createServer' + +import { i18n, logger } from './testSetup' + +export const headerPushMock = jest.fn((t) => { + context.token = t.value +}) + +const context = { + token: '', + setHeaders: { + push: headerPushMock, + forEach: jest.fn(), + }, + clientTimezoneOffset: 0, +} + +export const cleanDB = async () => { + // this only works as long we do not have foreign key constraints + for (const entity of entities) { + await resetEntity(entity) + } +} + +export const testEnvironment = async (testLogger = logger, testI18n = i18n) => { + const server = await createServer(context, testLogger, testI18n) + const con = server.con + const testClient = createTestClient(server.apollo) + const mutate = testClient.mutate + const query = testClient.query + return { mutate, query, con } +} + +export const resetEntity = async (entity: any) => { + const items = await entity.find({ withDeleted: true }) + if (items.length > 0) { + const ids = items.map((e: any) => e.id) + await entity.delete(ids) + } +} + +export const resetToken = () => { + context.token = '' +} + +// format date string as it comes from the frontend for the contribution date +export const contributionDateFormatter = (date: Date): string => { + return `${date.getMonth() + 1}/${date.getDate()}/${date.getFullYear()}` +} + +export const setClientTimezoneOffset = (offset: number): void => { + context.clientTimezoneOffset = offset +} diff --git a/federation/test/testSetup.ts b/federation/test/testSetup.ts new file mode 100644 index 000000000..a61556798 --- /dev/null +++ b/federation/test/testSetup.ts @@ -0,0 +1,41 @@ +import { CONFIG } from '@/config' +import { i18n } from '@/server/localization' +import { backendLogger as logger } from '@/server/logger' + +CONFIG.EMAIL = true +CONFIG.EMAIL_TEST_MODUS = false + +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(), + }, + } +}) + +jest.mock('@/server/localization', () => { + const originalModule = jest.requireActual('@/server/localization') + return { + __esModule: true, + ...originalModule, + i18n: { + init: jest.fn(), + // configure: jest.fn(), + // __: jest.fn(), + // setLocale: jest.fn(), + }, + } +}) + +export { logger, i18n }