From 86c83d2acdf3889e3ce3c0360e0248aefb77101b Mon Sep 17 00:00:00 2001 From: cabbage556 Date: Mon, 3 Apr 2023 16:59:15 +0900 Subject: [PATCH] =?UTF-8?q?test:=20DogsResolver=20=ED=85=8C=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=EC=BD=94=EB=93=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit test-#173 --- src/apis/dogs/__test__/dogs.resolver.spec.ts | 148 ++++++++++++------- 1 file changed, 98 insertions(+), 50 deletions(-) diff --git a/src/apis/dogs/__test__/dogs.resolver.spec.ts b/src/apis/dogs/__test__/dogs.resolver.spec.ts index 0f7eda3..f6634df 100644 --- a/src/apis/dogs/__test__/dogs.resolver.spec.ts +++ b/src/apis/dogs/__test__/dogs.resolver.spec.ts @@ -9,6 +9,9 @@ import { User } from 'src/apis/users/entities/user.entity'; import { CreateDogInput } from '../dto/create-dog.input'; import { UpdateDogInput } from '../dto/update-dog.input'; import { MOCK_DOG, MOCK_USER, UPDATED_MOCK_DOG } from './dogs.mocking'; +import { getRepositoryToken } from '@nestjs/typeorm'; +import { Dog } from '../entities/dog.entity'; +import { DOG_TYPE } from '../enum/dog-type.enum'; describe('DogsResolver', () => { let dogsResolver: DogsResolver; @@ -35,6 +38,14 @@ describe('DogsResolver', () => { deleteOneById: jest.fn(), }; + // Mock Repository + const mockDogsRepository = { + findOne: jest.fn(), + findBy: jest.fn(), + save: jest.fn(), + softDelete: jest.fn(), + }; + beforeEach(async () => { const dogsModule = await Test.createTestingModule({ providers: [ @@ -43,6 +54,10 @@ describe('DogsResolver', () => { provide: DogsService, useValue: mockDogsService, }, + { + provide: getRepositoryToken(Dog), + useValue: mockDogsRepository, + }, { provide: GqlAuthGuard, useValue: mockAuthGuard, @@ -59,43 +74,49 @@ describe('DogsResolver', () => { describe('fetchDog', () => { it('id에 해당하는 강아지 정보를 리턴해야 함', async () => { - mockDogsService.findOneById.mockResolvedValueOnce(MOCK_DOG); + mockDogsRepository.findOne.mockImplementation( + (where: { id: string }, relations: { user: true }) => MOCK_DOG, + ); + mockDogsService.findOneById.mockImplementation((id: string) => MOCK_DOG); const result = await dogsResolver.fetchDog(MOCK_DOG.id); + expect(result).toEqual(MOCK_DOG); expect(mockDogsService.findOneById).toHaveBeenCalledWith({ id: MOCK_DOG.id, }); - expect(result).toEqual(MOCK_DOG); }); it('강아지를 찾을 수 없는 경우 NotFoundException을 던져야 함', () => { const invalidMockId = '3ce6246c-f37a-426e-b95a-b38ec6d55f4f'; - mockDogsService.findOneById.mockRejectedValue( - new NotFoundException( - `id ${invalidMockId}를 갖는 강아지를 찾을 수 없음`, - ), + mockDogsRepository.findOne.mockImplementation( + (where: { id: string }) => null, ); - expect(dogsResolver.fetchDog(invalidMockId)).rejects.toThrowError( - new NotFoundException( + try { + dogsResolver.fetchDog(invalidMockId); + } catch (error) { + expect(error).toBeInstanceOf(NotFoundException); + expect(error.message).toBe( `id ${invalidMockId}를 갖는 강아지를 찾을 수 없음`, - ), - ); - expect(mockDogsService.findOneById).toHaveBeenCalledWith({ - id: invalidMockId, - }); + ); + } }); }); describe('fetchUserDogs', () => { it('유저의 강아지 정보를 배열로 리턴해야 함', async () => { - mockDogsService.findByUserId.mockResolvedValueOnce([MOCK_DOG]); + mockDogsRepository.findBy.mockImplementation( + (user: { id: string }) => [MOCK_DOG], // + ); + mockDogsService.findByUserId.mockImplementation((userId: string) => [ + MOCK_DOG, + ]); const result = await dogsResolver.fetchUserDogs(context); + expect(result).toEqual([MOCK_DOG]); expect(mockDogsService.findByUserId).toHaveBeenCalledWith({ userId: context.req.user.id, }); - expect(result).toEqual([MOCK_DOG]); }); }); @@ -109,52 +130,73 @@ describe('DogsResolver', () => { specifics: MOCK_DOG.specifics, image: MOCK_DOG.image, }; - mockDogsService.create.mockResolvedValueOnce(MOCK_DOG); + mockDogsRepository.save.mockImplementation( + (createDogInput: CreateDogInput, user: { id: string }) => MOCK_DOG, + ); + mockDogsService.create.mockImplementation( + (createDogInput: CreateDogInput, userId: string) => MOCK_DOG, + ); const result = await dogsResolver.createDog(createDogInput, context); + expect(result).toEqual(MOCK_DOG); expect(mockDogsService.create).toHaveBeenCalledWith({ createDogInput, userId: context.req.user.id, }); - expect(result).toEqual(MOCK_DOG); }); }); describe('updateDog', () => { + const updateDogInput: UpdateDogInput = { + weight: UPDATED_MOCK_DOG.weight, + breed: UPDATED_MOCK_DOG.breed, + }; + it('업데이트한 강아지 정보를 리턴해야 함', async () => { - const updateDogInput: UpdateDogInput = { - weight: UPDATED_MOCK_DOG.weight, - breed: UPDATED_MOCK_DOG.breed, - }; - mockDogsService.updateOneById.mockResolvedValueOnce(UPDATED_MOCK_DOG); + mockDogsRepository.findOne.mockImplementation( + (where: { id: string }, relations: { user: true }) => MOCK_DOG, + ); + mockDogsService.findOneById.mockImplementation((id: string) => MOCK_DOG); + mockDogsRepository.save.mockImplementation( + ( + id: string, + name: string, + age: number, + weight: number, + breed: DOG_TYPE, + specifics: string, + image: string, + createdAt: Date, + deleledAt: Date, + userId: string, + ) => UPDATED_MOCK_DOG, + ); + mockDogsService.updateOneById.mockImplementation( + (id: string, updateDogInput: UpdateDogInput) => UPDATED_MOCK_DOG, + ); const result = await dogsResolver.updateDog(MOCK_DOG.id, updateDogInput); + expect(result).toEqual(UPDATED_MOCK_DOG); expect(mockDogsService.updateOneById).toHaveBeenCalledWith({ id: MOCK_DOG.id, updateDogInput, }); - expect(result).toEqual(UPDATED_MOCK_DOG); }); it('NotFoundException을 던져야 함', () => { const invalidMockId = '3ce6246c-f37a-426e-b95a-b38ec6d55f4f'; - const updateDogInput: UpdateDogInput = { - weight: UPDATED_MOCK_DOG.weight, - breed: UPDATED_MOCK_DOG.breed, - }; - mockDogsService.updateOneById.mockRejectedValue( - new NotFoundException( - `id ${invalidMockId}를 갖는 강아지를 찾을 수 없음`, - ), + mockDogsRepository.findOne.mockImplementation( + (where: { id: string }) => null, ); - expect( - dogsResolver.updateDog(invalidMockId, updateDogInput), - ).rejects.toThrowError( - new NotFoundException( + try { + dogsResolver.updateDog(invalidMockId, updateDogInput); + } catch (error) { + expect(error).toBeInstanceOf(NotFoundException); + expect(error.message).toBe( `id ${invalidMockId}를 갖는 강아지를 찾을 수 없음`, - ), - ); + ); + } expect(mockDogsService.updateOneById).toHaveBeenCalledWith({ id: invalidMockId, updateDogInput, @@ -164,32 +206,38 @@ describe('DogsResolver', () => { describe('deleteDog', () => { it('삭제 여부 true를 반환해야 함', async () => { - mockDogsService.deleteOneById.mockResolvedValueOnce(true); + mockDogsRepository.findOne.mockImplementation( + (where: { id: string }) => MOCK_DOG, + ); + mockDogsRepository.softDelete.mockImplementation( + (id: string, user: { id: string }) => 1, + ); + mockDogsService.deleteOneById.mockImplementation( + (id: string, userId: string) => true, + ); const result = await dogsResolver.deleteDog(MOCK_DOG.id, context); - + expect(result).toBe(true); expect(mockDogsService.deleteOneById).toHaveBeenCalledWith({ id: MOCK_DOG.id, userId: context.req.user.id, }); - expect(result).toBe(true); }); it('NotFoundException을 던져야 함', () => { const invalidMockId = '3ce6246c-f37a-426e-b95a-b38ec6d55f4f'; - mockDogsService.deleteOneById.mockRejectedValue( - new NotFoundException( - `id ${invalidMockId}를 갖는 강아지를 찾을 수 없음`, - ), + mockDogsRepository.findOne.mockImplementation( + (where: { id: string }) => null, ); - expect( - dogsResolver.deleteDog(invalidMockId, context), - ).rejects.toThrowError( - new NotFoundException( + try { + dogsResolver.deleteDog(invalidMockId, context); + } catch (error) { + expect(error).toBeInstanceOf(NotFoundException); + expect(error.message).toBe( `id ${invalidMockId}를 갖는 강아지를 찾을 수 없음`, - ), - ); + ); + } expect(mockDogsService.deleteOneById).toHaveBeenCalledWith({ id: invalidMockId, userId: context.req.user.id,