@@ -10,13 +10,17 @@ import { UpdatePageDto } from './dtos/updatePage.dto';
1010import { PageNotFoundException } from '../exception/page.exception' ;
1111import { WorkspaceRepository } from '../workspace/workspace.repository' ;
1212import { WorkspaceNotFoundException } from '../exception/workspace.exception' ;
13+ const RED_LOCK_TOKEN = 'RED_LOCK' ;
14+ type RedisLock = {
15+ acquire ( ) : Promise < { release : ( ) => void } > ;
16+ } ;
1317
1418describe ( 'PageService' , ( ) => {
1519 let service : PageService ;
1620 let pageRepository : PageRepository ;
1721 let nodeRepository : NodeRepository ;
1822 let workspaceRepository : WorkspaceRepository ;
19-
23+ let redisLock : RedisLock ;
2024 beforeEach ( async ( ) => {
2125 const module : TestingModule = await Test . createTestingModule ( {
2226 providers : [
@@ -46,17 +50,28 @@ describe('PageService', () => {
4650 findOneBy : jest . fn ( ) ,
4751 } ,
4852 } ,
53+ {
54+ provide : RED_LOCK_TOKEN ,
55+ useValue : {
56+ acquire : jest . fn ( ) ,
57+ } ,
58+ } ,
4959 ] ,
5060 } ) . compile ( ) ;
5161
5262 service = module . get < PageService > ( PageService ) ;
5363 pageRepository = module . get < PageRepository > ( PageRepository ) ;
5464 nodeRepository = module . get < NodeRepository > ( NodeRepository ) ;
5565 workspaceRepository = module . get < WorkspaceRepository > ( WorkspaceRepository ) ;
66+ redisLock = module . get < RedisLock > ( RED_LOCK_TOKEN ) ;
5667 } ) ;
5768
5869 it ( '서비스 클래스가 정상적으로 인스턴스화된다.' , ( ) => {
5970 expect ( service ) . toBeDefined ( ) ;
71+ expect ( pageRepository ) . toBeDefined ( ) ;
72+ expect ( nodeRepository ) . toBeDefined ( ) ;
73+ expect ( workspaceRepository ) . toBeDefined ( ) ;
74+ expect ( redisLock ) . toBeDefined ( ) ;
6075 } ) ;
6176
6277 describe ( 'createPage' , ( ) => {
@@ -141,17 +156,15 @@ describe('PageService', () => {
141156 } ) ;
142157 } ) ;
143158
144- describe ( 'createLinkedPage' , ( ) => {
145- it ( '' , ( ) => { } ) ;
146- } ) ;
147-
148159 describe ( 'deletePage' , ( ) => {
149160 it ( 'id에 해당하는 페이지를 찾아 성공적으로 삭제한다.' , async ( ) => {
150161 jest
151162 . spyOn ( pageRepository , 'delete' )
152163 . mockResolvedValue ( { affected : true } as any ) ;
153164 jest . spyOn ( pageRepository , 'findOneBy' ) . mockResolvedValue ( new Page ( ) ) ;
154-
165+ jest . spyOn ( redisLock , 'acquire' ) . mockResolvedValue ( {
166+ release : jest . fn ( ) ,
167+ } ) ;
155168 await service . deletePage ( 1 ) ;
156169
157170 expect ( pageRepository . delete ) . toHaveBeenCalledWith ( 1 ) ;
@@ -161,7 +174,9 @@ describe('PageService', () => {
161174 jest
162175 . spyOn ( pageRepository , 'delete' )
163176 . mockResolvedValue ( { affected : false } as any ) ;
164-
177+ jest . spyOn ( redisLock , 'acquire' ) . mockResolvedValue ( {
178+ release : jest . fn ( ) ,
179+ } ) ;
165180 await expect ( service . deletePage ( 1 ) ) . rejects . toThrow (
166181 PageNotFoundException ,
167182 ) ;
@@ -199,10 +214,11 @@ describe('PageService', () => {
199214 emoji : '📝' ,
200215 workspace : null ,
201216 } ;
202-
203217 jest . spyOn ( pageRepository , 'findOneBy' ) . mockResolvedValue ( originPage ) ;
204218 jest . spyOn ( pageRepository , 'save' ) . mockResolvedValue ( newPage ) ;
205-
219+ jest . spyOn ( redisLock , 'acquire' ) . mockResolvedValue ( {
220+ release : jest . fn ( ) ,
221+ } ) ;
206222 const result = await service . updatePage ( 1 , dto ) ;
207223
208224 expect ( result ) . toEqual ( newPage ) ;
@@ -216,7 +232,9 @@ describe('PageService', () => {
216232 jest
217233 . spyOn ( nodeRepository , 'findOneBy' )
218234 . mockResolvedValue ( { affected : false } as any ) ;
219-
235+ jest . spyOn ( redisLock , 'acquire' ) . mockResolvedValue ( {
236+ release : jest . fn ( ) ,
237+ } ) ;
220238 await expect ( service . updatePage ( 1 , new UpdatePageDto ( ) ) ) . rejects . toThrow (
221239 PageNotFoundException ,
222240 ) ;
0 commit comments