diff --git a/TODO.md b/TODO.md index 9ed8775..0e3056f 100644 --- a/TODO.md +++ b/TODO.md @@ -1,10 +1,10 @@ ### Testing Tasks - [ ] Improve coverage -- [ ] Add paginate tests -- [ ] Add toJSON tests +- [x] Add paginate tests +- [x] Add toJSON tests ### Other Tasks -- [ ] Have faker.js as a dev dependency +- [x] Have faker.js as a dev dependency - [ ] Add Cookie Support diff --git a/ecosystem.config.json b/ecosystem.config.json index a9036a3..8e2de8f 100644 --- a/ecosystem.config.json +++ b/ecosystem.config.json @@ -3,6 +3,7 @@ { "name": "app", "script": "dist/index.js", + "node_args": "--experimental-modules --es-module-specifier-resolution=node", "instances": 1, "autorestart": true, "watch": false, diff --git a/package.json b/package.json index f1210bb..1261956 100644 --- a/package.json +++ b/package.json @@ -11,7 +11,7 @@ "node": ">=14.0.0" }, "scripts": { - "start": "pm2 start ecosystem.config.json --no-daemon", + "start": "tsc --build && eslint . --fix && pm2 start ecosystem.config.json --no-daemon", "compile": "tsc --build && eslint . --fix", "compile:watch": "tsc --build --watch", "pre:dev": "cross-env NODE_ENV=development nodemon --experimental-modules --es-module-specifier-resolution=node dist/index.js", @@ -58,6 +58,7 @@ "devDependencies": { "@commitlint/cli": "^16.2.3", "@commitlint/config-conventional": "^16.2.1", + "@faker-js/faker": "^6.2.0", "@jest/globals": "^27.5.1", "@types/bcryptjs": "^2.4.2", "@types/compression": "^1.7.2", @@ -100,7 +101,6 @@ "typescript": "^4.5.4" }, "dependencies": { - "@faker-js/faker": "^6.0.0-alpha.7", "bcryptjs": "^2.4.3", "compression": "^1.7.4", "cors": "^2.8.5", diff --git a/src/modules/auth/auth.test.ts b/src/modules/auth/auth.test.ts index 9f74c33..6cb9d42 100644 --- a/src/modules/auth/auth.test.ts +++ b/src/modules/auth/auth.test.ts @@ -1,5 +1,6 @@ /* eslint-disable jest/no-commented-out-tests */ import { faker } from '@faker-js/faker'; +import mongoose from 'mongoose'; import request from 'supertest'; import httpStatus from 'http-status'; import httpMocks from 'node-mocks-http'; @@ -10,17 +11,35 @@ import app from '../../app'; import setupTestDB from '../jest/setupTestDB'; import User from '../user/user.model'; import config from '../../config/config'; -import { userOne, insertUsers } from '../user/user.fixture'; import { NewRegisteredUser } from '../user/user.interfaces'; import * as tokenService from '../token/token.service'; import tokenTypes from '../token/token.types'; import Token from '../token/token.model'; -import { userOneAccessToken } from '../token/token.fixture'; import authMiddleware from './auth.middleware'; import ApiError from '../errors/ApiError'; setupTestDB(); +const password = 'password1'; +const salt = bcrypt.genSaltSync(8); +const hashedPassword = bcrypt.hashSync(password, salt); +const accessTokenExpires = moment().add(config.jwt.accessExpirationMinutes, 'minutes'); + +const userOne = { + _id: new mongoose.Types.ObjectId(), + name: faker.name.findName(), + email: faker.internet.email().toLowerCase(), + password, + role: 'user', + isEmailVerified: false, +}; + +const userOneAccessToken = tokenService.generateToken(userOne._id, accessTokenExpires, tokenTypes.ACCESS); + +const insertUsers = async (users: Record[]) => { + await User.insertMany(users.map((user) => ({ ...user, password: hashedPassword }))); +}; + describe('Auth routes', () => { describe('POST /v1/auth/register', () => { let newUser: NewRegisteredUser; diff --git a/src/modules/token/index.ts b/src/modules/token/index.ts index 1768982..f5eafa7 100644 --- a/src/modules/token/index.ts +++ b/src/modules/token/index.ts @@ -1,7 +1,6 @@ -import * as tokenFixture from './token.fixture'; import * as tokenService from './token.service'; import Token from './token.model'; import * as tokenInterfaces from './token.interfaces'; import tokenTypes from './token.types'; -export { tokenFixture, tokenService, Token, tokenInterfaces, tokenTypes }; +export { tokenService, Token, tokenInterfaces, tokenTypes }; diff --git a/src/modules/token/token.fixture.ts b/src/modules/token/token.fixture.ts deleted file mode 100644 index dfdeca0..0000000 --- a/src/modules/token/token.fixture.ts +++ /dev/null @@ -1,9 +0,0 @@ -import moment from 'moment'; -import config from '../../config/config'; -import tokenTypes from './token.types'; -import * as tokenService from './token.service'; -import { userOne, admin } from '../user/user.fixture'; - -const accessTokenExpires = moment().add(config.jwt.accessExpirationMinutes, 'minutes'); -export const userOneAccessToken = tokenService.generateToken(userOne._id, accessTokenExpires, tokenTypes.ACCESS); -export const adminAccessToken = tokenService.generateToken(admin._id, accessTokenExpires, tokenTypes.ACCESS); diff --git a/src/modules/token/token.model.test.ts b/src/modules/token/token.model.test.ts index 3099dee..0a3e0e9 100644 --- a/src/modules/token/token.model.test.ts +++ b/src/modules/token/token.model.test.ts @@ -1,10 +1,25 @@ import moment from 'moment'; +import mongoose from 'mongoose'; +import { faker } from '@faker-js/faker'; import config from '../../config/config'; import { NewToken } from './token.interfaces'; -import { userOne } from '../user/user.fixture'; -import { userOneAccessToken } from './token.fixture'; import tokenTypes from './token.types'; import Token from './token.model'; +import * as tokenService from './token.service'; + +const password = 'password1'; +const accessTokenExpires = moment().add(config.jwt.accessExpirationMinutes, 'minutes'); + +const userOne = { + _id: new mongoose.Types.ObjectId(), + name: faker.name.findName(), + email: faker.internet.email().toLowerCase(), + password, + role: 'user', + isEmailVerified: false, +}; + +const userOneAccessToken = tokenService.generateToken(userOne._id, accessTokenExpires, tokenTypes.ACCESS); describe('Token Model', () => { const refreshTokenExpires = moment().add(config.jwt.refreshExpirationDays, 'days'); diff --git a/src/modules/user/index.ts b/src/modules/user/index.ts index 33bbab8..13cd127 100644 --- a/src/modules/user/index.ts +++ b/src/modules/user/index.ts @@ -1,8 +1,7 @@ import * as userController from './user.controller'; -import * as userFixture from './user.fixture'; import * as userInterfaces from './user.interfaces'; import User from './user.model'; import * as userService from './user.service'; import * as userValidation from './user.validation'; -export { userController, userFixture, userInterfaces, User, userService, userValidation }; +export { userController, userInterfaces, User, userService, userValidation }; diff --git a/src/modules/user/user.fixture.ts b/src/modules/user/user.fixture.ts deleted file mode 100644 index 2e3596b..0000000 --- a/src/modules/user/user.fixture.ts +++ /dev/null @@ -1,39 +0,0 @@ -import mongoose from 'mongoose'; -import bcrypt from 'bcryptjs'; -import { faker } from '@faker-js/faker'; -import User from './user.model'; - -const password = 'password1'; -const salt = bcrypt.genSaltSync(8); -const hashedPassword = bcrypt.hashSync(password, salt); - -export const userOne = { - _id: new mongoose.Types.ObjectId(), - name: faker.name.findName(), - email: faker.internet.email().toLowerCase(), - password, - role: 'user', - isEmailVerified: false, -}; - -export const userTwo = { - _id: new mongoose.Types.ObjectId(), - name: faker.name.findName(), - email: faker.internet.email().toLowerCase(), - password, - role: 'user', - isEmailVerified: false, -}; - -export const admin = { - _id: new mongoose.Types.ObjectId(), - name: faker.name.findName(), - email: faker.internet.email().toLowerCase(), - password, - role: 'admin', - isEmailVerified: false, -}; - -export const insertUsers = async (users: Record[]) => { - await User.insertMany(users.map((user) => ({ ...user, password: hashedPassword }))); -}; diff --git a/src/modules/user/user.test.ts b/src/modules/user/user.test.ts index a21ba57..f9064cf 100644 --- a/src/modules/user/user.test.ts +++ b/src/modules/user/user.test.ts @@ -1,15 +1,58 @@ +import mongoose from 'mongoose'; +import bcrypt from 'bcryptjs'; import request from 'supertest'; import { faker } from '@faker-js/faker'; import httpStatus from 'http-status'; +import moment from 'moment'; +import config from '../../config/config'; +import tokenTypes from '../token/token.types'; +import * as tokenService from '../token/token.service'; import app from '../../app'; import setupTestDB from '../jest/setupTestDB'; import User from './user.model'; -import { userOne, userTwo, admin, insertUsers } from './user.fixture'; -import { userOneAccessToken, adminAccessToken } from '../token/token.fixture'; import { NewCreatedUser } from './user.interfaces'; setupTestDB(); +const password = 'password1'; +const salt = bcrypt.genSaltSync(8); +const hashedPassword = bcrypt.hashSync(password, salt); +const accessTokenExpires = moment().add(config.jwt.accessExpirationMinutes, 'minutes'); + +const userOne = { + _id: new mongoose.Types.ObjectId(), + name: faker.name.findName(), + email: faker.internet.email().toLowerCase(), + password, + role: 'user', + isEmailVerified: false, +}; + +const userTwo = { + _id: new mongoose.Types.ObjectId(), + name: faker.name.findName(), + email: faker.internet.email().toLowerCase(), + password, + role: 'user', + isEmailVerified: false, +}; + +const admin = { + _id: new mongoose.Types.ObjectId(), + name: faker.name.findName(), + email: faker.internet.email().toLowerCase(), + password, + role: 'admin', + isEmailVerified: false, +}; + +const userOneAccessToken = tokenService.generateToken(userOne._id, accessTokenExpires, tokenTypes.ACCESS); +const adminAccessToken = tokenService.generateToken(admin._id, accessTokenExpires, tokenTypes.ACCESS); + +const insertUsers = async (users: Record[]) => { + await User.insertMany(users.map((user) => ({ ...user, password: hashedPassword }))); +}; + describe('User routes', () => { describe('POST /v1/users', () => { let newUser: NewCreatedUser; diff --git a/yarn.lock b/yarn.lock index 55da515..4fa6f26 100644 --- a/yarn.lock +++ b/yarn.lock @@ -543,10 +543,10 @@ minimatch "^3.0.4" strip-json-comments "^3.1.1" -"@faker-js/faker@^6.0.0-alpha.7": - version "6.1.2" - resolved "https://registry.npmjs.org/@faker-js/faker/-/faker-6.1.2.tgz" - integrity sha512-QSvmexHCxeRUk1/yKmoEDaWB5Hohjvtim5g2JJwy8S/l0L4b3y/GxSpE6vN4SBoVGGahEQW21uqyRr7EofI35A== +"@faker-js/faker@^6.2.0": + version "6.2.0" + resolved "https://registry.yarnpkg.com/@faker-js/faker/-/faker-6.2.0.tgz#6d836ee8a580589b60c9088a3bdb0b669a468825" + integrity sha512-3kIcQ+aTr3I+LqDbJwbINFk5oA+a63LH57GPJt9PM8AWqN7nCwnubuSiWosHYQlyf2NicrvpzXQxllyLeEdpyQ== "@hapi/hoek@^9.0.0": version "9.2.1"