diff --git a/apps/triggers/jest.config.ts b/apps/triggers/jest.config.ts new file mode 100644 index 0000000..44688c2 --- /dev/null +++ b/apps/triggers/jest.config.ts @@ -0,0 +1,46 @@ +import { Config } from 'jest'; + +const config: Config = { + moduleFileExtensions: ['js', 'json', 'ts'], + rootDir: '.', + testRegex: '.*\\.spec\\.ts$', + transform: { + '^.+\\.(t|j)s$': [ + 'ts-jest', + { + tsconfig: { + module: 'commonjs', + esModuleInterop: true, + allowSyntheticDefaultImports: true, + }, + }, + ], + }, + testEnvironment: 'node', + setupFilesAfterEnv: ['/jest.setup.ts'], + collectCoverageFrom: [ + '**/*.(t|j)s', + '!**/*.spec.ts', + '!**/node_modules/**', + '!**/dist/**', + ], + transformIgnorePatterns: [ + 'node_modules/(?!(.*/)?(msgpackr|msgpackr-extract|bull|uuid)(/|$))', + ], + moduleNameMapper: { + '^src/(.*)$': '/src/$1', + '^@/(.*)$': '/src/$1', + '^@lib/database$': '/../../packages/database/dist/index.js', + '^@lib/database/(.*)$': '/../../packages/database/dist/$1', + '^@lib/core$': '/../../packages/core/dist/index.js', + '^@lib/core/(.*)$': '/../../packages/core/dist/$1', + '^@lib/dhm-adapter$': '/../../packages/dhm-adapter/dist/index.js', + '^@lib/dhm-adapter/(.*)$': '/../../packages/dhm-adapter/dist/$1', + '^@lib/glofas-adapter$': + '/../../packages/glofas-adapter/dist/index.js', + '^@lib/glofas-adapter/(.*)$': + '/../../packages/glofas-adapter/dist/$1', + }, +}; + +export default config; diff --git a/apps/triggers/jest.setup.ts b/apps/triggers/jest.setup.ts new file mode 100644 index 0000000..980e172 --- /dev/null +++ b/apps/triggers/jest.setup.ts @@ -0,0 +1,42 @@ +import { ReadableStream } from 'stream/web'; +import { Blob } from 'buffer'; +import { MessageChannel } from 'worker_threads'; + +if (typeof globalThis.ReadableStream === 'undefined') { + globalThis.ReadableStream = ReadableStream as any; +} + +if (typeof globalThis.Blob === 'undefined') { + globalThis.Blob = Blob as any; +} + +if (typeof globalThis.File === 'undefined') { + globalThis.File = class File extends Blob { + name: string; + lastModified: number; + + constructor( + chunks: any[], + name: string, + options?: { lastModified?: number; type?: string }, + ) { + super(chunks, options); + this.name = name; + this.lastModified = options?.lastModified ?? Date.now(); + } + } as any; +} + +if (typeof globalThis.MessagePort === 'undefined') { + const { port1 } = new MessageChannel(); + globalThis.MessagePort = port1.constructor as any; +} + +if (typeof globalThis.DOMException === 'undefined') { + globalThis.DOMException = class DOMException extends Error { + constructor(message?: string, name?: string) { + super(message); + this.name = name || 'DOMException'; + } + } as any; +} diff --git a/apps/triggers/package.json b/apps/triggers/package.json index 591e2bd..9b267a0 100644 --- a/apps/triggers/package.json +++ b/apps/triggers/package.json @@ -79,25 +79,5 @@ "ts-jest": "^29.2.5", "tsconfig-paths": "^4.2.0" }, - "jest": { - "moduleFileExtensions": [ - "js", - "json", - "ts" - ], - "rootDir": "src", - "testRegex": ".*\\.spec\\.ts$", - "transform": { - "^.+\\.(t|j)s$": "ts-jest" - }, - "collectCoverageFrom": [ - "**/*.(t|j)s" - ], - "coverageDirectory": "../coverage", - "testEnvironment": "node", - "moduleNameMapper": { - "^src/(.*)$": "/$1" - } - }, "packageManager": "pnpm@8.14.1" } diff --git a/apps/triggers/src/app.controller.spec.ts b/apps/triggers/src/app.controller.spec.ts index d22f389..5f5fde0 100644 --- a/apps/triggers/src/app.controller.spec.ts +++ b/apps/triggers/src/app.controller.spec.ts @@ -1,14 +1,25 @@ import { Test, TestingModule } from '@nestjs/testing'; +import { SettingsService } from '@lib/core'; import { AppController } from './app.controller'; import { AppService } from './app.service'; describe('AppController', () => { let appController: AppController; + const mockSettingsService = { + getPublic: jest.fn(), + }; + beforeEach(async () => { const app: TestingModule = await Test.createTestingModule({ controllers: [AppController], - providers: [AppService], + providers: [ + AppService, + { + provide: SettingsService, + useValue: mockSettingsService, + }, + ], }).compile(); appController = app.get(AppController); diff --git a/apps/triggers/src/phases/phases.service.spec.ts b/apps/triggers/src/phases/phases.service.spec.ts index ce28280..f320381 100644 --- a/apps/triggers/src/phases/phases.service.spec.ts +++ b/apps/triggers/src/phases/phases.service.spec.ts @@ -7,7 +7,12 @@ jest.mock('cheerio', () => ({ import { Test, TestingModule } from '@nestjs/testing'; import { ClientProxy, RpcException } from '@nestjs/microservices'; import { EventEmitter2 } from '@nestjs/event-emitter'; -import { PrismaService } from '@lib/database'; +import { + PrismaService, + ActivityStatus, + DataSource, + Phases, +} from '@lib/database'; import type { Queue } from 'bull'; import { BadRequestException } from '@nestjs/common'; import { PhasesService } from './phases.service'; @@ -20,7 +25,6 @@ import { GetPhaseByName, ConfigureThresholdPhaseDto, } from './dto'; -import { ActivityStatus, DataSource, Phases } from '@prisma/client'; import { of } from 'rxjs'; describe('PhasesService', () => { diff --git a/apps/triggers/src/processors/schedule.processor.spec.ts b/apps/triggers/src/processors/schedule.processor.spec.ts index 9c5fa9b..d09b852 100644 --- a/apps/triggers/src/processors/schedule.processor.spec.ts +++ b/apps/triggers/src/processors/schedule.processor.spec.ts @@ -3,8 +3,7 @@ import type { Job } from 'bull'; import { ScheduleProcessor } from './schedule.processor'; import { DhmService } from '../sources-data/dhm.service'; import { GlofasService } from '../sources-data/glofas.service'; -import { BQUEUE, JOBS } from '../constant'; -import { DataSource } from '@prisma/client'; +import { DataSource } from '@lib/database'; import { AddTriggerStatementDto } from '../sources-data/dto'; describe('ScheduleProcessor', () => { diff --git a/apps/triggers/src/processors/trigger.processor.spec.ts b/apps/triggers/src/processors/trigger.processor.spec.ts index 375d44f..3c29760 100644 --- a/apps/triggers/src/processors/trigger.processor.spec.ts +++ b/apps/triggers/src/processors/trigger.processor.spec.ts @@ -2,8 +2,7 @@ import { Test, TestingModule } from '@nestjs/testing'; import type { Job } from 'bull'; import { TriggerProcessor } from './trigger.processor'; import { PhasesService } from '../phases/phases.service'; -import { BQUEUE, JOBS } from '../constant'; -import { DataSource } from '@prisma/client'; +import { DataSource } from '@lib/database'; describe('TriggerProcessor', () => { let processor: TriggerProcessor; diff --git a/apps/triggers/src/sources-data/dto/get-source-data.spec.ts b/apps/triggers/src/sources-data/dto/get-source-data.spec.ts index f71af4d..7274c34 100644 --- a/apps/triggers/src/sources-data/dto/get-source-data.spec.ts +++ b/apps/triggers/src/sources-data/dto/get-source-data.spec.ts @@ -1,6 +1,6 @@ import { validate } from 'class-validator'; import { GetSouceDataDto, SourceDataType } from './get-source-data'; -import { DataSource } from '@prisma/client'; +import { DataSource } from '@lib/database'; describe('GetSouceDataDto', () => { it('should be defined', () => { diff --git a/apps/triggers/src/sources-data/glofas.service.spec.ts b/apps/triggers/src/sources-data/glofas.service.spec.ts index 4288df3..2b104ae 100644 --- a/apps/triggers/src/sources-data/glofas.service.spec.ts +++ b/apps/triggers/src/sources-data/glofas.service.spec.ts @@ -10,6 +10,7 @@ import { SourcesDataService } from './sources-data.service'; import { of } from 'rxjs'; jest.mock('@lib/database', () => ({ + ...jest.requireActual('@lib/database'), SettingsService: { get: jest.fn().mockImplementation((key) => { if (key === 'DATASOURCE.GLOFAS') { diff --git a/apps/triggers/src/stats/stat.module.spec.ts b/apps/triggers/src/stats/stat.module.spec.ts index becc43d..4ff8728 100644 --- a/apps/triggers/src/stats/stat.module.spec.ts +++ b/apps/triggers/src/stats/stat.module.spec.ts @@ -1,5 +1,6 @@ import { Test, TestingModule } from '@nestjs/testing'; -import { PrismaService } from '@lib/database'; +import { ConfigModule } from '@nestjs/config'; +import { PrismaModule, PrismaService } from '@lib/database'; import { ActivityService } from 'src/activity/activity.service'; import { StatsModule } from './stat.module'; import { StatsService } from './stat.service'; @@ -20,7 +21,13 @@ describe('StatsModule', () => { beforeEach(async () => { module = await Test.createTestingModule({ - imports: [StatsModule], + imports: [ + ConfigModule.forRoot({ isGlobal: true }), + PrismaModule.forRootWithConfig({ + isGlobal: true, + }), + StatsModule, + ], }) .overrideProvider(PrismaService) .useValue(mockPrismaService) diff --git a/apps/triggers/src/trigger-history/trigger-history.module.spec.ts b/apps/triggers/src/trigger-history/trigger-history.module.spec.ts index 4224ec1..a07995b 100644 --- a/apps/triggers/src/trigger-history/trigger-history.module.spec.ts +++ b/apps/triggers/src/trigger-history/trigger-history.module.spec.ts @@ -2,13 +2,25 @@ import { Test, TestingModule } from '@nestjs/testing'; import { TriggerHistoryModule } from './trigger-history.module'; import { TriggerHistoryController } from './trigger-history.controller'; import { TriggerHistoryService } from './trigger-history.service'; -import { PrismaService } from '@lib/database'; +import { PrismaModule, PrismaService } from '@lib/database'; +import { ConfigModule } from '@nestjs/config'; describe('TriggerHistoryModule', () => { let triggerHistoryModule: TriggerHistoryModule; beforeEach(async () => { - triggerHistoryModule = new TriggerHistoryModule(); + triggerHistoryModule = await Test.createTestingModule({ + imports: [ + ConfigModule.forRoot({ isGlobal: true }), + PrismaModule.forRootWithConfig({ + isGlobal: true, + }), + TriggerHistoryModule, + ], + }) + .overrideProvider(PrismaService) + .useValue({}) + .compile(); }); it('should be defined', () => { diff --git a/apps/triggers/src/trigger/trigger.service.spec.ts b/apps/triggers/src/trigger/trigger.service.spec.ts index 5a972b8..f20787a 100644 --- a/apps/triggers/src/trigger/trigger.service.spec.ts +++ b/apps/triggers/src/trigger/trigger.service.spec.ts @@ -10,8 +10,8 @@ import { CreateTriggerDto, GetTriggersDto, UpdateTriggerDto } from './dto'; import { EventEmitter2 } from '@nestjs/event-emitter'; // Mock the paginator function -jest.mock('@rumsan/prisma', () => ({ - ...jest.requireActual('@rumsan/prisma'), +jest.mock('@lib/database', () => ({ + ...jest.requireActual('@lib/database'), paginator: () => jest.fn(), })); diff --git a/package.json b/package.json index 875e8c6..34c9266 100644 --- a/package.json +++ b/package.json @@ -6,6 +6,8 @@ "dev": "turbo run dev", "lint": "turbo run lint", "format": "prettier --write \"**/*.{ts,tsx,md}\"", + "test": "turbo run test", + "test:watch": "turbo run test:watch", "check-types": "turbo run check-types", "clean": "find . -name 'node_modules' -type d -prune -exec rm -rf '{}' + && find . -name 'dist' -exec rm -rf '{}' + && find . -name '.turbo' -exec rm -rf '{}' + && find . -name '.log' -exec rm -rf '{}' +" }, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 263f321..71a982b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -196,6 +196,9 @@ importers: '@lib/glofas-adapter': specifier: workspace:* version: link:../../packages/glofas-adapter + '@nestjs/event-emitter': + specifier: 3.0.0 + version: 3.0.0(@nestjs/common@10.4.20)(@nestjs/core@10.4.20) '@nestjs/mapped-types': specifier: '*' version: 2.1.0(@nestjs/common@10.4.20)(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.1.14) diff --git a/turbo.json b/turbo.json index 14e6c5f..a9d8656 100644 --- a/turbo.json +++ b/turbo.json @@ -32,6 +32,11 @@ }, "db:format": { "cache": false + }, + "test": {}, + "test:watch": { + "cache": false, + "persistent": true } } }