From 6345edb25896888c4b0b319492b5def3656415b0 Mon Sep 17 00:00:00 2001 From: cabbage556 Date: Fri, 31 Mar 2023 15:02:06 +0900 Subject: [PATCH 1/2] =?UTF-8?q?test:=20dogs.service.spec.ts=20=ED=8C=8C?= =?UTF-8?q?=EC=9D=BC=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit test-#152 --- src/apis/dogs/__test__/dogs.service.spec.ts | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 src/apis/dogs/__test__/dogs.service.spec.ts diff --git a/src/apis/dogs/__test__/dogs.service.spec.ts b/src/apis/dogs/__test__/dogs.service.spec.ts new file mode 100644 index 0000000..2d451da --- /dev/null +++ b/src/apis/dogs/__test__/dogs.service.spec.ts @@ -0,0 +1,20 @@ +import { Test } from '@nestjs/testing'; +import { DogsService } from '../dogs.service'; + +const mockDogsRepository = {}; + +describe('DogsService', () => { + let dogsService: DogsService; + + beforeEach(async () => { + const dogsModule = await Test.createTestingModule({ + providers: [DogsService], + }).compile(); + + dogsService = dogsModule.get(DogsService); + }); + + it('dogsService가 정의되어야 함', () => { + expect(dogsService).toBeDefined(); + }); +}); From 6b031d439c597dfb786a9913baf5d5f945279a22 Mon Sep 17 00:00:00 2001 From: cabbage556 Date: Sat, 1 Apr 2023 19:07:10 +0900 Subject: [PATCH 2/2] test: dogs.service.spec.ts MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - dogs 서비스 로직 테스트코드 작성 - dogs mock 데이터 파일 생성 test-#152 --- src/apis/dogs/__test__/dogs.mocking.ts | 42 ++++++ src/apis/dogs/__test__/dogs.service.spec.ts | 142 +++++++++++++++++++- 2 files changed, 181 insertions(+), 3 deletions(-) create mode 100644 src/apis/dogs/__test__/dogs.mocking.ts diff --git a/src/apis/dogs/__test__/dogs.mocking.ts b/src/apis/dogs/__test__/dogs.mocking.ts new file mode 100644 index 0000000..27ae5af --- /dev/null +++ b/src/apis/dogs/__test__/dogs.mocking.ts @@ -0,0 +1,42 @@ +import { DOG_TYPE } from '../enum/dog-type.enum'; + +export const MOCK_USER = { + id: 'c84fa63e-7a05-4cd5-b015-d4db9a262b18', + name: '댕댕이주인', + email: 'example@example.com', + password: '$2b$10$RgW8TvWwmzlt2DH499dFuONDmeLdDaNxokZ6vL60iGgzoOMvbtuhy', + phone: '01012341234', + image: + 'https://storage.cloud.google.com/groomeong-storage/origin/profile/a6c16f50-2946-4dfb-9785-a782cea6c570/%03b%EF%BF%BD2.jpeg', + createAt: '2023-03-21 12:00:02.011088', + deleteAt: null, + updateAt: '2023-03-21 12:00:02.011088', +}; + +export const MOCK_DOG = { + id: '3ce6246c-f37a-426e-b95a-b38ec6d55f4e', + name: '댕댕이', + age: 5, + weight: 4.5, + breed: DOG_TYPE.SMALL, + specifics: '성격이 착해요', + image: + 'https://storage.cloud.google.com/groomeong-storage/origin/dog/a6c16f50-2946-4dfb-9785-a782cea6c570/%03b%EF%BF%BD2.jpeg', + createdAt: '2023-03-21 12:13:02.011088', + deletedAt: null, + userId: 'c84fa63e-7a05-4cd5-b015-d4db9a262b18', +}; + +export const UPDATED_MOCK_DOG = { + id: '3ce6246c-f37a-426e-b95a-b38ec6d55f4e', + name: '댕댕이', + age: 5, + weight: 10.5, + breed: DOG_TYPE.LARGE, + specifics: '성격이 착해요', + image: + 'https://storage.cloud.google.com/groomeong-storage/origin/dog/a6c16f50-2946-4dfb-9785-a782cea6c570/%03b%EF%BF%BD2.jpeg', + createdAt: '2023-03-21 12:13:02.011088', + deletedAt: null, + userId: 'c84fa63e-7a05-4cd5-b015-d4db9a262b18', +}; diff --git a/src/apis/dogs/__test__/dogs.service.spec.ts b/src/apis/dogs/__test__/dogs.service.spec.ts index 2d451da..fc8f50c 100644 --- a/src/apis/dogs/__test__/dogs.service.spec.ts +++ b/src/apis/dogs/__test__/dogs.service.spec.ts @@ -1,14 +1,30 @@ +import { NotFoundException } from '@nestjs/common'; import { Test } from '@nestjs/testing'; +import { getRepositoryToken } from '@nestjs/typeorm'; import { DogsService } from '../dogs.service'; - -const mockDogsRepository = {}; +import { CreateDogInput } from '../dto/create-dog.input'; +import { UpdateDogInput } from '../dto/update-dog.input'; +import { Dog } from '../entities/dog.entity'; +import { MOCK_DOG, MOCK_USER, UPDATED_MOCK_DOG } from './dogs.mocking'; describe('DogsService', () => { let dogsService: DogsService; + const mockDogsRepository = { + findOne: jest.fn(), + findBy: jest.fn(), + save: jest.fn(), + softDelete: jest.fn(), + }; beforeEach(async () => { const dogsModule = await Test.createTestingModule({ - providers: [DogsService], + providers: [ + DogsService, + { + provide: getRepositoryToken(Dog), // + useValue: mockDogsRepository, + }, + ], }).compile(); dogsService = dogsModule.get(DogsService); @@ -17,4 +33,124 @@ describe('DogsService', () => { it('dogsService가 정의되어야 함', () => { expect(dogsService).toBeDefined(); }); + + describe('findOneById', () => { + it('강아지를 찾지 못하면 NotFoundException을 던져야 함', () => { + const inValidMockId = '3ce6246c-f37a-426e-b95a-b38ec6d55f4f'; + + mockDogsRepository.findOne.mockResolvedValueOnce(null); + expect( + dogsService.findOneById({ id: inValidMockId }), + ).rejects.toThrowError(NotFoundException); + }); + + it('id에 해당하는 강아지 정보를 리턴해야 함', async () => { + const validMockId = MOCK_DOG.id; + + mockDogsRepository.findOne.mockResolvedValueOnce(MOCK_DOG); + const result = await dogsService.findOneById({ id: validMockId }); + expect(result).toEqual(MOCK_DOG); + }); + }); + + describe('findByUserId', () => { + it('유저의 강아지 정보를 배열로 리턴해야 함', async () => { + const mockUserId = MOCK_DOG.userId; + const mockDogs = [ + MOCK_DOG, // + { ...MOCK_DOG }, + { ...MOCK_DOG }, + ]; + mockDogsRepository.findBy.mockResolvedValueOnce(mockDogs); + const result = await dogsService.findByUserId({ userId: mockUserId }); + expect(result).toEqual(mockDogs); + }); + + it('유저의 강아지 정보가 없다면 빈 배열을 리턴해야 함', async () => { + const mockUserId = 'c84fa63e-7a05-4cd5-b015-d4db9a262b11'; + mockDogsRepository.findBy.mockResolvedValueOnce([]); + const result = await dogsService.findByUserId({ userId: mockUserId }); + expect(result).toEqual([]); + }); + }); + + describe('create', () => { + it('강아지를 생성하고 생성한 강아지 정보를 리턴해야 함', async () => { + const createDogInput: CreateDogInput = { + name: MOCK_DOG.name, + age: MOCK_DOG.age, + breed: MOCK_DOG.breed, + weight: MOCK_DOG.weight, + specifics: MOCK_DOG.specifics, + image: MOCK_DOG.image, + }; + const createdDog = { + id: MOCK_DOG.id, + name: MOCK_DOG.name, + age: MOCK_DOG.age, + breed: MOCK_DOG.breed, + weight: MOCK_DOG.weight, + specifics: MOCK_DOG.specifics, + image: MOCK_DOG.image, + createdAt: new Date(), + deletedAt: null, + userId: MOCK_USER.id, + }; + mockDogsRepository.save.mockResolvedValueOnce(createdDog); + + const result = await dogsService.create({ + createDogInput, + userId: MOCK_USER.id, + }); + expect(result).toEqual(createdDog); + }); + }); + + describe('updateOneById', () => { + const updateDogInput: UpdateDogInput = { + name: UPDATED_MOCK_DOG.name, + age: UPDATED_MOCK_DOG.age, + weight: UPDATED_MOCK_DOG.weight, + breed: UPDATED_MOCK_DOG.breed, + image: UPDATED_MOCK_DOG.image, + specifics: UPDATED_MOCK_DOG.specifics, + }; + + it('강아지를 찾지 못하면 NotFoundException을 던져야 함', () => { + const inValidMockId = '3ce6246c-f37a-426e-b95a-b38ec6d55f4f'; + mockDogsRepository.findOne.mockResolvedValueOnce(null); + expect( + dogsService.updateOneById({ id: inValidMockId, updateDogInput }), + ).rejects.toThrowError(NotFoundException); + }); + + it('업데이트한 강아지 정보를 리턴해야 함', async () => { + mockDogsRepository.findOne.mockResolvedValueOnce(MOCK_DOG); + mockDogsRepository.save.mockResolvedValueOnce(UPDATED_MOCK_DOG); + + const result = await dogsService.updateOneById({ + id: MOCK_DOG.id, + updateDogInput, + }); + expect(result).toEqual(UPDATED_MOCK_DOG); + }); + }); + + describe('deleteOneById', () => { + it('강아지를 찾지 못하면 NotFoundException을 던져야 함', () => { + const invalidMockId = '3ce6246c-f37a-426e-b95a-b38ec6d55f4f'; + mockDogsRepository.findOne.mockResolvedValueOnce(null); + expect( + dogsService.deleteOneById({ id: invalidMockId, userId: MOCK_USER.id }), + ).rejects.toThrowError(NotFoundException); + }); + + it('삭제 여부 true를 반환해야 함', () => { + mockDogsRepository.findOne.mockResolvedValueOnce(MOCK_DOG); + mockDogsRepository.softDelete.mockResolvedValueOnce(true); + expect( + dogsService.deleteOneById({ id: MOCK_DOG.id, userId: MOCK_USER.id }), + ).toBeTruthy(); + }); + }); });