From 6531f8fe607f3dfab059b73a4e356e185003fbf4 Mon Sep 17 00:00:00 2001 From: temz Date: Fri, 16 Jun 2023 11:59:17 +0700 Subject: [PATCH] feat: add e2e app and configure jest --- README.md | 4 ++ apps/api-e2e/.eslintrc.json | 10 +++ apps/api-e2e/jest.config.ts | 18 ++++++ apps/api-e2e/project.json | 22 +++++++ apps/api-e2e/src/api/api.spec.ts | 10 +++ apps/api-e2e/src/support/global-setup.ts | 8 +++ apps/api-e2e/src/support/global-teardown.ts | 7 ++ apps/api-e2e/src/support/test-setup.ts | 10 +++ apps/api-e2e/tsconfig.json | 13 ++++ apps/api-e2e/tsconfig.spec.json | 9 +++ apps/api/jest.config.ts | 1 - jest.preset.js | 6 ++ package-lock.json | 71 ++++++++++----------- package.json | 1 + 14 files changed, 150 insertions(+), 40 deletions(-) create mode 100644 apps/api-e2e/.eslintrc.json create mode 100644 apps/api-e2e/jest.config.ts create mode 100644 apps/api-e2e/project.json create mode 100644 apps/api-e2e/src/api/api.spec.ts create mode 100644 apps/api-e2e/src/support/global-setup.ts create mode 100644 apps/api-e2e/src/support/global-teardown.ts create mode 100644 apps/api-e2e/src/support/test-setup.ts create mode 100644 apps/api-e2e/tsconfig.json create mode 100644 apps/api-e2e/tsconfig.spec.json diff --git a/README.md b/README.md index 9e0b89b..30cad3e 100644 --- a/README.md +++ b/README.md @@ -2,6 +2,10 @@ Checkout documentation: https://temarusanov.github.io/nx/ +## TODO: + +- [ ] Jest coverage bug [#13576](https://github.com/jestjs/jest/issues/13576) + ## Installing ### Install Ansible diff --git a/apps/api-e2e/.eslintrc.json b/apps/api-e2e/.eslintrc.json new file mode 100644 index 0000000..8852e20 --- /dev/null +++ b/apps/api-e2e/.eslintrc.json @@ -0,0 +1,10 @@ +{ + "extends": ["../../.eslintrc.json"], + "ignorePatterns": ["!**/*"], + "overrides": [ + { + "files": ["*.ts", "*.tsx", "*.js", "*.jsx"], + "rules": {} + } + ] +} diff --git a/apps/api-e2e/jest.config.ts b/apps/api-e2e/jest.config.ts new file mode 100644 index 0000000..dec6e31 --- /dev/null +++ b/apps/api-e2e/jest.config.ts @@ -0,0 +1,18 @@ +/* eslint-disable */ +export default { + displayName: 'api-e2e', + preset: '../../jest.preset.js', + globalSetup: '/src/support/global-setup.ts', + globalTeardown: '/src/support/global-teardown.ts', + setupFiles: ['/src/support/test-setup.ts'], + testEnvironment: 'node', + transform: { + '^.+\\.[tj]s$': [ + 'ts-jest', + { + tsconfig: '/tsconfig.spec.json', + }, + ], + }, + moduleFileExtensions: ['ts', 'js', 'html'], +} diff --git a/apps/api-e2e/project.json b/apps/api-e2e/project.json new file mode 100644 index 0000000..501818a --- /dev/null +++ b/apps/api-e2e/project.json @@ -0,0 +1,22 @@ +{ + "name": "api-e2e", + "$schema": "../../node_modules/nx/schemas/project-schema.json", + "implicitDependencies": ["api"], + "targets": { + "e2e": { + "executor": "@nx/jest:jest", + "outputs": ["{workspaceRoot}/coverage/{e2eProjectRoot}"], + "options": { + "jestConfig": "apps/api-e2e/jest.config.ts", + "passWithNoTests": true + } + }, + "lint": { + "executor": "@nx/linter:eslint", + "outputs": ["{options.outputFile}"], + "options": { + "lintFilePatterns": ["apps/api-e2e/**/*.{js,ts}"] + } + } + } +} diff --git a/apps/api-e2e/src/api/api.spec.ts b/apps/api-e2e/src/api/api.spec.ts new file mode 100644 index 0000000..fd3d0c1 --- /dev/null +++ b/apps/api-e2e/src/api/api.spec.ts @@ -0,0 +1,10 @@ +import axios from 'axios' + +describe('GET /health', () => { + it('should be healthy', async () => { + const res = await axios.get(`/health`) + + expect(res.status).toBe(200) + expect(res.data.healthy).toEqual(true) + }) +}) diff --git a/apps/api-e2e/src/support/global-setup.ts b/apps/api-e2e/src/support/global-setup.ts new file mode 100644 index 0000000..f20450c --- /dev/null +++ b/apps/api-e2e/src/support/global-setup.ts @@ -0,0 +1,8 @@ +/* eslint-disable */ +var __TEARDOWN_MESSAGE__: string + +module.exports = async function () { + // Start services that that the app needs to run (e.g. database, docker-compose, etc.). + // Hint: Use `globalThis` to pass variables to global teardown. + // globalThis.__TEARDOWN_MESSAGE__ = '\nTearing down...\n' +} diff --git a/apps/api-e2e/src/support/global-teardown.ts b/apps/api-e2e/src/support/global-teardown.ts new file mode 100644 index 0000000..194a56d --- /dev/null +++ b/apps/api-e2e/src/support/global-teardown.ts @@ -0,0 +1,7 @@ +/* eslint-disable */ + +module.exports = async function () { + // Put clean up logic here (e.g. stopping services, docker-compose, etc.). + // Hint: `globalThis` is shared between setup and teardown. + //console.log(globalThis.__TEARDOWN_MESSAGE__) +} diff --git a/apps/api-e2e/src/support/test-setup.ts b/apps/api-e2e/src/support/test-setup.ts new file mode 100644 index 0000000..64b3b50 --- /dev/null +++ b/apps/api-e2e/src/support/test-setup.ts @@ -0,0 +1,10 @@ +/* eslint-disable */ + +import axios from 'axios' + +module.exports = async function () { + // Configure axios for tests to use. + const host = process.env.HOST ?? 'localhost' + const port = process.env.PORT ?? '3000' + axios.defaults.baseURL = `http://${host}:${port}` +} diff --git a/apps/api-e2e/tsconfig.json b/apps/api-e2e/tsconfig.json new file mode 100644 index 0000000..ed633e1 --- /dev/null +++ b/apps/api-e2e/tsconfig.json @@ -0,0 +1,13 @@ +{ + "extends": "../../tsconfig.base.json", + "files": [], + "include": [], + "references": [ + { + "path": "./tsconfig.spec.json" + } + ], + "compilerOptions": { + "esModuleInterop": true + } +} diff --git a/apps/api-e2e/tsconfig.spec.json b/apps/api-e2e/tsconfig.spec.json new file mode 100644 index 0000000..d7f9cf2 --- /dev/null +++ b/apps/api-e2e/tsconfig.spec.json @@ -0,0 +1,9 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "../../dist/out-tsc", + "module": "commonjs", + "types": ["jest", "node"] + }, + "include": ["jest.config.ts", "src/**/*.ts"] +} diff --git a/apps/api/jest.config.ts b/apps/api/jest.config.ts index 17c4a8a..ee611ff 100644 --- a/apps/api/jest.config.ts +++ b/apps/api/jest.config.ts @@ -12,5 +12,4 @@ export default { '^.+\\.[tj]s$': 'ts-jest', }, moduleFileExtensions: ['ts', 'js', 'html'], - coverageDirectory: '../../coverage/apps/api', } diff --git a/jest.preset.js b/jest.preset.js index 649f8a6..b3bd633 100644 --- a/jest.preset.js +++ b/jest.preset.js @@ -1,5 +1,11 @@ const nxPreset = require('@nx/jest/preset').default; +const globalConf = { + collectCoverage: true, + coverageDirectory: `${process.env.NX_WORKSPACE_ROOT}/coverage/${process.env['NX_TASK_TARGET_PROJECT']}`, +}; + module.exports = { ...nxPreset, + ...globalConf, }; diff --git a/package-lock.json b/package-lock.json index 6fc190a..ffb9f97 100644 --- a/package-lock.json +++ b/package-lock.json @@ -18,6 +18,7 @@ "@nestjs/platform-express": "9.4.3", "@nestjs/testing": "9.4.3", "@prisma/client": "^4.15.0", + "axios": "^1.4.0", "bcrypt": "^5.1.0", "clsx": "^1.2.1", "env-var": "^7.3.1", @@ -5806,10 +5807,9 @@ } }, "node_modules/axios": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.1.3.tgz", - "integrity": "sha512-00tXVRwKx/FZr/IDVFt4C+f9FYairX517WoGCL6dpOntqLkZofjhu43F/Xl44UOpqa+9sLFDrG/XAnFsUYgkDA==", - "dev": true, + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.4.0.tgz", + "integrity": "sha512-S4XCWMEmzvo64T9GfvQDOXgYRDJ/wsSZc7Jvdgx5u1sd0JwsuPLqb3SYmusag+edF6ziyMensPVqLTSc1PiSEA==", "dependencies": { "follow-redirects": "^1.15.0", "form-data": "^4.0.0", @@ -8608,7 +8608,6 @@ "version": "1.15.2", "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", - "dev": true, "funding": [ { "type": "individual", @@ -8711,7 +8710,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", - "dev": true, "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", @@ -11839,6 +11837,17 @@ "nx-cloud": "bin/nx-cloud.js" } }, + "node_modules/nx-cloud/node_modules/axios": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.1.3.tgz", + "integrity": "sha512-00tXVRwKx/FZr/IDVFt4C+f9FYairX517WoGCL6dpOntqLkZofjhu43F/Xl44UOpqa+9sLFDrG/XAnFsUYgkDA==", + "dev": true, + "dependencies": { + "follow-redirects": "^1.15.0", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, "node_modules/nx-cloud/node_modules/fs-extra": { "version": "11.1.1", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.1.1.tgz", @@ -11853,17 +11862,6 @@ "node": ">=14.14" } }, - "node_modules/nx/node_modules/axios": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.3.4.tgz", - "integrity": "sha512-toYm+Bsyl6VC5wSkfkbbNB6ROv7KY93PEBBL6xyDczaIHasAiv4wPqQ/c4RjoQzipxRD2W5g21cOqQulZ7rHwQ==", - "dev": true, - "dependencies": { - "follow-redirects": "^1.15.0", - "form-data": "^4.0.0", - "proxy-from-env": "^1.1.0" - } - }, "node_modules/nx/node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", @@ -13153,8 +13151,7 @@ "node_modules/proxy-from-env": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", - "dev": true + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" }, "node_modules/prr": { "version": "1.0.1", @@ -20230,10 +20227,9 @@ } }, "axios": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.1.3.tgz", - "integrity": "sha512-00tXVRwKx/FZr/IDVFt4C+f9FYairX517WoGCL6dpOntqLkZofjhu43F/Xl44UOpqa+9sLFDrG/XAnFsUYgkDA==", - "dev": true, + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.4.0.tgz", + "integrity": "sha512-S4XCWMEmzvo64T9GfvQDOXgYRDJ/wsSZc7Jvdgx5u1sd0JwsuPLqb3SYmusag+edF6ziyMensPVqLTSc1PiSEA==", "requires": { "follow-redirects": "^1.15.0", "form-data": "^4.0.0", @@ -22330,8 +22326,7 @@ "follow-redirects": { "version": "1.15.2", "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", - "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", - "dev": true + "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==" }, "fork-ts-checker-webpack-plugin": { "version": "7.2.13", @@ -22395,7 +22390,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", - "dev": true, "requires": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", @@ -24674,17 +24668,6 @@ "yargs-parser": "21.1.1" }, "dependencies": { - "axios": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.3.4.tgz", - "integrity": "sha512-toYm+Bsyl6VC5wSkfkbbNB6ROv7KY93PEBBL6xyDczaIHasAiv4wPqQ/c4RjoQzipxRD2W5g21cOqQulZ7rHwQ==", - "dev": true, - "requires": { - "follow-redirects": "^1.15.0", - "form-data": "^4.0.0", - "proxy-from-env": "^1.1.0" - } - }, "emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", @@ -24777,6 +24760,17 @@ "yargs-parser": ">=21.1.1" }, "dependencies": { + "axios": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.1.3.tgz", + "integrity": "sha512-00tXVRwKx/FZr/IDVFt4C+f9FYairX517WoGCL6dpOntqLkZofjhu43F/Xl44UOpqa+9sLFDrG/XAnFsUYgkDA==", + "dev": true, + "requires": { + "follow-redirects": "^1.15.0", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, "fs-extra": { "version": "11.1.1", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.1.1.tgz", @@ -25587,8 +25581,7 @@ "proxy-from-env": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", - "dev": true + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" }, "prr": { "version": "1.0.1", diff --git a/package.json b/package.json index deffd3f..ef4c9d8 100644 --- a/package.json +++ b/package.json @@ -26,6 +26,7 @@ "@nestjs/platform-express": "9.4.3", "@nestjs/testing": "9.4.3", "@prisma/client": "^4.15.0", + "axios": "^1.4.0", "bcrypt": "^5.1.0", "clsx": "^1.2.1", "env-var": "^7.3.1",