├── .gitignore ├── .prettierrc ├── nest-cli.json ├── nodemon-debug.json ├── nodemon.json ├── package-lock.json ├── package.json ├── src ├── app.module.ts ├── main.ts ├── note │ ├── dto │ │ ├── create-note.dto.ts │ │ └── update-note-dto.ts │ ├── note.controller.ts │ ├── note.entity.ts │ ├── note.module.ts │ ├── note.service.spec.ts │ └── note.service.ts └── shared │ └── database │ ├── database.module.ts │ ├── database.service.spec.ts │ └── database.service.ts ├── test ├── jest-e2e.json ├── mock.factory.ts ├── note.e2e-spec.ts └── test.utils.ts ├── tsconfig.json ├── tsconfig.spec.json └── tslint.json /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules/ -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "singleQuote": true, 3 | "useTabs": true, 4 | "trailingComma": "all" 5 | } 6 | -------------------------------------------------------------------------------- /nest-cli.json: -------------------------------------------------------------------------------- 1 | { 2 | "language": "ts", 3 | "collection": "@nestjs/schematics", 4 | "sourceRoot": "src" 5 | } 6 | -------------------------------------------------------------------------------- /nodemon-debug.json: -------------------------------------------------------------------------------- 1 | { 2 | "watch": ["src"], 3 | "ext": "ts", 4 | "ignore": ["src/**/*.spec.ts"], 5 | "exec": "node --inspect-brk -r ts-node/register src/main.ts" 6 | } -------------------------------------------------------------------------------- /nodemon.json: -------------------------------------------------------------------------------- 1 | { 2 | "watch": ["src"], 3 | "ext": "ts", 4 | "ignore": ["src/**/*.spec.ts"], 5 | "exec": "ts-node -r tsconfig-paths/register src/main.ts" 6 | } 7 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "nestjs-testing", 3 | "version": "0.0.0", 4 | "description": "description", 5 | "author": "", 6 | "license": "MIT", 7 | "scripts": { 8 | "format": "prettier --write \"src/**/*.ts\"", 9 | "start": "ts-node -r tsconfig-paths/register src/main.ts", 10 | "start:dev": "nodemon", 11 | "start:debug": "nodemon --config nodemon-debug.json", 12 | "prestart:prod": "rimraf dist && tsc", 13 | "start:prod": "node dist/main.js", 14 | "start:hmr": "node dist/server", 15 | "lint": "tslint -p tsconfig.json -c tslint.json", 16 | "test": "jest", 17 | "test:watch": "jest --watch", 18 | "test:cov": "jest --coverage", 19 | "test:e2e": "jest --config ./test/jest-e2e.json", 20 | "webpack": "webpack --config webpack.config.js" 21 | }, 22 | "dependencies": { 23 | "@nestjs/common": "^5.1.0", 24 | "@nestjs/core": "^5.1.0", 25 | "@nestjs/typeorm": "^5.2.2", 26 | "dotenv": "^6.0.0", 27 | "lodash": "^4.17.11", 28 | "pg": "^7.4.3", 29 | "reflect-metadata": "^0.1.12", 30 | "rxjs": "^6.2.2", 31 | "typeorm": "^0.2.7", 32 | "typescript": "^3.0.1" 33 | }, 34 | "devDependencies": { 35 | "@nestjs/testing": "^5.1.0", 36 | "@types/dotenv": "^4.0.3", 37 | "@types/express": "^4.16.0", 38 | "@types/jest": "^23.3.1", 39 | "@types/lodash": "^4.14.116", 40 | "@types/node": "^10.7.1", 41 | "@types/sinon": "^5.0.2", 42 | "@types/supertest": "^2.0.5", 43 | "jest": "^23.5.0", 44 | "nodemon": "^1.18.3", 45 | "prettier": "^1.14.2", 46 | "rimraf": "^2.6.2", 47 | "sinon": "^6.3.4", 48 | "supertest": "^3.1.0", 49 | "ts-jest": "^23.1.3", 50 | "ts-loader": "^4.4.2", 51 | "ts-node": "^7.0.1", 52 | "tsconfig-paths": "^3.5.0", 53 | "tslint": "5.11.0", 54 | "webpack": "^4.16.5", 55 | "webpack-cli": "^3.1.0", 56 | "webpack-node-externals": "^1.7.2" 57 | }, 58 | "jest": { 59 | "moduleFileExtensions": [ 60 | "js", 61 | "json", 62 | "ts" 63 | ], 64 | "rootDir": "src", 65 | "testRegex": ".spec.ts$", 66 | "transform": { 67 | "^.+\\.(t|j)s$": "ts-jest" 68 | }, 69 | "coverageDirectory": "../coverage", 70 | "testEnvironment": "node" 71 | } 72 | } 73 | -------------------------------------------------------------------------------- /src/app.module.ts: -------------------------------------------------------------------------------- 1 | import { Module } from '@nestjs/common'; 2 | import { NoteModule } from './note/note.module'; 3 | import { DatabaseModule } from './shared/database/database.module'; 4 | 5 | @Module({ 6 | imports: [NoteModule, DatabaseModule], 7 | }) 8 | export class AppModule {} 9 | -------------------------------------------------------------------------------- /src/main.ts: -------------------------------------------------------------------------------- 1 | import { NestFactory } from '@nestjs/core'; 2 | import { AppModule } from './app.module'; 3 | 4 | async function bootstrap() { 5 | const app = await NestFactory.create(AppModule); 6 | await app.listen(3000); 7 | } 8 | bootstrap(); 9 | -------------------------------------------------------------------------------- /src/note/dto/create-note.dto.ts: -------------------------------------------------------------------------------- 1 | export class CreateNoteDto { 2 | text: string; 3 | } 4 | -------------------------------------------------------------------------------- /src/note/dto/update-note-dto.ts: -------------------------------------------------------------------------------- 1 | export class UpdateNoteDto { 2 | text: string; 3 | isCompleted: boolean; 4 | } 5 | -------------------------------------------------------------------------------- /src/note/note.controller.ts: -------------------------------------------------------------------------------- 1 | import { 2 | Get, 3 | Post, 4 | Controller, 5 | HttpCode, 6 | HttpStatus, 7 | Body, 8 | Req, 9 | Param, 10 | ParamData, 11 | Patch, 12 | Delete, 13 | } from '@nestjs/common'; 14 | import { NoteService } from './note.service'; 15 | import { CreateNoteDto } from './dto/create-note.dto'; 16 | import { UpdateNoteDto } from './dto/update-note-dto'; 17 | 18 | @Controller('notes') 19 | export class NoteController { 20 | constructor(private readonly noteService: NoteService) {} 21 | 22 | @Post() 23 | @HttpCode(201) 24 | async saveNote(@Body() dto: CreateNoteDto) { 25 | return await this.noteService.saveNote(dto); 26 | } 27 | 28 | @Get() 29 | async getAllNote() { 30 | return await this.noteService.findAllNotes({}); 31 | } 32 | 33 | @Get('/:noteId') 34 | async getNoteById(@Param('noteId') noteId: string) { 35 | return await this.noteService.findOneNote({ 36 | where: { 37 | noteId, 38 | }, 39 | }); 40 | } 41 | 42 | @Patch('/:noteId') 43 | async updateNoteById( 44 | @Param('noteId') noteId: string, 45 | @Body() dto: UpdateNoteDto, 46 | ) { 47 | return await this.noteService.updateNote(noteId, dto); 48 | } 49 | 50 | @Delete('/:noteId') 51 | async deleteNoteById(@Param('noteId') noteId: string) { 52 | return await this.noteService.deleteNote(noteId); 53 | } 54 | } 55 | -------------------------------------------------------------------------------- /src/note/note.entity.ts: -------------------------------------------------------------------------------- 1 | import { 2 | Entity, 3 | PrimaryGeneratedColumn, 4 | Column, 5 | CreateDateColumn, 6 | } from 'typeorm'; 7 | 8 | @Entity({ name: 'notes' }) 9 | class Note { 10 | @PrimaryGeneratedColumn('uuid') 11 | noteId: string; 12 | 13 | @Column() 14 | text: string; 15 | 16 | @Column({ default: false }) 17 | isCompleted: boolean; 18 | 19 | @CreateDateColumn() 20 | createdAt: Date; 21 | } 22 | 23 | export default Note; 24 | -------------------------------------------------------------------------------- /src/note/note.module.ts: -------------------------------------------------------------------------------- 1 | import { Module } from '@nestjs/common'; 2 | import { NoteService } from './note.service'; 3 | import { TypeOrmModule } from '@nestjs/typeorm'; 4 | import Note from './note.entity'; 5 | import { NoteController } from './note.controller'; 6 | 7 | @Module({ 8 | imports: [TypeOrmModule.forFeature([Note])], 9 | controllers: [NoteController], 10 | providers: [NoteService], 11 | }) 12 | export class NoteModule {} 13 | -------------------------------------------------------------------------------- /src/note/note.service.spec.ts: -------------------------------------------------------------------------------- 1 | import { Test, TestingModule } from '@nestjs/testing'; 2 | import { NoteService } from './note.service'; 3 | import * as sinon from 'sinon'; 4 | import { getRepositoryToken } from '@nestjs/typeorm'; 5 | import Note from './note.entity'; 6 | import { Repository, FindOneOptions, FindManyOptions } from 'typeorm'; 7 | import { CreateNoteDto } from './dto/create-note.dto'; 8 | import { DatabaseService } from '../shared/database/database.service'; 9 | import { UpdateNoteDto } from './dto/update-note-dto'; 10 | 11 | describe('NoteService', () => { 12 | let noteService: NoteService; 13 | let sandbox: sinon.SinonSandbox; 14 | beforeAll(async () => { 15 | sandbox = sinon.createSandbox(); 16 | const module: TestingModule = await Test.createTestingModule({ 17 | providers: [ 18 | NoteService, 19 | { 20 | provide: getRepositoryToken(Note), 21 | useValue: sinon.createStubInstance(Repository), 22 | }, 23 | ], 24 | }).compile(); 25 | noteService = module.get(NoteService); 26 | }); 27 | 28 | it('should call saveNote method with expected params', async () => { 29 | const createNoteSpy = jest.spyOn(noteService, 'saveNote'); 30 | const dto = new CreateNoteDto(); 31 | noteService.saveNote(dto); 32 | expect(createNoteSpy).toHaveBeenCalledWith(dto); 33 | }); 34 | 35 | it('should call findOneNote method with expected param', async () => { 36 | const findOneNoteSpy = jest.spyOn(noteService, 'findOneNote'); 37 | const findOneOptions: FindOneOptions = {}; 38 | noteService.findOneNote(findOneOptions); 39 | expect(findOneNoteSpy).toHaveBeenCalledWith(findOneOptions); 40 | }); 41 | 42 | it('should call findAllNotes method with expected param', async () => { 43 | const findAllNotesSpy = jest.spyOn(noteService, 'findAllNotes'); 44 | const findAllOptions: FindManyOptions = {}; 45 | noteService.findAllNotes(findAllOptions); 46 | expect(findAllNotesSpy).toHaveBeenCalledWith(findAllOptions); 47 | }); 48 | 49 | it('should call updateNote method with expected params', async () => { 50 | const updateNoteSpy = jest.spyOn(noteService, 'updateNote'); 51 | const noteId = 'noteId'; 52 | const dto = new UpdateNoteDto(); 53 | noteService.updateNote(noteId, dto); 54 | expect(updateNoteSpy).toHaveBeenCalledWith(noteId, dto); 55 | }); 56 | 57 | it('should call deleteNote method with expected param', async () => { 58 | const deleteNoteSpy = jest.spyOn(noteService, 'deleteNote'); 59 | const noteId = 'noteId'; 60 | noteService.deleteNote(noteId); 61 | expect(deleteNoteSpy).toHaveBeenCalledWith(noteId); 62 | }); 63 | 64 | afterAll(async () => { 65 | sandbox.restore(); 66 | }); 67 | }); 68 | -------------------------------------------------------------------------------- /src/note/note.service.ts: -------------------------------------------------------------------------------- 1 | import { Injectable } from '@nestjs/common'; 2 | import { CreateNoteDto } from './dto/create-note.dto'; 3 | import { InjectRepository } from '@nestjs/typeorm'; 4 | import { Repository, FindOneOptions, FindManyOptions } from 'typeorm'; 5 | import Note from './note.entity'; 6 | import * as _ from 'lodash'; 7 | import { UpdateNoteDto } from './dto/update-note-dto'; 8 | 9 | @Injectable() 10 | export class NoteService { 11 | constructor( 12 | @InjectRepository(Note) private readonly noteRepository: Repository, 13 | ) {} 14 | async saveNote(dto: CreateNoteDto) { 15 | const note = new Note(); 16 | note.text = dto.text; 17 | return await this.noteRepository.save(note); 18 | } 19 | 20 | async findAllNotes(findAllOptions: FindManyOptions) { 21 | return await this.noteRepository.find(findAllOptions); 22 | } 23 | 24 | async findOneNote(findOneOptions: FindOneOptions) { 25 | return await this.noteRepository.findOne(findOneOptions); 26 | } 27 | 28 | async updateNote(noteId: string, dto: UpdateNoteDto) { 29 | const foundNote = await this.findOneNote({ 30 | where: { noteId }, 31 | }); 32 | return await this.noteRepository.save(_.merge(foundNote, dto)); 33 | } 34 | 35 | async deleteNote(noteId: string) { 36 | const foundNote = await this.findOneNote({ 37 | where: { noteId }, 38 | }); 39 | 40 | await this.noteRepository.delete(foundNote); 41 | return foundNote; 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /src/shared/database/database.module.ts: -------------------------------------------------------------------------------- 1 | import { Module } from '@nestjs/common'; 2 | import { DatabaseService } from './database.service'; 3 | import { TypeOrmModule } from '@nestjs/typeorm'; 4 | 5 | @Module({ 6 | imports: [ 7 | TypeOrmModule.forRoot({ 8 | type: 'postgres', 9 | host: 'localhost', 10 | port: 5432, 11 | database: 'nestjs_testing', 12 | username: 'postgres', 13 | password: 'postgres', 14 | entities: [process.cwd() + '/src/**/*.entity{.ts,.js}'], 15 | synchronize: true, 16 | }), 17 | ], 18 | providers: [DatabaseService], 19 | exports: [DatabaseService], 20 | }) 21 | export class DatabaseModule {} 22 | -------------------------------------------------------------------------------- /src/shared/database/database.service.spec.ts: -------------------------------------------------------------------------------- 1 | import { Test, TestingModule } from '@nestjs/testing'; 2 | import { DatabaseService } from './database.service'; 3 | import * as sinon from 'sinon'; 4 | import { getConnection, Connection } from 'typeorm'; 5 | import { getConnectionToken } from '@nestjs/typeorm'; 6 | 7 | describe('DatabaseService', () => { 8 | let service: DatabaseService; 9 | let sandbox: sinon.SinonSandbox; 10 | beforeAll(async () => { 11 | sandbox = sinon.createSandbox(); 12 | const module: TestingModule = await Test.createTestingModule({ 13 | providers: [ 14 | DatabaseService, 15 | { 16 | provide: getConnectionToken(), 17 | useValue: sandbox.createStubInstance(Connection), 18 | }, 19 | ], 20 | }).compile(); 21 | service = module.get(DatabaseService); 22 | }); 23 | 24 | afterAll(async () => { 25 | sandbox.restore(); 26 | }); 27 | 28 | it('should be defined', () => { 29 | expect(service).toBeDefined(); 30 | }); 31 | }); 32 | -------------------------------------------------------------------------------- /src/shared/database/database.service.ts: -------------------------------------------------------------------------------- 1 | import { Injectable, Inject } from '@nestjs/common'; 2 | import { Connection, Repository } from 'typeorm'; 3 | import { InjectConnection } from '@nestjs/typeorm'; 4 | 5 | @Injectable() 6 | export class DatabaseService { 7 | constructor(@InjectConnection() public connection: Connection) {} 8 | 9 | async getRepository(entity): Promise> { 10 | return this.connection.getRepository(entity); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /test/jest-e2e.json: -------------------------------------------------------------------------------- 1 | { 2 | "moduleFileExtensions": ["js", "json", "ts"], 3 | "rootDir": ".", 4 | "testEnvironment": "node", 5 | "testRegex": ".e2e-spec.ts$", 6 | "transform": { 7 | "^.+\\.(t|j)s$": "ts-jest" 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /test/mock.factory.ts: -------------------------------------------------------------------------------- 1 | import { CreateNoteDto } from '../src/note/dto/create-note.dto'; 2 | import { UpdateNoteDto } from '../src/note/dto/update-note-dto'; 3 | 4 | export class MockFactory { 5 | genCreateNoteDto() { 6 | const dto = new CreateNoteDto(); 7 | dto.text = 'Learn Testing'; 8 | return dto; 9 | } 10 | 11 | genUpdateNoteDto() { 12 | const dto = new UpdateNoteDto(); 13 | dto.isCompleted = true; 14 | return dto; 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /test/note.e2e-spec.ts: -------------------------------------------------------------------------------- 1 | import { INestApplication } from '@nestjs/common'; 2 | import { Test } from '@nestjs/testing'; 3 | import * as request from 'supertest'; 4 | import { MockFactory } from './mock.factory'; 5 | import { AppModule } from '../src/app.module'; 6 | import { DatabaseModule } from '../src/shared/database/database.module'; 7 | import { DatabaseService } from '../src/shared/database/database.service'; 8 | import { TestUtils } from './test.utils'; 9 | 10 | describe('/notes (e2e)', () => { 11 | let app: INestApplication; 12 | let testUtils: TestUtils; 13 | const mockFactory = new MockFactory(); 14 | const newNote = mockFactory.genCreateNoteDto(); 15 | const updateNote = mockFactory.genUpdateNoteDto(); 16 | 17 | beforeEach(async () => { 18 | const moduleFixture = await Test.createTestingModule({ 19 | imports: [AppModule, DatabaseModule], 20 | providers: [DatabaseService, TestUtils], 21 | }).compile(); 22 | 23 | testUtils = moduleFixture.get(TestUtils); 24 | await testUtils.resetDb(); 25 | app = moduleFixture.createNestApplication(); 26 | await app.init(); 27 | }); 28 | 29 | afterEach(async done => { 30 | await testUtils.resetDb(); 31 | await testUtils.closeDbConnection(); 32 | done(); 33 | }); 34 | 35 | it('POST Note', async () => { 36 | try { 37 | const response = await request(app.getHttpServer()) 38 | .post('/notes') 39 | .send(newNote) 40 | .set('Content-Type', 'application/json') 41 | .set('Accept', 'application/json'); 42 | 43 | expect(response.status).toBe(201); 44 | expect(typeof response.body).toBe('object'); 45 | expect(response.body).toHaveProperty('noteId'); 46 | expect(response.body).toHaveProperty('createdAt'); 47 | expect(response.body).toHaveProperty('isCompleted'); 48 | expect(response.body.text).toBe(newNote.text); 49 | expect(response.body.isCompleted).toBe(false); 50 | } catch (err) { 51 | throw err; 52 | } 53 | }); 54 | 55 | it('GET Note by noteId', async () => { 56 | try { 57 | const createNoteResponse = await request(app.getHttpServer()) 58 | .post('/notes') 59 | .send(newNote) 60 | .set('Content-Type', 'application/json') 61 | .set('Accept', 'application/json'); 62 | const getNoteResponse = await request(app.getHttpServer()) 63 | .get(`/notes/${createNoteResponse.body.noteId}`) 64 | .set('Content-Type', 'application/json') 65 | .set('Accept', 'application/json'); 66 | 67 | expect(getNoteResponse.status).toBe(200); 68 | expect(typeof getNoteResponse.body).toBe('object'); 69 | expect(getNoteResponse.body.noteId).toBe(createNoteResponse.body.noteId); 70 | } catch (err) { 71 | throw err; 72 | } 73 | }); 74 | 75 | it('GET all Notes', async () => { 76 | try { 77 | const createNoteResponse = await request(app.getHttpServer()) 78 | .post('/notes') 79 | .send(newNote) 80 | .set('Content-Type', 'application/json') 81 | .set('Accept', 'application/json'); 82 | 83 | const getNotesResponse = await request(app.getHttpServer()) 84 | .get(`/notes`) 85 | .set('Content-Type', 'application/json') 86 | .set('Accept', 'application/json'); 87 | 88 | expect(getNotesResponse.status).toBe(200); 89 | expect(typeof getNotesResponse.body).toBe('object'); 90 | expect(getNotesResponse.body).toHaveLength(1); 91 | expect(getNotesResponse.body[0].noteId).toBe( 92 | createNoteResponse.body.noteId, 93 | ); 94 | } catch (err) { 95 | throw err; 96 | } 97 | }); 98 | 99 | it('PATCH Note by noteId', async () => { 100 | const createNoteResponse = await request(app.getHttpServer()) 101 | .post('/notes') 102 | .send(newNote) 103 | .set('Content-Type', 'application/json') 104 | .set('Accept', 'application/json'); 105 | 106 | const updateNoteResponse = await request(app.getHttpServer()) 107 | .patch(`/notes/${createNoteResponse.body.noteId}`) 108 | .send(updateNote) 109 | .set('Content-Type', 'application/json') 110 | .set('Accept', 'application/json'); 111 | 112 | expect(updateNoteResponse.status).toBe(200); 113 | expect(typeof updateNoteResponse).toBe('object'); 114 | expect(updateNoteResponse.body.isCompleted).toBe(updateNote.isCompleted); 115 | }); 116 | 117 | it('DELETE Note by noteId', async () => { 118 | const createNoteResponse = await request(app.getHttpServer()) 119 | .post('/notes') 120 | .send(newNote) 121 | .set('Content-Type', 'application/json') 122 | .set('Accept', 'application/json'); 123 | 124 | const deleteNoteResponse = await request(app.getHttpServer()) 125 | .delete(`/notes/${createNoteResponse.body.noteId}`) 126 | .set('Content-Type', 'application/json') 127 | .set('Accept', 'application/json'); 128 | 129 | expect(deleteNoteResponse.status).toBe(200); 130 | expect(typeof deleteNoteResponse.body).toBe('object'); 131 | expect(deleteNoteResponse.body.noteId).toBe(createNoteResponse.body.noteId); 132 | }); 133 | }); 134 | -------------------------------------------------------------------------------- /test/test.utils.ts: -------------------------------------------------------------------------------- 1 | import { Injectable } from '@nestjs/common'; 2 | import { DatabaseService } from '../src/shared/database/database.service'; 3 | import * as Path from 'path'; 4 | import * as fs from 'fs'; 5 | 6 | /** 7 | * This class is used to support database 8 | * tests with unit tests in NestJS. 9 | * 10 | * This class is inspired by https://github.com/jgordor 11 | * https://github.com/nestjs/nest/issues/409#issuecomment-364639051 12 | */ 13 | @Injectable() 14 | export class TestUtils { 15 | databaseService: DatabaseService; 16 | 17 | /** 18 | * Creates an instance of TestUtils 19 | */ 20 | constructor(databaseService: DatabaseService) { 21 | if (process.env.NODE_ENV !== 'test') { 22 | throw new Error('ERROR-TEST-UTILS-ONLY-FOR-TESTS'); 23 | } 24 | this.databaseService = databaseService; 25 | } 26 | 27 | /** 28 | * Shutdown the http server 29 | * and close database connections 30 | */ 31 | async shutdownServer(server) { 32 | await server.httpServer.close(); 33 | await this.closeDbConnection(); 34 | } 35 | 36 | /** 37 | * Closes the database connections 38 | */ 39 | async closeDbConnection() { 40 | const connection = await this.databaseService.connection; 41 | if (connection.isConnected) { 42 | await (await this.databaseService.connection).close(); 43 | } 44 | } 45 | 46 | /** 47 | * Returns the entites of the database 48 | */ 49 | private async getEntities() { 50 | const entities = []; 51 | (await (await this.databaseService.connection).entityMetadatas).forEach(x => 52 | entities.push({ name: x.name, tableName: x.tableName }), 53 | ); 54 | return entities; 55 | } 56 | 57 | /** 58 | * Cleans the database and reloads the entries 59 | */ 60 | 61 | async resetDb() { 62 | const entities = await this.getEntities(); 63 | await this.cleanAll(entities); 64 | } 65 | 66 | /** 67 | * Cleans all the entities 68 | */ 69 | private async cleanAll(entities) { 70 | try { 71 | for (const entity of entities) { 72 | const repository = await this.databaseService.getRepository( 73 | entity.name, 74 | ); 75 | await repository.query(`DELETE FROM ${entity.tableName};`); 76 | } 77 | } catch (error) { 78 | throw new Error(`ERROR: Cleaning test db: ${error}`); 79 | } 80 | } 81 | } 82 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "module": "commonjs", 4 | "declaration": true, 5 | "noImplicitAny": false, 6 | "removeComments": true, 7 | "noLib": false, 8 | "allowSyntheticDefaultImports": true, 9 | "emitDecoratorMetadata": true, 10 | "experimentalDecorators": true, 11 | "target": "es6", 12 | "sourceMap": true, 13 | "outDir": "./dist", 14 | "baseUrl": "./src" 15 | }, 16 | "include": ["src/**/*", "test/note.e2e-spec.ts", "test/mock.factory.ts"], 17 | "exclude": ["node_modules", "**/*.spec.ts"] 18 | } 19 | -------------------------------------------------------------------------------- /tsconfig.spec.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "tsconfig.json", 3 | "compilerOptions": { 4 | "types": ["jest", "node"] 5 | }, 6 | "include": ["**/*.spec.ts", "**/*.d.ts"] 7 | } 8 | -------------------------------------------------------------------------------- /tslint.json: -------------------------------------------------------------------------------- 1 | { 2 | "defaultSeverity": "error", 3 | "extends": ["tslint:recommended"], 4 | "jsRules": { 5 | "no-unused-expression": true 6 | }, 7 | "rules": { 8 | "no-console": false, 9 | "eofline": false, 10 | "quotemark": [true, "single"], 11 | "indent": false, 12 | "member-access": [false], 13 | "ordered-imports": [false], 14 | "max-line-length": [true, 150], 15 | "member-ordering": [false], 16 | "curly": false, 17 | "interface-name": [false], 18 | "array-type": [false], 19 | "no-empty-interface": false, 20 | "no-empty": false, 21 | "arrow-parens": false, 22 | "object-literal-sort-keys": false, 23 | "no-unused-expression": false, 24 | "max-classes-per-file": [false], 25 | "variable-name": [false], 26 | "one-line": [false], 27 | "one-variable-per-declaration": [false] 28 | }, 29 | "rulesDirectory": [] 30 | } 31 | --------------------------------------------------------------------------------