diff --git a/sample/05-sql-typeorm/jest.json b/sample/05-sql-typeorm/jest.json new file mode 100644 index 00000000000..dc660f0f260 --- /dev/null +++ b/sample/05-sql-typeorm/jest.json @@ -0,0 +1,14 @@ +{ + "moduleFileExtensions": [ + "ts", + "tsx", + "js", + "json" + ], + "transform": { + "^.+\\.tsx?$": "babel-jest" + }, + "testRegex": "/src/.*\\.(test|spec).(ts|tsx|js)$", + "collectCoverageFrom" : ["src/**/*.{js,jsx,tsx,ts}", "!**/node_modules/**", "!**/vendor/**"], + "coverageReporters": ["json", "lcov"] + } \ No newline at end of file diff --git a/sample/05-sql-typeorm/package-lock.json b/sample/05-sql-typeorm/package-lock.json index 6581898d1fc..280b281f0c8 100644 --- a/sample/05-sql-typeorm/package-lock.json +++ b/sample/05-sql-typeorm/package-lock.json @@ -1888,6 +1888,16 @@ "@types/istanbul-lib-report": "*" } }, + "@types/jest": { + "version": "27.0.1", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-27.0.1.tgz", + "integrity": "sha512-HTLpVXHrY69556ozYkcq47TtQJXpcWAWfkoqz+ZGz2JnmZhzlRjprCIyFnetSy8gpDWwTTGBcRVv1J1I1vBrHw==", + "dev": true, + "requires": { + "jest-diff": "^27.0.0", + "pretty-format": "^27.0.0" + } + }, "@types/json-schema": { "version": "7.0.8", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.8.tgz", diff --git a/sample/05-sql-typeorm/package.json b/sample/05-sql-typeorm/package.json index 3ef2cf9581f..ec24f6adbac 100644 --- a/sample/05-sql-typeorm/package.json +++ b/sample/05-sql-typeorm/package.json @@ -34,6 +34,7 @@ "@nestjs/schematics": "8.0.3", "@nestjs/testing": "8.1.1", "@types/express": "4.17.13", + "@types/jest": "27.0.1", "@types/node": "14.17.27", "@types/supertest": "2.0.11", "@types/ws": "7.4.7", @@ -50,5 +51,22 @@ "eslint-config-prettier": "8.3.0", "eslint-plugin-import": "2.25.2", "typescript": "4.3.5" + }, + "jest": { + "moduleFileExtensions": [ + "js", + "json", + "ts" + ], + "rootDir": "src", + "testRegex": ".spec.ts$", + "transform": { + "^.+\\.(t|j)s$": "ts-jest" + }, + "collectCoverageFrom": [ + "**/*.(t|j)s" + ], + "coverageDirectory": "../coverage", + "testEnvironment": "node" } } diff --git a/sample/05-sql-typeorm/src/users/users.controller.spec.ts b/sample/05-sql-typeorm/src/users/users.controller.spec.ts new file mode 100644 index 00000000000..199cea13bee --- /dev/null +++ b/sample/05-sql-typeorm/src/users/users.controller.spec.ts @@ -0,0 +1,94 @@ +import { Test, TestingModule } from '@nestjs/testing'; +import { CreateUserDto } from './dto/create-user.dto'; +import { UsersController } from './users.controller'; +import { UsersService } from './users.service'; + +const createUserDto: CreateUserDto = { + firstName: 'firstName #1', + lastName: 'lastName #1', +}; + +describe('UsersController', () => { + let usersController: UsersController; + let usersService: UsersService; + + beforeEach(async () => { + const app: TestingModule = await Test.createTestingModule({ + controllers: [UsersController], + providers: [ + UsersService, + { + provide: UsersService, + useValue: { + create: jest + .fn() + .mockImplementation((user: CreateUserDto) => + Promise.resolve({ id: '1', ...user }), + ), + findAll: jest.fn().mockResolvedValue([ + { + firstName: 'firstName #1', + lastName: 'lastName #1', + }, + { + firstName: 'firstName #2', + lastName: 'lastName #2', + }, + ]), + findOne: jest.fn().mockImplementation((id: string) => + Promise.resolve({ + firstName: 'firstName #1', + lastName: 'lastName #1', + id, + }), + ), + remove: jest.fn(), + }, + }, + ], + }).compile(); + + usersController = app.get(UsersController); + usersService = app.get(UsersService); + }); + + it('should be defined', () => { + expect(usersController).toBeDefined(); + }); + + describe('create()', () => { + it('should create a user', () => { + usersController.create(createUserDto); + expect(usersController.create(createUserDto)).resolves.toEqual({ + id: '1', + ...createUserDto, + }); + expect(usersService.create).toHaveBeenCalledWith(createUserDto); + }); + }); + + describe('findAll()', () => { + it('should find all users ', () => { + usersController.findAll(); + expect(usersService.findAll).toHaveBeenCalled(); + }); + }); + + describe('findOne()', () => { + it('should find a user', () => { + expect(usersController.findOne('1')).resolves.toEqual({ + firstName: 'firstName #1', + lastName: 'lastName #1', + id: '1', + }); + expect(usersService.findOne).toHaveBeenCalled(); + }); + }); + + describe('remove()', () => { + it('should remove the user', () => { + usersController.remove('2'); + expect(usersService.remove).toHaveBeenCalled(); + }); + }); +}); diff --git a/sample/05-sql-typeorm/src/users/users.service.spec.ts b/sample/05-sql-typeorm/src/users/users.service.spec.ts new file mode 100644 index 00000000000..46c8b7eda6b --- /dev/null +++ b/sample/05-sql-typeorm/src/users/users.service.spec.ts @@ -0,0 +1,91 @@ +import { Test, TestingModule } from '@nestjs/testing'; +import { getRepositoryToken } from '@nestjs/typeorm'; +import { User } from './user.entity'; +import { UsersService } from './users.service'; +import { Repository } from 'typeorm'; + +const userArray = [ + { + firstName: 'firstName #1', + lastName: 'lastName #1', + }, + { + firstName: 'firstName #2', + lastName: 'lastName #2', + }, +]; + +const oneUser = { + firstName: 'firstName #1', + lastName: 'lastName #1', +}; + +describe('UserService', () => { + let service: UsersService; + let repository: Repository; + + beforeEach(async () => { + const module: TestingModule = await Test.createTestingModule({ + providers: [ + UsersService, + { + provide: getRepositoryToken(User), + useValue: { + find: jest.fn().mockResolvedValue(userArray), + findOne: jest.fn().mockResolvedValue(oneUser), + save: jest.fn().mockResolvedValue(oneUser), + remove: jest.fn(), + delete: jest.fn(), + }, + }, + ], + }).compile(); + + service = module.get(UsersService); + repository = module.get>(getRepositoryToken(User)); + }); + + it('should be defined', () => { + expect(service).toBeDefined(); + }); + + describe('create()', () => { + it('should successfully insert a user', () => { + const oneUser = { + firstName: 'firstName #1', + lastName: 'lastName #1', + }; + + expect( + service.create({ + firstName: 'firstName #1', + lastName: 'lastName #1', + }), + ).resolves.toEqual(oneUser); + }); + }); + + describe('findAll()', () => { + it('should return an array of users', async () => { + const users = await service.findAll(); + expect(users).toEqual(userArray); + }); + }); + + describe('findOne()', () => { + it('should get a single user', () => { + const repoSpy = jest.spyOn(repository, 'findOne'); + expect(service.findOne('1')).resolves.toEqual(oneUser); + expect(repoSpy).toBeCalledWith('1'); + }); + }); + + describe('remove()', () => { + it('should call remove with the passed value', async () => { + const removeSpy = jest.spyOn(repository, 'delete'); + const retVal = await service.remove('2'); + expect(removeSpy).toBeCalledWith('2'); + expect(retVal).toBeUndefined(); + }); + }); +});