UNPKG

express-typeorm-rest-boilerplate

Version:

Boilerplate code to get started with building RESTful API Services

140 lines (124 loc) 4.51 kB
import { Container } from 'typedi'; import { IUserInputDTO, IUserResponseDTO } from '../../src/types'; import UserService from '../../src/api/services/UserService'; import databaseLoader from '../../src/loaders/database'; import * as faker from 'faker'; import { Connection } from 'typeorm'; import Logger from '../../src/logger'; import { User } from '../../src/api/entities/User'; import EntitySeeder from '../../src/database/seeds/EntitySeed'; import UserFactory from '../../src/database/factories/UserFactory'; import { ErrorHandler } from '../../src/helpers/ErrorHandler'; jest.mock('../../src/logger'); describe('UserService', () => { let connection: Connection; let userSeed: EntitySeeder<User>; let userServiceInstance: UserService; beforeAll(async () => { Container.reset(); connection = await databaseLoader(); await connection.synchronize(true); userSeed = new EntitySeeder<User>( connection.getMongoRepository(User), UserFactory ); Container.set('logger', Logger); userServiceInstance = Container.get(UserService); }); beforeEach(async () => { await connection.dropDatabase(); }); afterAll(async () => { if (connection.isConnected) { await connection.close(); } }); describe('register', () => { test('Should successfully create a user record', async () => { const mockUserInput: IUserInputDTO = { firstName: faker.name.firstName(), lastName: faker.name.lastName(), email: faker.internet.email(), password: faker.random.word(), }; const response = await userServiceInstance.register(mockUserInput); expect(response).toBeDefined(); expect(response.user.id).toBeDefined(); expect(response.user.firstName).toEqual(mockUserInput.firstName); expect(response.user.email).toEqual(mockUserInput.email); expect(response.token).toBeDefined(); }); test('Should fail to create a user record if the email exists', async () => { const mockUser = await userSeed.seedOne(); const mockUserInput: IUserInputDTO = { firstName: faker.name.firstName(), lastName: faker.name.lastName(), email: mockUser.email, password: faker.random.word(), }; let err: ErrorHandler, response: IUserResponseDTO; try { response = await userServiceInstance.register(mockUserInput); } catch (e) { err = e; } expect(response).toBeUndefined(); expect(err).toEqual( new ErrorHandler(400, 'The email address already exists') ); }); }); describe('login', () => { test('Should succeed with correct details', async () => { const mockPassword = faker.random.word(); const mockUser = await userSeed.seedOne({ password: mockPassword, }); const response = await userServiceInstance.login( mockUser.email, mockPassword ); expect(response).toBeDefined(); expect(response.user.id).toBeDefined(); expect(response.user.firstName).toEqual(mockUser.firstName); expect(response.user.email).toEqual(mockUser.email); expect(response.token).toBeDefined(); }); test('Should throw an error with incorrect details', async () => { const mockPassword = faker.random.word(); const incorrectPassword = mockPassword + 'a'; const mockUser = await userSeed.seedOne({ password: mockPassword, }); let err: ErrorHandler, response: IUserResponseDTO; try { response = await userServiceInstance.login( mockUser.email, incorrectPassword ); } catch (e) { err = e; } expect(response).toBeUndefined(); expect(err).toEqual(new ErrorHandler(401, 'Invalid email or password')); }); }); describe('find', () => { test('Should find all users', async () => { await userSeed.seedMany(5); const response = await userServiceInstance.find(); expect(response).toBeDefined(); expect(response.length).toEqual(5); expect(response[0].password).toBeUndefined(); }); }); describe('findOne', () => { test('Should find a user by id', async () => { const user = await userSeed.seedOne(); const response = await userServiceInstance.findOne(user.id.toHexString()); expect(response).toBeDefined(); expect(response.email).toEqual(user.email); expect(response.password).toBeUndefined(); }); }); });