From c8ac0b2128efe5477804f0bd60aaf25b1b0a851f Mon Sep 17 00:00:00 2001 From: YgorPereira Date: Mon, 23 Mar 2026 09:54:02 -0300 Subject: [PATCH 1/2] feat: database in memory for integration tests --- backend/package-lock.json | 373 ++++++++++++++++++ backend/package.json | 21 +- .../Messages/domain/messages.repository.ts | 6 +- .../infra/messages.repository.mongodb.ts | 38 +- .../modules/Messages/infra/messages.schema.ts | 24 +- .../src/modules/Messages/messages.module.ts | 30 +- .../database/database.connection.service.ts | 6 +- .../src/modules/database/database.module.ts | 2 +- backend/test/{ => e2e}/app.e2e-spec.ts | 2 +- backend/test/{ => e2e}/jest-e2e.json | 0 backend/test/mongodb.setup.int.spec.ts | 6 + backend/test/mongodb.setup.ts | 12 + 12 files changed, 457 insertions(+), 63 deletions(-) rename backend/test/{ => e2e}/app.e2e-spec.ts (92%) rename backend/test/{ => e2e}/jest-e2e.json (100%) create mode 100644 backend/test/mongodb.setup.int.spec.ts create mode 100644 backend/test/mongodb.setup.ts diff --git a/backend/package-lock.json b/backend/package-lock.json index c6ac810..ea3766a 100644 --- a/backend/package-lock.json +++ b/backend/package-lock.json @@ -33,6 +33,7 @@ "eslint-plugin-prettier": "^5.2.2", "globals": "^16.0.0", "jest": "^30.0.0", + "mongodb-memory-server": "^11.0.1", "prettier": "^3.4.2", "source-map-support": "^0.5.21", "supertest": "^7.0.0", @@ -3769,6 +3770,16 @@ "node": ">=0.4.0" } }, + "node_modules/agent-base": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", + "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, "node_modules/ajv": { "version": "6.14.0", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.14.0.tgz", @@ -3961,6 +3972,16 @@ "dev": true, "license": "MIT" }, + "node_modules/async-mutex": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/async-mutex/-/async-mutex-0.5.0.tgz", + "integrity": "sha512-1A94B18jkJ3DYq284ohPxoXbfTA5HsQ7/Mf4DEhcyLx3Bz27Rh59iScbB6EPiP+B+joue6YCxcMXSbFC1tZKwA==", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^2.4.0" + } + }, "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", @@ -3968,6 +3989,21 @@ "dev": true, "license": "MIT" }, + "node_modules/b4a": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.8.0.tgz", + "integrity": "sha512-qRuSmNSkGQaHwNbM7J78Wwy+ghLEYF1zNrSeMxj4Kgw6y33O3mXcQ6Ie9fRvfU/YnxWkOchPXbaLb73TkIsfdg==", + "dev": true, + "license": "Apache-2.0", + "peerDependencies": { + "react-native-b4a": "*" + }, + "peerDependenciesMeta": { + "react-native-b4a": { + "optional": true + } + } + }, "node_modules/babel-jest": { "version": "30.3.0", "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-30.3.0.tgz", @@ -4074,6 +4110,99 @@ "dev": true, "license": "MIT" }, + "node_modules/bare-events": { + "version": "2.8.2", + "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.8.2.tgz", + "integrity": "sha512-riJjyv1/mHLIPX4RwiK+oW9/4c3TEUeORHKefKAKnZ5kyslbN+HXowtbaVEqt4IMUB7OXlfixcs6gsFeo/jhiQ==", + "dev": true, + "license": "Apache-2.0", + "peerDependencies": { + "bare-abort-controller": "*" + }, + "peerDependenciesMeta": { + "bare-abort-controller": { + "optional": true + } + } + }, + "node_modules/bare-fs": { + "version": "4.5.6", + "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-4.5.6.tgz", + "integrity": "sha512-1QovqDrR80Pmt5HPAsMsXTCFcDYr+NSUKW6nd6WO5v0JBmnItc/irNRzm2KOQ5oZ69P37y+AMujNyNtG+1Rggw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "bare-events": "^2.5.4", + "bare-path": "^3.0.0", + "bare-stream": "^2.6.4", + "bare-url": "^2.2.2", + "fast-fifo": "^1.3.2" + }, + "engines": { + "bare": ">=1.16.0" + }, + "peerDependencies": { + "bare-buffer": "*" + }, + "peerDependenciesMeta": { + "bare-buffer": { + "optional": true + } + } + }, + "node_modules/bare-os": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/bare-os/-/bare-os-3.8.0.tgz", + "integrity": "sha512-Dc9/SlwfxkXIGYhvMQNUtKaXCaGkZYGcd1vuNUUADVqzu4/vQfvnMkYYOUnt2VwQ2AqKr/8qAVFRtwETljgeFg==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "bare": ">=1.14.0" + } + }, + "node_modules/bare-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bare-path/-/bare-path-3.0.0.tgz", + "integrity": "sha512-tyfW2cQcB5NN8Saijrhqn0Zh7AnFNsnczRcuWODH0eYAXBsJ5gVxAUuNr7tsHSC6IZ77cA0SitzT+s47kot8Mw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "bare-os": "^3.0.1" + } + }, + "node_modules/bare-stream": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/bare-stream/-/bare-stream-2.10.0.tgz", + "integrity": "sha512-DOPZF/DDcDruKDA43cOw6e9Quq5daua7ygcAwJE/pKJsRWhgSSemi7qVNGE5kyDIxIeN1533G/zfbvWX7Wcb9w==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "streamx": "^2.25.0", + "teex": "^1.0.1" + }, + "peerDependencies": { + "bare-buffer": "*", + "bare-events": "*" + }, + "peerDependenciesMeta": { + "bare-buffer": { + "optional": true + }, + "bare-events": { + "optional": true + } + } + }, + "node_modules/bare-url": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/bare-url/-/bare-url-2.4.0.tgz", + "integrity": "sha512-NSTU5WN+fy/L0DDenfE8SXQna4voXuW0FHM7wH8i3/q9khUSchfPbPezO4zSFMnDGIf9YE+mt/RWhZgNRKRIXA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "bare-path": "^3.0.0" + } + }, "node_modules/base64-js": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", @@ -4259,6 +4388,16 @@ "ieee754": "^1.1.13" } }, + "node_modules/buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, "node_modules/buffer-from": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", @@ -4609,6 +4748,13 @@ "node": ">= 6" } }, + "node_modules/commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", + "dev": true, + "license": "MIT" + }, "node_modules/component-emitter": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.1.tgz", @@ -5331,6 +5477,16 @@ "node": ">=0.8.x" } }, + "node_modules/events-universal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/events-universal/-/events-universal-1.0.1.tgz", + "integrity": "sha512-LUd5euvbMLpwOF8m6ivPCbhQeSiYVNb8Vs0fQ8QjXo0JTkEHpz8pxdQf0gStltaPpw0Cca8b39KxvK9cfKRiAw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "bare-events": "^2.7.0" + } + }, "node_modules/execa": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", @@ -5447,6 +5603,13 @@ "dev": true, "license": "Apache-2.0" }, + "node_modules/fast-fifo": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz", + "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==", + "dev": true, + "license": "MIT" + }, "node_modules/fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", @@ -5577,6 +5740,50 @@ "url": "https://opencollective.com/express" } }, + "node_modules/find-cache-dir": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", + "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", + "dev": true, + "license": "MIT", + "dependencies": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/avajs/find-cache-dir?sponsor=1" + } + }, + "node_modules/find-cache-dir/node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/find-cache-dir/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/find-up": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", @@ -5615,6 +5822,27 @@ "dev": true, "license": "ISC" }, + "node_modules/follow-redirects": { + "version": "1.15.11", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz", + "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, "node_modules/foreground-child": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", @@ -6087,6 +6315,20 @@ "url": "https://opencollective.com/express" } }, + "node_modules/https-proxy-agent": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, "node_modules/human-signals": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", @@ -7721,6 +7963,58 @@ "node": ">=20.19.0" } }, + "node_modules/mongodb-memory-server": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/mongodb-memory-server/-/mongodb-memory-server-11.0.1.tgz", + "integrity": "sha512-nUlKovSJZBh7q5hPsewFRam9H66D08Ne18nyknkNalfXMPtK1Og3kOcuqQhcX88x/pghSZPIJHrLbxNFW3OWiw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "mongodb-memory-server-core": "11.0.1", + "tslib": "^2.8.1" + }, + "engines": { + "node": ">=20.19.0" + } + }, + "node_modules/mongodb-memory-server-core": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/mongodb-memory-server-core/-/mongodb-memory-server-core-11.0.1.tgz", + "integrity": "sha512-IcIb2S9Xf7Lmz43Z1ZujMqNg7PU5Q7yn+4wOnu7l6pfeGPkEmlqzV1hIbroVx8s4vXhPB1oMGC1u8clW7aj3Xw==", + "dev": true, + "license": "MIT", + "dependencies": { + "async-mutex": "^0.5.0", + "camelcase": "^6.3.0", + "debug": "^4.4.3", + "find-cache-dir": "^3.3.2", + "follow-redirects": "^1.15.11", + "https-proxy-agent": "^7.0.6", + "mongodb": "^7.0.0", + "new-find-package-json": "^2.0.0", + "semver": "^7.7.3", + "tar-stream": "^3.1.7", + "tslib": "^2.8.1", + "yauzl": "^3.2.0" + }, + "engines": { + "node": ">=20.19.0" + } + }, + "node_modules/mongodb-memory-server-core/node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/mongoose": { "version": "9.3.1", "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-9.3.1.tgz", @@ -7877,6 +8171,19 @@ "dev": true, "license": "MIT" }, + "node_modules/new-find-package-json": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/new-find-package-json/-/new-find-package-json-2.0.0.tgz", + "integrity": "sha512-lDcBsjBSMlj3LXH2v/FW3txlh2pYTjmbOXPYJD93HI5EwuLzI11tdHSIpUMmfq/IOsldj4Ps8M8flhm+pCK4Ew==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.3.4" + }, + "engines": { + "node": ">=12.22.0" + } + }, "node_modules/node-abort-controller": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/node-abort-controller/-/node-abort-controller-3.1.1.tgz", @@ -8198,6 +8505,13 @@ "node": ">=8" } }, + "node_modules/pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", + "dev": true, + "license": "MIT" + }, "node_modules/picocolors": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", @@ -8912,6 +9226,18 @@ "node": ">=10.0.0" } }, + "node_modules/streamx": { + "version": "2.25.0", + "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.25.0.tgz", + "integrity": "sha512-0nQuG6jf1w+wddNEEXCF4nTg3LtufWINB5eFEN+5TNZW7KWJp6x87+JFL43vaAUPyCfH1wID+mNVyW6OHtFamg==", + "dev": true, + "license": "MIT", + "dependencies": { + "events-universal": "^1.0.0", + "fast-fifo": "^1.3.2", + "text-decoder": "^1.1.0" + } + }, "node_modules/string_decoder": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", @@ -9131,6 +9457,29 @@ "url": "https://opencollective.com/webpack" } }, + "node_modules/tar-stream": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.8.tgz", + "integrity": "sha512-U6QpVRyCGHva435KoNWy9PRoi2IFYCgtEhq9nmrPPpbRacPs9IH4aJ3gbrFC8dPcXvdSZ4XXfXT5Fshbp2MtlQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "b4a": "^1.6.4", + "bare-fs": "^4.5.5", + "fast-fifo": "^1.2.0", + "streamx": "^2.15.0" + } + }, + "node_modules/teex": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/teex/-/teex-1.0.1.tgz", + "integrity": "sha512-eYE6iEI62Ni1H8oIa7KlDU6uQBtqr4Eajni3wX7rpfXD8ysFx8z0+dri+KWEPWpBsxXfxu58x/0jvTVT1ekOSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "streamx": "^2.12.5" + } + }, "node_modules/terser": { "version": "5.46.1", "resolved": "https://registry.npmjs.org/terser/-/terser-5.46.1.tgz", @@ -9334,6 +9683,16 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/text-decoder": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.2.7.tgz", + "integrity": "sha512-vlLytXkeP4xvEq2otHeJfSQIRyWxo/oZGEbXrtEEF9Hnmrdly59sUbzZ/QgyWuLYHctCHxFF4tRQZNQ9k60ExQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "b4a": "^1.6.4" + } + }, "node_modules/tinyglobby": { "version": "0.2.15", "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", @@ -10275,6 +10634,20 @@ "node": ">=12" } }, + "node_modules/yauzl": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-3.2.1.tgz", + "integrity": "sha512-k1isifdbpNSFEHFJ1ZY4YDewv0IH9FR61lDetaRMD3j2ae3bIXGV+7c+LHCqtQGofSd8PIyV4X6+dHMAnSr60A==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-crc32": "~0.2.3", + "pend": "~1.2.0" + }, + "engines": { + "node": ">=12" + } + }, "node_modules/yn": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", diff --git a/backend/package.json b/backend/package.json index 26a6b3c..9e428b2 100644 --- a/backend/package.json +++ b/backend/package.json @@ -13,10 +13,11 @@ "start:debug": "nest start --debug --watch", "start:prod": "node dist/main", "lint": "eslint \"{src,apps,libs,test}/**/*.ts\" --fix", - "test": "jest", + "test": "jest --testPathPatterns \"^(?!.*\\.int\\.spec\\.ts).*\\.spec\\.ts$\"", "test:watch": "jest --watch", "test:cov": "jest --coverage", - "test:debug": "node --inspect-brk -r tsconfig-paths/register -r ts-node/register node_modules/.bin/jest --runInBand", + "test:integration": "jest --testPathPatterns \"\\.int\\.spec\\.ts$\" --runInBand --forceExit", + "test:integration:debug": "jest --testPathPatterns \"\\.int\\.spec\\.ts$\" --runInBand --detectOpenHandles --forceExit", "test:e2e": "jest --config ./test/jest-e2e.json" }, "dependencies": { @@ -44,6 +45,7 @@ "eslint-plugin-prettier": "^5.2.2", "globals": "^16.0.0", "jest": "^30.0.0", + "mongodb-memory-server": "^11.0.1", "prettier": "^3.4.2", "source-map-support": "^0.5.21", "supertest": "^7.0.0", @@ -60,15 +62,18 @@ "json", "ts" ], - "rootDir": "src", - "testRegex": ".*\\.spec\\.ts$", + "rootDir": ".", "transform": { "^.+\\.(t|j)s$": "ts-jest" }, "collectCoverageFrom": [ - "**/*.(t|j)s" + "src/**/*.(t|j)s" ], - "coverageDirectory": "../coverage", - "testEnvironment": "node" + "coverageDirectory": "./coverage", + "testEnvironment": "node", + "clearMocks": true, + "setupFilesAfterEnv": [ + "./test/mongodb.setup.ts" + ] } -} +} \ No newline at end of file diff --git a/backend/src/modules/Messages/domain/messages.repository.ts b/backend/src/modules/Messages/domain/messages.repository.ts index 6b5b690..4a5f2f6 100644 --- a/backend/src/modules/Messages/domain/messages.repository.ts +++ b/backend/src/modules/Messages/domain/messages.repository.ts @@ -1,6 +1,6 @@ export interface IMessageRepository { - create(messageData: any): Promise; - findByTicketId(ticketId: string): Promise; + create(messageData: any): Promise; + findByTicketId(ticketId: string): Promise; } -// Any temporário para simplificar, ideal é ter uma entidade de domínio para a mensagem. \ No newline at end of file +// Any temporário para simplificar, ideal é ter uma entidade de domínio para a mensagem. diff --git a/backend/src/modules/Messages/infra/messages.repository.mongodb.ts b/backend/src/modules/Messages/infra/messages.repository.mongodb.ts index 7b60129..9fd219e 100644 --- a/backend/src/modules/Messages/infra/messages.repository.mongodb.ts +++ b/backend/src/modules/Messages/infra/messages.repository.mongodb.ts @@ -1,24 +1,24 @@ -import { Injectable } from "@nestjs/common"; -import { IMessageRepository } from "../domain/messages.repository"; -import { InjectModel } from "@nestjs/mongoose"; -import { Message, MessageDocument } from "./messages.schema"; -import { Model } from "mongoose"; +import { Injectable } from '@nestjs/common'; +import { IMessageRepository } from '../domain/messages.repository'; +import { InjectModel } from '@nestjs/mongoose'; +import { Message, MessageDocument } from './messages.schema'; +import { Model } from 'mongoose'; @Injectable() export class MessageRepositoryMongodb implements IMessageRepository { - constructor( - // Injeta o Model do Mongoose baseado no schema criado - @InjectModel(Message.name) private messageModel: Model, - ) {} + constructor( + // Injeta o Model do Mongoose baseado no schema criado + @InjectModel(Message.name) private messageModel: Model, + ) {} - // Método para salvar uma nova mensagem no banco - async create(messageData: any): Promise { - const createdMessage = new this.messageModel(messageData); - return createdMessage.save(); - } + // Método para salvar uma nova mensagem no banco + async create(messageData: any): Promise { + const createdMessage = new this.messageModel(messageData); + return createdMessage.save(); + } - // Método para buscar todo o histórico de um chamado - async findByTicketId(ticketId: string): Promise { - return this.messageModel.find({ ticketId }).sort({ createdAt: 1}).exec(); - } -} \ No newline at end of file + // Método para buscar todo o histórico de um chamado + async findByTicketId(ticketId: string): Promise { + return this.messageModel.find({ ticketId }).sort({ createdAt: 1 }).exec(); + } +} diff --git a/backend/src/modules/Messages/infra/messages.schema.ts b/backend/src/modules/Messages/infra/messages.schema.ts index 10b1f7f..36a577c 100644 --- a/backend/src/modules/Messages/infra/messages.schema.ts +++ b/backend/src/modules/Messages/infra/messages.schema.ts @@ -3,22 +3,22 @@ import { Document, Types } from 'mongoose'; export type MessageDocument = Message & Document; -@Schema({ timestamps: true, collection: 'messages'}) +@Schema({ timestamps: true, collection: 'messages' }) export class Message { - @Prop({ required: true, type: Types.ObjectId }) - chatId: Types.ObjectId; // Referência ao chamado + @Prop({ required: true, type: Types.ObjectId }) + chatId: Types.ObjectId; // Referência ao chamado - @Prop({ required: true, type: Types.ObjectId }) - senderId: Types.ObjectId; // Id do cliente ou atendente que enviou a mensagem + @Prop({ required: true, type: Types.ObjectId }) + senderId: Types.ObjectId; // Id do cliente ou atendente que enviou a mensagem - @Prop({ required: true }) - content: string; // Conteúdo do chat + @Prop({ required: true }) + content: string; // Conteúdo do chat - @Prop({ default: false }) - isSystemMessage: boolean; // Flag para mensagens da URA digital + @Prop({ default: false }) + isSystemMessage: boolean; // Flag para mensagens da URA digital - @Prop({ required: false }) - readAt?: Date; // Controle pra saber se a mensagem foi lida + @Prop({ required: false }) + readAt?: Date; // Controle pra saber se a mensagem foi lida } -export const MessageSchema = SchemaFactory.createForClass(Message); \ No newline at end of file +export const MessageSchema = SchemaFactory.createForClass(Message); diff --git a/backend/src/modules/Messages/messages.module.ts b/backend/src/modules/Messages/messages.module.ts index c4c4448..642c9f3 100644 --- a/backend/src/modules/Messages/messages.module.ts +++ b/backend/src/modules/Messages/messages.module.ts @@ -1,18 +1,18 @@ -import { Module } from "@nestjs/common"; -import { MongooseModule } from "@nestjs/mongoose"; -import { Message, MessageSchema } from "./infra/messages.schema"; -import { MessageRepositoryMongodb } from "./infra/messages.repository.mongodb"; +import { Module } from '@nestjs/common'; +import { MongooseModule } from '@nestjs/mongoose'; +import { Message, MessageSchema } from './infra/messages.schema'; +import { MessageRepositoryMongodb } from './infra/messages.repository.mongodb'; @Module({ - imports: [ - // Avisa ao Mongoose para registrar o schema criado - MongooseModule.forFeature([{ name: Message.name, schema: MessageSchema }]), - ], - providers: [ - MessageRepositoryMongodb // Registra o repositório - ], - exports: [ - MessageRepositoryMongodb // Exporta para que o AppController consiga usar para teste - ] + imports: [ + // Avisa ao Mongoose para registrar o schema criado + MongooseModule.forFeature([{ name: Message.name, schema: MessageSchema }]), + ], + providers: [ + MessageRepositoryMongodb, // Registra o repositório + ], + exports: [ + MessageRepositoryMongodb, // Exporta para que o AppController consiga usar para teste + ], }) -export class MessagesModule {} \ No newline at end of file +export class MessagesModule {} diff --git a/backend/src/modules/database/database.connection.service.ts b/backend/src/modules/database/database.connection.service.ts index 34c062d..1ee9e19 100644 --- a/backend/src/modules/database/database.connection.service.ts +++ b/backend/src/modules/database/database.connection.service.ts @@ -6,9 +6,7 @@ import { Connection } from 'mongoose'; export class DatabaseConnectionService implements OnApplicationBootstrap { private readonly logger = new Logger('Database'); - constructor( - @InjectConnection() private readonly connection: Connection, - ) {} + constructor(@InjectConnection() private readonly connection: Connection) {} async onApplicationBootstrap() { try { @@ -22,4 +20,4 @@ export class DatabaseConnectionService implements OnApplicationBootstrap { this.logger.warn('MongoDB disconnected'); }); } -} \ No newline at end of file +} diff --git a/backend/src/modules/database/database.module.ts b/backend/src/modules/database/database.module.ts index 155b32f..191ac58 100644 --- a/backend/src/modules/database/database.module.ts +++ b/backend/src/modules/database/database.module.ts @@ -14,4 +14,4 @@ import { DatabaseConnectionService } from './database.connection.service'; ], providers: [DatabaseConnectionService], }) -export class DatabaseModule {} \ No newline at end of file +export class DatabaseModule {} diff --git a/backend/test/app.e2e-spec.ts b/backend/test/e2e/app.e2e-spec.ts similarity index 92% rename from backend/test/app.e2e-spec.ts rename to backend/test/e2e/app.e2e-spec.ts index 36852c5..6df1386 100644 --- a/backend/test/app.e2e-spec.ts +++ b/backend/test/e2e/app.e2e-spec.ts @@ -2,7 +2,7 @@ import { Test, TestingModule } from '@nestjs/testing'; import { INestApplication } from '@nestjs/common'; import request from 'supertest'; import { App } from 'supertest/types'; -import { AppModule } from './../src/app.module'; +import { AppModule } from '../../src/app.module'; describe('AppController (e2e)', () => { let app: INestApplication; diff --git a/backend/test/jest-e2e.json b/backend/test/e2e/jest-e2e.json similarity index 100% rename from backend/test/jest-e2e.json rename to backend/test/e2e/jest-e2e.json diff --git a/backend/test/mongodb.setup.int.spec.ts b/backend/test/mongodb.setup.int.spec.ts new file mode 100644 index 0000000..e6d2ba2 --- /dev/null +++ b/backend/test/mongodb.setup.int.spec.ts @@ -0,0 +1,6 @@ +describe('MongoDB Setup', () => { + it('mongoUri should be defined on enviroments', () => { + expect(process.env.MONGO_URI).toBeDefined(); + expect(process.env.MONGO_URI).toMatch(/^mongodb:\/\//); + }); +}); diff --git a/backend/test/mongodb.setup.ts b/backend/test/mongodb.setup.ts new file mode 100644 index 0000000..e9ca836 --- /dev/null +++ b/backend/test/mongodb.setup.ts @@ -0,0 +1,12 @@ +import { MongoMemoryServer } from 'mongodb-memory-server'; + +let mongoServer: MongoMemoryServer; + +beforeAll(async () => { + mongoServer = await MongoMemoryServer.create(); + process.env.MONGO_URI = mongoServer.getUri(); +}); + +afterAll(async () => { + await mongoServer.stop(); +}); From 67baff54dab7fb0cd60473aabacf55cd745fe961 Mon Sep 17 00:00:00 2001 From: YgorPereira Date: Mon, 23 Mar 2026 10:34:05 -0300 Subject: [PATCH 2/2] feat: add integration tests step in ci pipeline --- .github/workflows/workflow_v1.yaml | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/.github/workflows/workflow_v1.yaml b/.github/workflows/workflow_v1.yaml index 523866c..cddaafa 100644 --- a/.github/workflows/workflow_v1.yaml +++ b/.github/workflows/workflow_v1.yaml @@ -25,8 +25,20 @@ jobs: runs-on: ubuntu-latest needs: unit-tests steps: - - name: Placeholder - run: echo "Integration tests will be implemented later" + - uses: actions/checkout@v3 + + - name: Using NodeJS + uses: actions/setup-node@v3 + with: + node-version: "22.x" + + - name: Install packages + working-directory: backend + run: npm ci + + - name: Run integration tests + working-directory: backend + run: npm run test:integration build-procces: runs-on: ubuntu-latest