Skip to content

Commit

Permalink
Merge pull request #275 from ldhbenecia/feature/test-code
Browse files Browse the repository at this point in the history
[Test] Member API Unit Test, path alios 설정
  • Loading branch information
ldhbenecia authored Dec 4, 2023
2 parents becb60a + 10d21e3 commit a1391e0
Show file tree
Hide file tree
Showing 6 changed files with 98 additions and 30 deletions.
11 changes: 8 additions & 3 deletions app/backend/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@
"prisma": "^5.5.2",
"source-map-support": "^0.5.21",
"supertest": "^6.3.3",
"ts-jest": "^29.1.0",
"ts-jest": "^29.1.1",
"ts-loader": "^9.4.3",
"ts-node": "^10.9.1",
"tsconfig-paths": "^4.2.0"
Expand All @@ -74,15 +74,20 @@
"json",
"ts"
],
"rootDir": "src",
"rootDir": ".",
"testRegex": ".*\\.spec\\.ts$",
"transform": {
"^.+\\.(t|j)s$": "ts-jest"
},
"moduleNameMapper": {
"^src/(.*)$": "<rootDir>/src/$1",
"^prisma/(.*)$": "<rootDir>/prisma/$1",
"^libs/(.*)$": "<rootDir>/libs/$1"
},
"collectCoverageFrom": [
"**/*.(t|j)s"
],
"coverageDirectory": "../coverage",
"testEnvironment": "node"
}
}
}
18 changes: 4 additions & 14 deletions app/backend/src/member/member.controller.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@ import { MemberService } from './member.service';
import { UnauthorizedException } from '@nestjs/common';
import { JwtService } from '@nestjs/jwt';

// JwtService를 모킹합니다.
jest.mock('@nestjs/jwt');

describe('MemberController', () => {
Expand All @@ -13,30 +12,26 @@ describe('MemberController', () => {
let jwtService: JwtService;

beforeEach(async () => {
// NestJS 테스트 모듈을 이용하여 컨트롤러, 서비스, JwtService를 초기화합니다.
const module: TestingModule = await Test.createTestingModule({
controllers: [MemberController],
providers: [
MemberService,
{
provide: JwtService,
useValue: {
// 테스트에 필요한 대로 JwtService 메서드를 목업 또는 스텁으로 설정
sign: jest.fn(),
},
},
],
}).compile();

// 각각의 컴포넌트를 가져옵니다.
memberController = module.get<MemberController>(MemberController);
memberService = module.get<MemberService>(MemberService);
jwtService = module.get<JwtService>(JwtService);
});

describe('getUserData', () => {
it('성공 시 사용자 데이터를 반환해야 함', async () => {
// memberService.getUserData 메서드를 모킹하여 성공적인 응답을 설정합니다.
const mockUserData = {
providerId: '11111122222222',
email: '[email protected]',
Expand All @@ -52,15 +47,14 @@ describe('MemberController', () => {
// Express의 Request와 Response 객체를 모킹합니다.
const mockRequest = {
cookies: { access_token: 'mockAccessToken' },
} as any; // Express Request를 모킹합니다.
} as any;
const mockResponse = {
json: jest.fn(),
} as any; // Express Response를 모킹합니다.
} as any;

// memberController.getUserData를 호출하고 반환값이 예상된 값인지 확인합니다.
await memberController.getUserData(mockRequest, mockResponse);

// 테스트에 사용된 응답 데이터를 로그로 출력
console.log('Response Data:', mockResponse.json.mock.calls[0]);

expect(mockResponse.json).toHaveBeenCalledWith(mockUserData);
Expand All @@ -70,21 +64,17 @@ describe('MemberController', () => {
// memberService.getUserData 메서드가 에러를 던지도록 모킹합니다.
jest.spyOn(memberService, 'getUserData').mockRejectedValue(new UnauthorizedException('Unauthorized'));

// Express의 Request와 Response 객체를 모킹합니다.
const mockRequest = {
cookies: { access_token: 'mockAccessToken' },
} as any; // Express Request를 모킹합니다.
} as any;
const mockResponse = {
json: jest.fn(),
} as any; // Express Response를 모킹합니다.
} as any;

// 예외를 테스트하기 위해 async/await 및 try/catch를 사용합니다.
try {
await memberController.getUserData(mockRequest, mockResponse);
} catch (error) {
// 던져진 에러가 UnauthorizedException의 인스턴스인지 확인합니다.
expect(error).toBeInstanceOf(UnauthorizedException);
// 에러 메시지나 다른 세부 정보를 필요에 따라 확인합니다.
}
});
});
Expand Down
2 changes: 1 addition & 1 deletion app/backend/src/member/member.controller.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import { Request, Response } from 'express';
import { Controller, Get, Req, Res, UnauthorizedException, UseGuards } from '@nestjs/common';
import { ApiBearerAuth, ApiCookieAuth, ApiOperation, ApiResponse, ApiTags } from '@nestjs/swagger';
import { MemberService } from './member.service';
import { AtGuard } from '../../src/auth/guards/at.guard';
import { AtGuard } from 'src/auth/guards/at.guard';
import { MemberInformationDto } from './dto/member.dto';

@ApiTags('Member Infomation API')
Expand Down
65 changes: 65 additions & 0 deletions app/backend/src/member/member.service.spec.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
import { Test, TestingModule } from '@nestjs/testing';
import { MemberService } from './member.service';
import { UnauthorizedException } from '@nestjs/common';
import { JwtService } from '@nestjs/jwt';

jest.mock('@nestjs/jwt');

describe('MemberService', () => {
let memberService: MemberService;
let jwtService: JwtService;

beforeEach(async () => {
const module: TestingModule = await Test.createTestingModule({
providers: [
MemberService,
{
provide: JwtService,
useValue: {
verify: jest.fn(),
},
},
],
}).compile();

memberService = module.get<MemberService>(MemberService);
jwtService = module.get<JwtService>(JwtService);
});

describe('getUserData', () => {
it('성공 시 사용자 데이터를 반환해야 함', async () => {
const mockDecodedAccessToken = {
providerId: '11111122222222',
email: '[email protected]',
nickname: 'morak morak',
profilePicture: 'morak.jpg',
};

jest.spyOn(jwtService, 'verify').mockReturnValue(mockDecodedAccessToken);

const encryptedToken = 'mockEncryptedToken';
const userData = await memberService.getUserData(encryptedToken);

console.log('mockDecodedAccessToken', mockDecodedAccessToken);

expect(userData).toEqual(mockDecodedAccessToken);
});

it('실패 시 UnauthorizedException을 던져야 함', async () => {
const errorMessage = 'Invalid Token';

jest.spyOn(jwtService, 'verify').mockImplementation(() => {
throw new UnauthorizedException(errorMessage);
});

const encryptedToken = 'mockEncryptedToken';

try {
await memberService.getUserData(encryptedToken);
} catch (error) {
expect(error).toBeInstanceOf(UnauthorizedException);
expect(error.message).toBe(errorMessage);
}
});
});
});
16 changes: 10 additions & 6 deletions app/backend/src/member/member.service.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { Injectable } from '@nestjs/common';
import { Injectable, UnauthorizedException } from '@nestjs/common';
import { JwtService } from '@nestjs/jwt';
import { MemberInformationDto } from './dto/member.dto';
import { getSecret } from 'vault';
Expand All @@ -8,11 +8,15 @@ export class MemberService {
constructor(private jwtService: JwtService) {}

async getUserData(encryptedToken: string): Promise<MemberInformationDto> {
const decodedAccessToken = this.jwtService.verify(encryptedToken, {
secret: getSecret(`JWT_ACCESS_SECRET`),
});
const { providerId, email, nickname, profilePicture } = decodedAccessToken;
try {
const decodedAccessToken = this.jwtService.verify(encryptedToken, {
secret: getSecret(`JWT_ACCESS_SECRET`),
});
const { providerId, email, nickname, profilePicture } = decodedAccessToken;

return { providerId, email, nickname, profilePicture };
return { providerId, email, nickname, profilePicture };
} catch (error) {
throw new UnauthorizedException('Invalid Token');
}
}
}
16 changes: 10 additions & 6 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

0 comments on commit a1391e0

Please sign in to comment.