Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
148 changes: 98 additions & 50 deletions src/apis/dogs/__test__/dogs.resolver.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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: [
Expand All @@ -43,6 +54,10 @@ describe('DogsResolver', () => {
provide: DogsService,
useValue: mockDogsService,
},
{
provide: getRepositoryToken(Dog),
useValue: mockDogsRepository,
},
{
provide: GqlAuthGuard,
useValue: mockAuthGuard,
Expand All @@ -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]);
});
});

Expand All @@ -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,
Expand All @@ -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,
Expand Down