From ff469ab0c3d6dbe3d46d882e5ab4d856a92851e9 Mon Sep 17 00:00:00 2001 From: cheonHwi Date: Fri, 28 Feb 2025 18:18:28 +0900 Subject: [PATCH 1/6] =?UTF-8?q?modify=20:=20=ED=98=84=EC=9E=AC=20=ED=8C=8C?= =?UTF-8?q?=EC=9D=BC=20=EA=B5=AC=EC=A1=B0=EC=97=90=20=EB=A7=9E=EC=B6=B0=20?= =?UTF-8?q?readme=20=EC=B5=9C=EC=8B=A0=EC=8B=A0=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 30fd4e3..8973bc9 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,7 @@ ```bash pnpm install -NODE_ENV=development pnpm install # devDpe 설치 위해 +NODE_ENV=development pnpm install # devDependencies 설치 위해 # 만약 pnpm 이 없다면 brew install pnpm @@ -36,6 +36,9 @@ pnpm dev # 개발 서버 실행 pnpm test # 테스트 실행 pnpm lint # 린트 검사 pnpm lint:fix # 린트 자동 수정 + +pnpm build # 프로젝트 빌드 +pnpm start # 빌드된 프로젝트 시작 ``` ## Project Structure @@ -44,9 +47,15 @@ pnpm lint:fix # 린트 자동 수정 ├── src/ ├── __test__/ # 테스트 파일 ├── configs/ # 설정 파일 (DB 등) +├── constants/ # 상수 데이터 파일 ├── controllers/ # API 컨트롤러 -├── models/ # 데이터 모델 +├── exception/ # 커스텀 에러 파일 +├── middlewares/ # 각종 미들웨어 (인증, 에러, 데이터 검증 등) +├── modules/ # 모듈 파일 (슬랙 등) ├── repositories/ # 데이터 액세스 레이어 ├── routers/ # API 라우트 정의 -└── services/ # 비즈니스 로직 +├── services/ # 비즈니스 로직 +├┬── types/ # Enum, DTO 등 데이터 타입 정의 +│└── models/ # 데이터 모델 +└── utils/ # 편의성 함수 정의 ``` From ead0de3a0d4ef6634de0fb4d62a7b581b5433524 Mon Sep 17 00:00:00 2001 From: cheonHwi Date: Fri, 28 Feb 2025 18:19:54 +0900 Subject: [PATCH 2/6] =?UTF-8?q?feature=20:=20userService=20=ED=85=8C?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=20=ED=8C=8C=EC=9D=BC=20=EC=9E=91=EC=84=B1?= =?UTF-8?q?=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/__test__/services/user.service.test.ts | 81 ++++++++++++++++++++++ 1 file changed, 81 insertions(+) create mode 100644 src/__test__/services/user.service.test.ts diff --git a/src/__test__/services/user.service.test.ts b/src/__test__/services/user.service.test.ts new file mode 100644 index 0000000..6707706 --- /dev/null +++ b/src/__test__/services/user.service.test.ts @@ -0,0 +1,81 @@ +import pool from '@/configs/db.config'; +import { UserRepository } from '@/repositories/user.repository'; +import { UserService } from '@/services/user.service'; +import { UserWithTokenDto } from '@/types'; +import { mock } from 'node:test'; +import 'reflect-metadata'; + +describe('UserService 테스트', () => { + let userService: UserService; + let userRepository: UserRepository; + + beforeEach(() => { + // userRepository 모킹 + userRepository = new UserRepository(pool); + userService = new UserService(userRepository); + jest.spyOn(userService, 'findByVelogUUID').mockResolvedValue({ + id: 1, + velog_uuid: '1', + access_token: 'accessToken', + refresh_token: 'refreshToken', + group_id: 1, + email: 'test@test.com', + is_active: true, + created_at: new Date(), + updated_at: new Date(), + }); + jest + .spyOn(userRepository, 'updateTokens') + .mockImplementation((uuid: string, encryptedAccessToken: string, encryptedRefreshToken: string) => { + return Promise.resolve({ + id: 1, + velog_uuid: uuid, + access_token: encryptedAccessToken, + refresh_token: encryptedRefreshToken, + group_id: 1, + email: 'test@test.com', + is_active: true, + created_at: new Date(), + updated_at: new Date(), + }); + }); + }); + + test('handleUserTokensByVelogUUID 메서드 테스트', async () => { + const mockUserData: UserWithTokenDto = { + id: '1', + email: 'test@test.com', + accessToken: 'accessToken', + refreshToken: 'refreshToken', + }; + + const { id, email, accessToken, refreshToken } = mockUserData; + + let user = await userService.findByVelogUUID(id); + if (!user) { + user = await userService.createUser(mockUserData); + } + + expect(user).toBeDefined(); + expect(user?.id).toBe(Number(id)); + expect(user?.email).toBe(email); + expect(user?.access_token).toBe(accessToken); + expect(user?.refresh_token).toBe(refreshToken); + + const { encryptedAccessToken, encryptedRefreshToken } = (userService as any).encryptTokens( + user.group_id, + accessToken, + refreshToken, + ); + + const result = await userService.updateUserTokens({ + id, + email, + accessToken: encryptedAccessToken, + refreshToken: encryptedRefreshToken, + }); + + expect(result?.access_token).toBe(encryptedAccessToken); + expect(result?.refresh_token).toBe(encryptedRefreshToken); + }); +}); From efaf34b3dd03d0941bc015e74a71da5576847af6 Mon Sep 17 00:00:00 2001 From: cheonHwi Date: Thu, 6 Mar 2025 17:50:48 +0900 Subject: [PATCH 3/6] =?UTF-8?q?modify=20:=20userService=20=ED=85=8C?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=20=ED=8C=8C=EC=9D=BC=20=EC=9E=91=EC=84=B1(?= =?UTF-8?q?=EC=9E=84=EC=8B=9C)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/__test__/services/user.service.test.ts | 103 +++++++++++++++------ 1 file changed, 75 insertions(+), 28 deletions(-) diff --git a/src/__test__/services/user.service.test.ts b/src/__test__/services/user.service.test.ts index 6707706..b90bc36 100644 --- a/src/__test__/services/user.service.test.ts +++ b/src/__test__/services/user.service.test.ts @@ -10,9 +10,9 @@ describe('UserService 테스트', () => { let userRepository: UserRepository; beforeEach(() => { - // userRepository 모킹 userRepository = new UserRepository(pool); userService = new UserService(userRepository); + jest.spyOn(userService, 'findByVelogUUID').mockResolvedValue({ id: 1, velog_uuid: '1', @@ -39,9 +39,56 @@ describe('UserService 테스트', () => { updated_at: new Date(), }); }); + + jest.spyOn(userService as any, 'encryptTokens').mockReturnValue({ + encryptedAccessToken: 'encryptedAccessToken', + encryptedRefreshToken: 'encryptedRefreshToken', + }); + + // userRepository의 createUser모킹하기 + jest.spyOn(userRepository, 'createUser').mockImplementation(() => {}); + }); + + test('handleUserTokensByVelogUUID - 기존 사용자 토큰 업데이트', async () => { + // 사용자가 존재하는 경우 테스트 + const mockUserData: UserWithTokenDto = { + id: '1', + email: 'test@test.com', + accessToken: 'accessToken', + refreshToken: 'refreshToken', + }; + + const result = await userService.handleUserTokensByVelogUUID(mockUserData); + + expect(result).toBeDefined(); + expect(userService.findByVelogUUID).toHaveBeenCalledWith('1'); + expect((userService as any).encryptTokens).toHaveBeenCalled(); + expect(userRepository.updateTokens).toHaveBeenCalledWith('1', 'encryptedAccessToken', 'encryptedRefreshToken'); + }); + + test('handleUserTokensByVelogUUID - 새 사용자 생성', async () => { + // findByVelogUUID가 null 반환하도록 재설정 + jest.spyOn(userService, 'findByVelogUUID').mockResolvedValueOnce(null); + + const mockUserData: UserWithTokenDto = { + id: '1', + email: 'test@test.com', + accessToken: 'accessToken', + refreshToken: 'refreshToken', + }; + + const result = await userService.handleUserTokensByVelogUUID(mockUserData); + + expect(result).toBeDefined(); + expect(userService.findByVelogUUID).toHaveBeenCalledWith('1'); + expect(userService.createUser).toHaveBeenCalledWith(mockUserData); + expect((userService as any).encryptTokens).toHaveBeenCalled(); + expect(userRepository.updateTokens).toHaveBeenCalled(); }); - test('handleUserTokensByVelogUUID 메서드 테스트', async () => { + test('handleUserTokensByVelogUUID - 에러 처리', async () => { + jest.spyOn(userService, 'findByVelogUUID').mockRejectedValueOnce(new Error('DB 에러')); + const mockUserData: UserWithTokenDto = { id: '1', email: 'test@test.com', @@ -49,33 +96,33 @@ describe('UserService 테스트', () => { refreshToken: 'refreshToken', }; - const { id, email, accessToken, refreshToken } = mockUserData; - - let user = await userService.findByVelogUUID(id); - if (!user) { - user = await userService.createUser(mockUserData); - } - - expect(user).toBeDefined(); - expect(user?.id).toBe(Number(id)); - expect(user?.email).toBe(email); - expect(user?.access_token).toBe(accessToken); - expect(user?.refresh_token).toBe(refreshToken); - - const { encryptedAccessToken, encryptedRefreshToken } = (userService as any).encryptTokens( - user.group_id, - accessToken, - refreshToken, - ); - - const result = await userService.updateUserTokens({ - id, - email, - accessToken: encryptedAccessToken, - refreshToken: encryptedRefreshToken, + await expect(userService.handleUserTokensByVelogUUID(mockUserData)).rejects.toThrow(); + }); + + test('findSampleUser 메서드 테스트', async () => { + jest.spyOn(userRepository, 'findSampleUser').mockResolvedValue({ + id: 1, + velog_uuid: '1', + access_token: 'encryptedAccessToken', + refresh_token: 'encryptedRefreshToken', + group_id: 1, + email: 'test@test.com', + is_active: true, + created_at: new Date(), + updated_at: new Date(), + }); + + jest.spyOn(userService as any, 'decryptTokens').mockReturnValue({ + decryptedAccessToken: 'decryptedAccessToken', + decryptedRefreshToken: 'decryptedRefreshToken', }); - expect(result?.access_token).toBe(encryptedAccessToken); - expect(result?.refresh_token).toBe(encryptedRefreshToken); + const result = await userService.findSampleUser(); + + expect(result).toBeDefined(); + expect(result.decryptedAccessToken).toBe('decryptedAccessToken'); + expect(result.decryptedRefreshToken).toBe('decryptedRefreshToken'); + expect(userRepository.findSampleUser).toHaveBeenCalled(); + expect((userService as any).decryptTokens).toHaveBeenCalled(); }); }); From 4a4746ba31bd2da6efbf3897819159410888d3d1 Mon Sep 17 00:00:00 2001 From: cheonHwi Date: Fri, 14 Mar 2025 17:21:10 +0900 Subject: [PATCH 4/6] =?UTF-8?q?test=20:=20postService=20=ED=85=8C=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=20=EC=BD=94=EB=93=9C=20=EA=B5=AC=ED=98=84=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../__test__/test.post.service.test.ts | 259 ++++++++++++++++++ 1 file changed, 259 insertions(+) create mode 100644 src/services/__test__/test.post.service.test.ts diff --git a/src/services/__test__/test.post.service.test.ts b/src/services/__test__/test.post.service.test.ts new file mode 100644 index 0000000..5e94c0b --- /dev/null +++ b/src/services/__test__/test.post.service.test.ts @@ -0,0 +1,259 @@ +import { PostService } from '@/services/post.service'; +import { PostRepository } from '@/repositories/post.repository'; +import { DBError } from '@/exception'; + +jest.mock('@/repositories/post.repository'); + +// 모든 파라미터는 Route 단에서 검증하기 때문에 파라미터를 제대로 받았는지는 확인하지 않음 +describe('PostService', () => { + let postService: PostService; + let postRepo: jest.Mocked; + let mockPool: any; + + beforeEach(() => { + mockPool = {}; + + postRepo = new PostRepository(mockPool) as jest.Mocked; + postService = new PostService(postRepo); + }); + + describe('getAllposts', () => { + it('게시물 목록 조회', async () => { + const mockPosts = { + nextCursor: '2023-11-19T09:19:36.811Z,519212', + posts: [ + { + id: '519211', + title: 'velog dashboard test post (2)', + slug: 'velog-dashboard-test-post-2', + daily_view_count: 147, + daily_like_count: 2, + yesterday_daily_view_count: 147, + yesterday_daily_like_count: 2, + post_created_at: '2025-02-08T02:58:24.347Z', + post_released_at: '2023-11-20T02:15:14.209Z', + }, + { + id: '519212', + title: 'velog dashboard test post (1)', + slug: 'velog-dashboard-test-post-1', + daily_view_count: 208, + daily_like_count: 1, + yesterday_daily_view_count: 208, + yesterday_daily_like_count: 1, + post_created_at: '2025-02-08T02:58:24.347Z', + post_released_at: '2023-11-19T09:19:36.811Z', + }, + ], + }; + + postRepo.findPostsByUserId.mockResolvedValue(mockPosts); + + const result = await postService.getAllposts(1); + console.log(result); + expect(result.posts).toEqual([ + { + id: '519211', + title: 'velog dashboard test post (2)', + slug: 'velog-dashboard-test-post-2', + views: 147, + likes: 2, + yesterdayViews: 147, + yesterdayLikes: 2, + createdAt: '2025-02-08T02:58:24.347Z', + releasedAt: '2023-11-20T02:15:14.209Z', + }, + { + id: '519212', + title: 'velog dashboard test post (1)', + slug: 'velog-dashboard-test-post-1', + views: 208, + likes: 1, + yesterdayViews: 208, + yesterdayLikes: 1, + createdAt: '2025-02-08T02:58:24.347Z', + releasedAt: '2023-11-19T09:19:36.811Z', + }, + ]); + expect(result.nextCursor).toBe('2023-11-19T09:19:36.811Z,519212'); + }); + + it('쿼리 중 오류 발생 시 DBError Throw', async () => { + const errorMessage = '전체 post 조회 중 문제가 발생했습니다.'; + postRepo.findPostsByUserId.mockRejectedValue(new DBError(errorMessage)); + + await expect(postService.getAllposts(1)).rejects.toThrow(errorMessage); + }); + }); + + describe('getAllPostStatistics', () => { + it('게시물 전체 통계 조회', async () => { + const mockStatistics = { + daily_view_count: '355', + daily_like_count: '3', + yesterday_views: '355', + yesterday_likes: '3', + last_updated_date: '2025-03-14T15:52:40.767Z', + }; + + postRepo.getYesterdayAndTodayViewLikeStats.mockResolvedValue(mockStatistics); + + const result = await postService.getAllPostStatistics(1); + + expect(result).toEqual({ + totalViews: 355, + totalLikes: 3, + yesterdayViews: 355, + yesterdayLikes: 3, + lastUpdatedDate: '2025-03-14T15:52:40.767Z', + }); + }); + + it('쿼리 중 오류 발생 시 DBError Throw', async () => { + const errorMessage = '통계 조회 중 문제가 발생했습니다.'; + postRepo.getYesterdayAndTodayViewLikeStats.mockRejectedValue(new DBError(errorMessage)); + + await expect(postService.getAllPostStatistics(1)).rejects.toThrow(errorMessage); + }); + }); + + describe('getTotalPostCounts', () => { + it('게시물 개수 조회', async () => { + const mockCount = 2; + postRepo.getTotalPostCounts.mockResolvedValue(mockCount); + + const result = await postService.getTotalPostCounts(1); + + expect(result).toBe(mockCount); + }); + + it('쿼리 중 오류 발생 시 DBError Throw', async () => { + const errorMessage = '총 게시물 수 조회 중 문제가 발생했습니다.'; + postRepo.getTotalPostCounts.mockRejectedValue(new DBError(errorMessage)); + + await expect(postService.getTotalPostCounts(1)).rejects.toThrow(errorMessage); + }); + }); + + describe('getPostByPostId', () => { + it('게시물 상세 통계 조회', async () => { + const mockPosts = [ + { + date: '2025-03-08T00:00:00.000Z', + daily_view_count: 145, + daily_like_count: 2, + }, + { + date: '2025-03-09T00:00:00.000Z', + daily_view_count: 145, + daily_like_count: 2, + }, + { + date: '2025-03-10T00:00:00.000Z', + daily_view_count: 147, + daily_like_count: 2, + }, + { + date: '2025-03-11T00:00:00.000Z', + daily_view_count: 147, + daily_like_count: 2, + }, + ]; + + postRepo.findPostByPostId.mockResolvedValue(mockPosts); + + const result = await postService.getPostByPostId(1); + + expect(result).toEqual([ + { + date: '2025-03-08T00:00:00.000Z', + dailyViewCount: 145, + dailyLikeCount: 2, + }, + { + date: '2025-03-09T00:00:00.000Z', + dailyViewCount: 145, + dailyLikeCount: 2, + }, + { + date: '2025-03-10T00:00:00.000Z', + dailyViewCount: 147, + dailyLikeCount: 2, + }, + { + date: '2025-03-11T00:00:00.000Z', + dailyViewCount: 147, + dailyLikeCount: 2, + }, + ]); + }); + + it('쿼리 중 오류 발생 시 DBError Throw', async () => { + const errorMessage = '게시물 조회 중 문제가 발생했습니다.'; + postRepo.findPostByPostId.mockRejectedValue(new DBError(errorMessage)); + + await expect(postService.getPostByPostId(1)).rejects.toThrow(errorMessage); + }); + }); + + describe('getPostByPostUUID', () => { + it('게시물 상세 통계 조회', async () => { + const mockPosts = [ + { + date: '2025-03-08T00:00:00.000Z', + daily_view_count: 145, + daily_like_count: 2, + }, + { + date: '2025-03-09T00:00:00.000Z', + daily_view_count: 145, + daily_like_count: 2, + }, + { + date: '2025-03-10T00:00:00.000Z', + daily_view_count: 147, + daily_like_count: 2, + }, + { + date: '2025-03-11T00:00:00.000Z', + daily_view_count: 147, + daily_like_count: 2, + }, + ]; + + postRepo.findPostByPostUUID.mockResolvedValue(mockPosts); + + const result = await postService.getPostByPostUUID('uuid-1234'); + + expect(result).toEqual([ + { + date: '2025-03-08T00:00:00.000Z', + dailyViewCount: 145, + dailyLikeCount: 2, + }, + { + date: '2025-03-09T00:00:00.000Z', + dailyViewCount: 145, + dailyLikeCount: 2, + }, + { + date: '2025-03-10T00:00:00.000Z', + dailyViewCount: 147, + dailyLikeCount: 2, + }, + { + date: '2025-03-11T00:00:00.000Z', + dailyViewCount: 147, + dailyLikeCount: 2, + }, + ]); + }); + + it('쿼리 중 오류 발생 시 DBError Throw', async () => { + const errorMessage = 'UUID로 게시물 조회 중 문제가 발생했습니다.'; + postRepo.findPostByPostUUID.mockRejectedValue(new DBError(errorMessage)); + + await expect(postService.getPostByPostUUID('uuid-1234')).rejects.toThrow(errorMessage); + }); + }); +}); From 4da41229d3c819efc0bc0a72d6879b98a0cd99ab Mon Sep 17 00:00:00 2001 From: cheonHwi Date: Fri, 14 Mar 2025 17:21:59 +0900 Subject: [PATCH 5/6] =?UTF-8?q?refactor=20:=20=EC=B4=88=EA=B8=B0=20?= =?UTF-8?q?=EC=97=B0=EC=8A=B5=EC=9A=A9=20=EC=BD=94=EB=93=9C=20=EC=A0=9C?= =?UTF-8?q?=EA=B1=B0=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/__test__/services/user.service.test.ts | 128 --------------------- 1 file changed, 128 deletions(-) delete mode 100644 src/__test__/services/user.service.test.ts diff --git a/src/__test__/services/user.service.test.ts b/src/__test__/services/user.service.test.ts deleted file mode 100644 index b90bc36..0000000 --- a/src/__test__/services/user.service.test.ts +++ /dev/null @@ -1,128 +0,0 @@ -import pool from '@/configs/db.config'; -import { UserRepository } from '@/repositories/user.repository'; -import { UserService } from '@/services/user.service'; -import { UserWithTokenDto } from '@/types'; -import { mock } from 'node:test'; -import 'reflect-metadata'; - -describe('UserService 테스트', () => { - let userService: UserService; - let userRepository: UserRepository; - - beforeEach(() => { - userRepository = new UserRepository(pool); - userService = new UserService(userRepository); - - jest.spyOn(userService, 'findByVelogUUID').mockResolvedValue({ - id: 1, - velog_uuid: '1', - access_token: 'accessToken', - refresh_token: 'refreshToken', - group_id: 1, - email: 'test@test.com', - is_active: true, - created_at: new Date(), - updated_at: new Date(), - }); - jest - .spyOn(userRepository, 'updateTokens') - .mockImplementation((uuid: string, encryptedAccessToken: string, encryptedRefreshToken: string) => { - return Promise.resolve({ - id: 1, - velog_uuid: uuid, - access_token: encryptedAccessToken, - refresh_token: encryptedRefreshToken, - group_id: 1, - email: 'test@test.com', - is_active: true, - created_at: new Date(), - updated_at: new Date(), - }); - }); - - jest.spyOn(userService as any, 'encryptTokens').mockReturnValue({ - encryptedAccessToken: 'encryptedAccessToken', - encryptedRefreshToken: 'encryptedRefreshToken', - }); - - // userRepository의 createUser모킹하기 - jest.spyOn(userRepository, 'createUser').mockImplementation(() => {}); - }); - - test('handleUserTokensByVelogUUID - 기존 사용자 토큰 업데이트', async () => { - // 사용자가 존재하는 경우 테스트 - const mockUserData: UserWithTokenDto = { - id: '1', - email: 'test@test.com', - accessToken: 'accessToken', - refreshToken: 'refreshToken', - }; - - const result = await userService.handleUserTokensByVelogUUID(mockUserData); - - expect(result).toBeDefined(); - expect(userService.findByVelogUUID).toHaveBeenCalledWith('1'); - expect((userService as any).encryptTokens).toHaveBeenCalled(); - expect(userRepository.updateTokens).toHaveBeenCalledWith('1', 'encryptedAccessToken', 'encryptedRefreshToken'); - }); - - test('handleUserTokensByVelogUUID - 새 사용자 생성', async () => { - // findByVelogUUID가 null 반환하도록 재설정 - jest.spyOn(userService, 'findByVelogUUID').mockResolvedValueOnce(null); - - const mockUserData: UserWithTokenDto = { - id: '1', - email: 'test@test.com', - accessToken: 'accessToken', - refreshToken: 'refreshToken', - }; - - const result = await userService.handleUserTokensByVelogUUID(mockUserData); - - expect(result).toBeDefined(); - expect(userService.findByVelogUUID).toHaveBeenCalledWith('1'); - expect(userService.createUser).toHaveBeenCalledWith(mockUserData); - expect((userService as any).encryptTokens).toHaveBeenCalled(); - expect(userRepository.updateTokens).toHaveBeenCalled(); - }); - - test('handleUserTokensByVelogUUID - 에러 처리', async () => { - jest.spyOn(userService, 'findByVelogUUID').mockRejectedValueOnce(new Error('DB 에러')); - - const mockUserData: UserWithTokenDto = { - id: '1', - email: 'test@test.com', - accessToken: 'accessToken', - refreshToken: 'refreshToken', - }; - - await expect(userService.handleUserTokensByVelogUUID(mockUserData)).rejects.toThrow(); - }); - - test('findSampleUser 메서드 테스트', async () => { - jest.spyOn(userRepository, 'findSampleUser').mockResolvedValue({ - id: 1, - velog_uuid: '1', - access_token: 'encryptedAccessToken', - refresh_token: 'encryptedRefreshToken', - group_id: 1, - email: 'test@test.com', - is_active: true, - created_at: new Date(), - updated_at: new Date(), - }); - - jest.spyOn(userService as any, 'decryptTokens').mockReturnValue({ - decryptedAccessToken: 'decryptedAccessToken', - decryptedRefreshToken: 'decryptedRefreshToken', - }); - - const result = await userService.findSampleUser(); - - expect(result).toBeDefined(); - expect(result.decryptedAccessToken).toBe('decryptedAccessToken'); - expect(result.decryptedRefreshToken).toBe('decryptedRefreshToken'); - expect(userRepository.findSampleUser).toHaveBeenCalled(); - expect((userService as any).decryptTokens).toHaveBeenCalled(); - }); -}); From 923dd712996ac58231817cf7570dac402ea1869a Mon Sep 17 00:00:00 2001 From: cheonHwi Date: Fri, 14 Mar 2025 18:03:16 +0900 Subject: [PATCH 6/6] =?UTF-8?q?modify=20:=20=EB=B6=88=ED=95=84=EC=9A=94?= =?UTF-8?q?=ED=95=9C=20=EC=B6=9C=EB=A0=A5=EB=AC=B8=20=EC=A0=9C=EA=B1=B0,?= =?UTF-8?q?=20mockPool=20=ED=83=80=EC=9E=85=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/services/__test__/test.post.service.test.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/services/__test__/test.post.service.test.ts b/src/services/__test__/test.post.service.test.ts index 5e94c0b..1d84624 100644 --- a/src/services/__test__/test.post.service.test.ts +++ b/src/services/__test__/test.post.service.test.ts @@ -1,6 +1,7 @@ import { PostService } from '@/services/post.service'; import { PostRepository } from '@/repositories/post.repository'; import { DBError } from '@/exception'; +import { Pool } from 'pg'; jest.mock('@/repositories/post.repository'); @@ -8,11 +9,10 @@ jest.mock('@/repositories/post.repository'); describe('PostService', () => { let postService: PostService; let postRepo: jest.Mocked; - let mockPool: any; + let mockPool: jest.Mocked; beforeEach(() => { - mockPool = {}; - + mockPool = {} as jest.Mocked; postRepo = new PostRepository(mockPool) as jest.Mocked; postService = new PostService(postRepo); }); @@ -50,7 +50,7 @@ describe('PostService', () => { postRepo.findPostsByUserId.mockResolvedValue(mockPosts); const result = await postService.getAllposts(1); - console.log(result); + expect(result.posts).toEqual([ { id: '519211',