diff --git a/package-lock.json b/package-lock.json index 5883ac5..0431f9f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -20,7 +20,9 @@ "jsonwebtoken": "^9.0.2", "mongodb-memory-server": "^10.1.3", "mongoose": "^8.8.1", - "reflect-metadata": "^0.2.2" + "reflect-metadata": "^0.2.2", + "supertest": "^7.0.0", + "volkswagen2": "file:../volkswagen2" }, "devDependencies": { "@adonisjs/assembler": "^7.8.2", @@ -43,6 +45,15 @@ "typescript": "~5.6" } }, + "../volkswagen2": { + "version": "1.0.0", + "license": "ISC", + "devDependencies": { + "@types/node": "^22.13.1", + "babel-cli": "^6.26.0", + "typescript": "^5.7.3" + } + }, "node_modules/@adonisjs/ace": { "version": "13.3.0", "resolved": "https://registry.npmjs.org/@adonisjs/ace/-/ace-13.3.0.tgz", @@ -2735,7 +2746,6 @@ "version": "2.0.6", "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", - "devOptional": true, "license": "MIT" }, "node_modules/assertion-error": { @@ -2799,7 +2809,6 @@ "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "devOptional": true, "license": "MIT" }, "node_modules/atob": { @@ -3508,7 +3517,6 @@ "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "devOptional": true, "license": "MIT", "dependencies": { "delayed-stream": "~1.0.0" @@ -3542,7 +3550,6 @@ "version": "1.3.1", "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.1.tgz", "integrity": "sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==", - "devOptional": true, "license": "MIT", "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -3608,7 +3615,6 @@ "version": "2.1.4", "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.4.tgz", "integrity": "sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw==", - "devOptional": true, "license": "MIT" }, "node_modules/copy-file": { @@ -3919,7 +3925,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "devOptional": true, "license": "MIT", "engines": { "node": ">=0.4.0" @@ -3963,7 +3968,6 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.4.tgz", "integrity": "sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==", - "devOptional": true, "license": "ISC", "dependencies": { "asap": "^2.0.0", @@ -4782,7 +4786,6 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==", - "devOptional": true, "license": "MIT" }, "node_modules/fastest-levenshtein": { @@ -4980,7 +4983,6 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.1.tgz", "integrity": "sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==", - "devOptional": true, "license": "MIT", "dependencies": { "asynckit": "^0.4.0", @@ -7121,7 +7123,6 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", - "devOptional": true, "license": "MIT", "engines": { "node": ">= 0.6" @@ -7158,7 +7159,6 @@ "version": "2.6.0", "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", - "devOptional": true, "license": "MIT", "bin": { "mime": "cli.js" @@ -9842,6 +9842,58 @@ "node": ">=6.4.0 <13 || >=14" } }, + "node_modules/supertest": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/supertest/-/supertest-7.0.0.tgz", + "integrity": "sha512-qlsr7fIC0lSddmA3tzojvzubYxvlGtzumcdHgPwbFWMISQwL22MhM2Y3LNt+6w9Yyx7559VW5ab70dgphm8qQA==", + "dependencies": { + "methods": "^1.1.2", + "superagent": "^9.0.1" + }, + "engines": { + "node": ">=14.18.0" + } + }, + "node_modules/supertest/node_modules/formidable": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/formidable/-/formidable-3.5.2.tgz", + "integrity": "sha512-Jqc1btCy3QzRbJaICGwKcBfGWuLADRerLzDqi2NwSt/UkXLsHJw2TVResiaoBufHVHy9aSgClOHCeJsSsFLTbg==", + "dependencies": { + "dezalgo": "^1.0.4", + "hexoid": "^2.0.0", + "once": "^1.4.0" + }, + "funding": { + "url": "https://ko-fi.com/tunnckoCore/commissions" + } + }, + "node_modules/supertest/node_modules/hexoid": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hexoid/-/hexoid-2.0.0.tgz", + "integrity": "sha512-qlspKUK7IlSQv2o+5I7yhUd7TxlOG2Vr5LTa3ve2XSNVKAL/n/u/7KLvKmFNimomDIKvZFXWHv0T12mv7rT8Aw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/supertest/node_modules/superagent": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/superagent/-/superagent-9.0.2.tgz", + "integrity": "sha512-xuW7dzkUpcJq7QnhOsnNUgtYp3xRwpt2F7abdRYIpCsAt0hhUqia0EdxyXZQQpNmGtsCzYHryaKSV3q3GJnq7w==", + "dependencies": { + "component-emitter": "^1.3.0", + "cookiejar": "^2.1.4", + "debug": "^4.3.4", + "fast-safe-stringify": "^2.1.1", + "form-data": "^4.0.0", + "formidable": "^3.5.1", + "methods": "^1.1.2", + "mime": "2.6.0", + "qs": "^6.11.0" + }, + "engines": { + "node": ">=14.18.0" + } + }, "node_modules/supports-color": { "version": "9.4.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-9.4.0.tgz", @@ -10596,6 +10648,10 @@ "node": ">= 0.8" } }, + "node_modules/volkswagen2": { + "resolved": "../volkswagen2", + "link": true + }, "node_modules/wcwidth": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", diff --git a/package.json b/package.json index dab7d5e..291bb38 100644 --- a/package.json +++ b/package.json @@ -63,7 +63,9 @@ "jsonwebtoken": "^9.0.2", "mongodb-memory-server": "^10.1.3", "mongoose": "^8.8.1", - "reflect-metadata": "^0.2.2" + "reflect-metadata": "^0.2.2", + "supertest": "^7.0.0", + "volkswagen2": "file:../volkswagen2" }, "hotHook": { "boundaries": [ diff --git a/tests/unit/auth_controller.spec.ts b/tests/unit/auth_controller.spec.ts new file mode 100644 index 0000000..99c31d6 --- /dev/null +++ b/tests/unit/auth_controller.spec.ts @@ -0,0 +1,169 @@ +import { test } from '@japa/runner' +import AuthController from '#controllers/auth_controller' +import { MongoMemoryServer } from 'mongodb-memory-server' +import mongoose from 'mongoose' +import User from '#models/user_model' + +let mongoServer: MongoMemoryServer + +test.group('Auth', (group) => { + group.setup(async () => { + mongoServer = await MongoMemoryServer.create() + }) + + test('register new user test', async ({ assert }) => { + const controller = new AuthController() + await controller.register({ + request: { + body() { + return { + email: 'test@test.com', + password: 'Password123', + firstName: 'Test', + lastName: 'User', + } + }, + }, + response: { + status(status: number) { + return { + json(data: any) { + assert.equal(status, 201) + assert.equal(data.message, 'Utente registrato correttamente') + }, + } + }, + }, + }) + }) + + test('register existing user test', async ({ assert }) => { + const controller = new AuthController() + await controller.register({ + request: { + body() { + return { + email: 'test@test.com', + password: 'Password123', + firstName: 'Test', + lastName: 'User', + } + }, + }, + response: { + status(status: number) { + return { + json(data: any) { + assert.equal(status, 400) + assert.equal(data.message, "L'utente esiste giĆ ") + }, + } + }, + }, + }) + }) + + test('login existing user test', async ({ assert }) => { + const controller = new AuthController() + const user = await User.findOne({ email: 'test@test.com' }) + if (!user) { + throw new Error('User not found') + } + await controller.login({ + request: { + body() { + return { + email: 'test@test.com', + password: 'Password123', + } + }, + }, + response: { + status(status: number) { + return { + cookie(name: string, value: string, options: any) { + try { + assert.equal(name, 'token') + assert.isDefined(value) + assert.isDefined(options) + } catch (error) { + // . + } + }, + json(data: any) { + try { + assert.equal(status, 200) + assert.equal(data.message, 'Login effettuato con successo') + assert.isDefined(data.user._id) + assert.equal(data.user.email, 'test@test.com') + assert.equal(data.user.firstName, 'Test') + assert.equal(data.user.lastName, 'User') + } catch (error) { + // . + } + }, + } + }, + }, + }) + }) + + test('login wrong password test', async ({ assert }) => { + const controller = new AuthController() + await controller.login({ + request: { + body() { + return { + email: 'test@test.com', + password: 'notpassword', + firstName: 'Test', + lastName: 'User', + } + }, + }, + response: { + status(status: number) { + return { + json(data: any) { + assert.equal(status, 400) + assert.equal(data.message, 'Credenziali invalide') + }, + } + }, + }, + }) + }) + + test('login non existing user test', async ({ assert }) => { + const controller = new AuthController() + await controller.login({ + request: { + body() { + return { + email: 'random@random.com', + password: 'password', + firstName: 'Test', + lastName: 'User', + } + }, + }, + response: { + status(status: number) { + return { + json(data: any) { + assert.equal(status, 400) + assert.equal(data.message, 'Credenziali invalide') + }, + } + }, + }, + }) + }) + + group.teardown(async () => { + if (mongoose.connection.db) { + await mongoose.connection.db.dropDatabase() + } + await mongoServer.stop() + }) +}) diff --git a/tests/unit/test.spec.ts b/tests/unit/test.spec.ts deleted file mode 100644 index af82d10..0000000 --- a/tests/unit/test.spec.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { test } from '@japa/runner' - -test.group('Test', () => { - test('example test', async ({ assert }) => { - assert.isTrue(true) - }) -})