From b310a474144bd55249f1b5c94d76387af8b3eaf3 Mon Sep 17 00:00:00 2001 From: Jakub Otto <227225@student.uek.krakow.pl> Date: Wed, 2 Oct 2024 17:38:42 +0200 Subject: [PATCH 1/2] feat: add pipelines for tests --- .github/workflows/unit-e2e-tests.yml | 52 ++++++++++++++++++++++++++++ package.json | 9 +++-- src/app.controller.ts | 9 +++++ src/app.module.spec.ts | 25 +++++++++++++ src/app.module.ts | 11 +++--- test/app.e2e-spec.ts | 4 +++ 6 files changed, 100 insertions(+), 10 deletions(-) create mode 100644 .github/workflows/unit-e2e-tests.yml create mode 100644 src/app.controller.ts create mode 100644 src/app.module.spec.ts diff --git a/.github/workflows/unit-e2e-tests.yml b/.github/workflows/unit-e2e-tests.yml new file mode 100644 index 0000000..8a13bd2 --- /dev/null +++ b/.github/workflows/unit-e2e-tests.yml @@ -0,0 +1,52 @@ +name: CI Pipeline - Tests Only + +on: + push: + branches: + - '**' + - '!develop' + pull_request: + branches: + - '**' + +jobs: + test: + runs-on: ubuntu-latest + + services: + mongodb: + image: mongo:latest + ports: + - 27017:27017 + + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Set up Node.js for tests + uses: actions/setup-node@v3 + with: + node-version: '21' + + - name: Install dependencies + run: npm ci + + - name: Run unit tests + env: + MONGODB_HOST: localhost + MONGODB_PORT: 27017 + MONGODB_DATABASE: dev + MONGODB_USER: root + MONGODB_PASSWORD: dev + MONGO_URI: mongodb://root:dev@localhost:27017/dev + run: npm run test + + - name: Run e2e tests + env: + MONGODB_HOST: localhost + MONGODB_PORT: 27017 + MONGODB_DATABASE: dev + MONGODB_USER: root + MONGODB_PASSWORD: dev + MONGO_URI: mongodb://root:dev@localhost:27017/dev + run: npm run test:e2e diff --git a/package.json b/package.json index 8d64a13..2f11b0d 100644 --- a/package.json +++ b/package.json @@ -10,7 +10,7 @@ "check-branch-name": "chmod 755 ./.husky/hooks/check-branch-naming.sh && sh ./.husky/hooks/check-branch-naming.sh", "format": "prettier --write \"{src,test}/**/*.ts\" \"test/**/*.ts\"", "lint": "eslint \"{src,test}/**/*.ts\" --fix", - "prepare": "husky", + "prepare": "if [ \"$NODE_ENV\" != \"production\" ]; then husky install; fi", "prepare:dev": "docker-compose -f docker/docker-compose.yml up -d", "start": "nest start", "start:debug": "nest start --debug --watch", @@ -19,11 +19,10 @@ "test": "jest", "test:cov": "jest --coverage", "test:debug": "node --inspect-brk -r tsconfig-paths/register -r ts-node/register node_modules/.bin/jest --runInBand", - "test:e2e": "jest --config ./test/jest-e2e.json", + "test:e2e": "jest --config ./test/jest-e2e.json --detectOpenHandles", "test:watch": "jest --watch" }, "dependencies": { - "@nestjs/cli": "^10.4.2", "@nestjs/common": "^10.3.10", "@nestjs/config": "^3.2.3", "@nestjs/core": "^10.3.10", @@ -36,14 +35,14 @@ "class-transformer": "^0.5.1", "class-validator": "^0.14.1", "dotenv": "^16.4.5", - "mongoose": "^8.5.1", + "mongoose": "^8.7.0", "reflect-metadata": "^0.2.2", "rxjs": "^7.8.1", "uuid": "^10.0.0" }, "devDependencies": { "@eslint/js": "^9.7.0", - "@nestjs/cli": "^10.4.2", + "@nestjs/cli": "^10.4.5", "@nestjs/schematics": "^10.1.2", "@nestjs/testing": "^10.3.10", "@types/eslint__js": "^8.42.3", diff --git a/src/app.controller.ts b/src/app.controller.ts new file mode 100644 index 0000000..823401e --- /dev/null +++ b/src/app.controller.ts @@ -0,0 +1,9 @@ +import { Controller, Get } from '@nestjs/common'; + +@Controller('/') +export class AppController { + @Get() + getHello(): string { + return 'Hello i::team!'; + } +} diff --git a/src/app.module.spec.ts b/src/app.module.spec.ts new file mode 100644 index 0000000..0720f43 --- /dev/null +++ b/src/app.module.spec.ts @@ -0,0 +1,25 @@ +import { Test, TestingModule } from '@nestjs/testing'; +import { AppModule } from './app.module'; +import { INestApplication } from '@nestjs/common'; + +describe('AppModule', () => { + let appModule: TestingModule; + let app: INestApplication; + + beforeAll(async () => { + appModule = await Test.createTestingModule({ + imports: [AppModule], + }).compile(); + + app = appModule.createNestApplication(); + await app.init(); + }); + + it('should compile the module', () => { + expect(appModule).toBeDefined(); + }); + + afterAll(async () => { + await app.close(); + }); +}); diff --git a/src/app.module.ts b/src/app.module.ts index e191452..803f55c 100644 --- a/src/app.module.ts +++ b/src/app.module.ts @@ -1,7 +1,7 @@ import { Module } from '@nestjs/common'; import { ConfigModule, ConfigService } from '@nestjs/config'; import { MongooseModule } from '@nestjs/mongoose'; -import { getMongoConnectionString } from './libs'; +import { AppController } from './app.controller'; @Module({ imports: [ @@ -12,12 +12,13 @@ import { getMongoConnectionString } from './libs'; MongooseModule.forRootAsync({ imports: [ConfigModule], inject: [ConfigService], - useFactory: async (configService: ConfigService) => ({ - uri: getMongoConnectionString(configService), - }), + useFactory: async (configService: ConfigService) => { + const uri = `mongodb://${configService.get('MONGODB_HOST')}:${configService.get('MONGODB_PORT')}/${configService.get('MONGODB_DATABASE')}`; + return { uri }; + }, }), ], - controllers: [], + controllers: [AppController], providers: [], }) export class AppModule {} diff --git a/test/app.e2e-spec.ts b/test/app.e2e-spec.ts index 088cb28..6ee330c 100644 --- a/test/app.e2e-spec.ts +++ b/test/app.e2e-spec.ts @@ -15,6 +15,10 @@ describe('AppController (e2e)', () => { await app.init(); }); + afterAll(async () => { + await app.close(); + }); + it('/ (GET)', () => { return request(app.getHttpServer()) .get('/') From caabde531e68543fd758912d15f0f8b9e0cd249e Mon Sep 17 00:00:00 2001 From: Jakub Otto <227225@student.uek.krakow.pl> Date: Wed, 2 Oct 2024 17:42:26 +0200 Subject: [PATCH 2/2] fix: tests failed due to package.json --- package-lock.json | 60 ++++++++++++++++++----------------------------- 1 file changed, 23 insertions(+), 37 deletions(-) diff --git a/package-lock.json b/package-lock.json index 79bb0c6..f6a40c0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,7 +9,6 @@ "version": "0.0.1", "license": "UNLICENSED", "dependencies": { - "@nestjs/cli": "^10.4.2", "@nestjs/common": "^10.3.10", "@nestjs/config": "^3.2.3", "@nestjs/core": "^10.3.10", @@ -22,14 +21,14 @@ "class-transformer": "^0.5.1", "class-validator": "^0.14.1", "dotenv": "^16.4.5", - "mongoose": "^8.5.1", + "mongoose": "^8.7.0", "reflect-metadata": "^0.2.2", "rxjs": "^7.8.1", "uuid": "^10.0.0" }, "devDependencies": { "@eslint/js": "^9.7.0", - "@nestjs/cli": "^10.4.2", + "@nestjs/cli": "^10.4.5", "@nestjs/schematics": "^10.1.2", "@nestjs/testing": "^10.3.10", "@types/eslint__js": "^8.42.3", @@ -2471,17 +2470,17 @@ } }, "node_modules/@mongodb-js/saslprep": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/@mongodb-js/saslprep/-/saslprep-1.1.8.tgz", - "integrity": "sha512-qKwC/M/nNNaKUBMQ0nuzm47b7ZYWQHN3pcXq4IIcoSBc2hOIrflAxJduIvvqmhoz3gR2TacTAs8vlsCVPkiEdQ==", + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/@mongodb-js/saslprep/-/saslprep-1.1.9.tgz", + "integrity": "sha512-tVkljjeEaAhCqTzajSdgbQ6gE6f3oneVwa3iXR6csiEwXXOFsiC6Uh9iAjAhXPtqa/XMDHWjjeNH/77m/Yq2dw==", "dependencies": { "sparse-bitfield": "^3.0.3" } }, "node_modules/@nestjs/cli": { - "version": "10.4.2", - "resolved": "https://registry.npmjs.org/@nestjs/cli/-/cli-10.4.2.tgz", - "integrity": "sha512-fQexIfLHfp6GUgX+CO4fOg+AEwV5ox/LHotQhyZi9wXUQDyIqS0NTTbumr//62EcX35qV4nU0359nYnuEdzG+A==", + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/@nestjs/cli/-/cli-10.4.5.tgz", + "integrity": "sha512-FP7Rh13u8aJbHe+zZ7hM0CC4785g9Pw4lz4r2TTgRtf0zTxSWMkJaPEwyjX8SK9oWK2GsYxl+fKpwVZNbmnj9A==", "dev": true, "dependencies": { "@angular-devkit/core": "17.3.8", @@ -2501,7 +2500,7 @@ "tsconfig-paths": "4.2.0", "tsconfig-paths-webpack-plugin": "4.1.0", "typescript": "5.3.3", - "webpack": "5.92.1", + "webpack": "5.94.0", "webpack-node-externals": "3.0.0" }, "bin": { @@ -2933,17 +2932,6 @@ "@types/eslint": "*" } }, - "node_modules/@types/eslint-scope": { - "version": "3.7.7", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", - "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/eslint": "*", - "@types/estree": "*" - } - }, "node_modules/@types/estree": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", @@ -5509,11 +5497,10 @@ } }, "node_modules/enhanced-resolve": { - "version": "5.17.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.0.tgz", - "integrity": "sha512-dwDPwZL0dmye8Txp2gzFmA6sxALaSvdRDjPH0viLcKrtlOL3tw62nWWweVD1SdILDTJrbrL6tdWVN58Wo6U3eA==", + "version": "5.17.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz", + "integrity": "sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==", "dev": true, - "license": "MIT", "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.2.0" @@ -10408,9 +10395,9 @@ } }, "node_modules/mongodb": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-6.7.0.tgz", - "integrity": "sha512-TMKyHdtMcO0fYBNORiYdmM25ijsHs+Njs963r4Tro4OQZzqYigAzYQouwWRg4OIaiLRUEGUh/1UAcH5lxdSLIA==", + "version": "6.9.0", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-6.9.0.tgz", + "integrity": "sha512-UMopBVx1LmEUbW/QE0Hw18u583PEDVQmUmVzzBRH0o/xtE9DBRA5ZYLOjpLIa03i8FXjzvQECJcqoMvCXftTUA==", "dependencies": { "@mongodb-js/saslprep": "^1.1.5", "bson": "^6.7.0", @@ -10493,13 +10480,13 @@ } }, "node_modules/mongoose": { - "version": "8.5.1", - "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-8.5.1.tgz", - "integrity": "sha512-OhVcwVl91A1G6+XpjDcpkGP7l7ikZkxa0DylX7NT/lcEqAjggzSdqDxb48A+xsDxqNAr0ntSJ1yiE3+KJTOd5Q==", + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-8.7.0.tgz", + "integrity": "sha512-rUCSF1mMYQXjXYdqEQLLlMD3xbcj2j1/hRn+9VnVj7ipzru/UoUZxlj/hWmteKMAh4EFnDZ+BIrmma9l/0Hi1g==", "dependencies": { "bson": "^6.7.0", "kareem": "2.6.3", - "mongodb": "6.7.0", + "mongodb": "6.9.0", "mpath": "0.9.0", "mquery": "5.0.0", "ms": "2.1.3", @@ -13580,12 +13567,11 @@ "license": "BSD-2-Clause" }, "node_modules/webpack": { - "version": "5.92.1", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.92.1.tgz", - "integrity": "sha512-JECQ7IwJb+7fgUFBlrJzbyu3GEuNBcdqr1LD7IbSzwkSmIevTm8PF+wej3Oxuz/JFBUZ6O1o43zsPkwm1C4TmA==", + "version": "5.94.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.94.0.tgz", + "integrity": "sha512-KcsGn50VT+06JH/iunZJedYGUJS5FGjow8wb9c0v5n1Om8O1g4L6LjtfxwlXIATopoQu+vOXXa7gYisWxCoPyg==", "dev": true, "dependencies": { - "@types/eslint-scope": "^3.7.3", "@types/estree": "^1.0.5", "@webassemblyjs/ast": "^1.12.1", "@webassemblyjs/wasm-edit": "^1.12.1", @@ -13594,7 +13580,7 @@ "acorn-import-attributes": "^1.9.5", "browserslist": "^4.21.10", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.17.0", + "enhanced-resolve": "^5.17.1", "es-module-lexer": "^1.2.1", "eslint-scope": "5.1.1", "events": "^3.2.0",