@@ -2,29 +2,191 @@ import { Test, TestingModule } from '@nestjs/testing';
22import { EdgeService } from './edge.service' ;
33import { EdgeRepository } from './edge.repository' ;
44import { NodeRepository } from '../node/node.repository' ;
5+ import { CreateEdgeDto } from './dtos/createEdge.dto' ;
6+ import { Edge } from './edge.entity' ;
7+ import { Node } from '../node/node.entity' ;
8+ import { EdgeNotFoundException } from '../exception/edge.exception' ;
59
610describe ( 'EdgeService' , ( ) => {
711 let service : EdgeService ;
12+ let edgeRepository : jest . Mocked < EdgeRepository > ;
13+ let nodeRepository : jest . Mocked < NodeRepository > ;
814
915 beforeEach ( async ( ) => {
1016 const module : TestingModule = await Test . createTestingModule ( {
1117 providers : [
1218 EdgeService ,
1319 {
1420 provide : EdgeRepository ,
15- useValue : { } ,
21+ useValue : {
22+ create : jest . fn ( ) ,
23+ save : jest . fn ( ) ,
24+ delete : jest . fn ( ) ,
25+ findOneBy : jest . fn ( ) ,
26+ find : jest . fn ( ) ,
27+ } ,
1628 } ,
1729 {
1830 provide : NodeRepository ,
19- useValue : { } ,
31+ useValue : {
32+ save : jest . fn ( ) ,
33+ findOneBy : jest . fn ( ) ,
34+ } ,
2035 } ,
2136 ] ,
2237 } ) . compile ( ) ;
2338
2439 service = module . get < EdgeService > ( EdgeService ) ;
40+ edgeRepository = module . get ( EdgeRepository ) ;
41+ nodeRepository = module . get ( NodeRepository ) ;
2542 } ) ;
2643
2744 it ( '서비스 클래스가 정상적으로 인스턴스화된다.' , ( ) => {
2845 expect ( service ) . toBeDefined ( ) ;
2946 } ) ;
47+
48+ describe ( 'createEdge' , ( ) => {
49+ it ( '새로운 엣지를 만들어 노드와 노드를 연결하는 연결한다.' , async ( ) => {
50+ const dto : CreateEdgeDto = { fromNode : 3 , toNode : 5 } ;
51+ const fromNode = {
52+ id : 3 ,
53+ x : 0 ,
54+ y : 0 ,
55+ title : 'Node Title' ,
56+ page : null ,
57+ outgoingEdges : [ ] ,
58+ incomingEdges : [ ] ,
59+ } as Node ;
60+ const toNode = {
61+ id : 5 ,
62+ x : 0 ,
63+ y : 0 ,
64+ title : 'Node Title' ,
65+ page : null ,
66+ outgoingEdges : [ ] ,
67+ incomingEdges : [ ] ,
68+ } as Node ;
69+ const edge = {
70+ id : 1 ,
71+ fromNode : fromNode ,
72+ toNode : toNode ,
73+ } as Edge ;
74+
75+ jest
76+ . spyOn ( nodeRepository , 'findOneBy' )
77+ . mockResolvedValueOnce ( fromNode ) // 첫 번째 호출: fromNode
78+ . mockResolvedValueOnce ( toNode ) ; // 두 번째 호출: toNode
79+ jest . spyOn ( edgeRepository , 'save' ) . mockResolvedValue ( edge ) ;
80+
81+ const result = await service . createEdge ( dto ) ;
82+
83+ expect ( result ) . toEqual ( edge ) ;
84+ expect ( edgeRepository . save ) . toHaveBeenCalledTimes ( 1 ) ;
85+ expect ( nodeRepository . findOneBy ) . toHaveBeenCalledTimes ( 2 ) ;
86+ } ) ;
87+ } ) ;
88+
89+ describe ( 'deleteEdge' , ( ) => {
90+ it ( '엣지를 성공적으로 삭제한다.' , async ( ) => {
91+ jest
92+ . spyOn ( edgeRepository , 'delete' )
93+ . mockResolvedValue ( { affected : true } as any ) ;
94+ jest . spyOn ( edgeRepository , 'findOneBy' ) . mockResolvedValue ( new Edge ( ) ) ;
95+
96+ await service . deleteEdge ( 1 ) ;
97+
98+ expect ( edgeRepository . delete ) . toHaveBeenCalledWith ( 1 ) ;
99+ } ) ;
100+
101+ it ( '삭제할 엣지가 존재하지 않으면 EdgeNotFoundException을 throw한다.' , async ( ) => {
102+ jest
103+ . spyOn ( edgeRepository , 'delete' )
104+ . mockResolvedValue ( { affected : false } as any ) ;
105+ await expect ( service . deleteEdge ( 1 ) ) . rejects . toThrow (
106+ EdgeNotFoundException ,
107+ ) ;
108+ } ) ;
109+ } ) ;
110+
111+ describe ( 'findEdges' , ( ) => {
112+ it ( '존재하는 모든 엣지를 반환한다.' , async ( ) => {
113+ const node3 = {
114+ id : 3 ,
115+ x : 0 ,
116+ y : 0 ,
117+ title : 'Node Title' ,
118+ page : null ,
119+ outgoingEdges : [ ] ,
120+ incomingEdges : [ ] ,
121+ } as Node ;
122+ const node4 = {
123+ id : 4 ,
124+ x : 0 ,
125+ y : 0 ,
126+ title : 'Node Title' ,
127+ page : null ,
128+ outgoingEdges : [ ] ,
129+ incomingEdges : [ ] ,
130+ } as Node ;
131+ const node5 = {
132+ id : 5 ,
133+ x : 0 ,
134+ y : 0 ,
135+ title : 'Node Title' ,
136+ page : null ,
137+ outgoingEdges : [ ] ,
138+ incomingEdges : [ ] ,
139+ } as Node ;
140+ const node7 = {
141+ id : 7 ,
142+ x : 0 ,
143+ y : 0 ,
144+ title : 'Node Title' ,
145+ page : null ,
146+ outgoingEdges : [ ] ,
147+ incomingEdges : [ ] ,
148+ } as Node ;
149+
150+ const expectedEdgeList = [
151+ {
152+ id : 1 ,
153+ fromNode : node3 ,
154+ toNode : node5 ,
155+ } as Edge ,
156+ {
157+ id : 2 ,
158+ fromNode : node3 ,
159+ toNode : node4 ,
160+ } as Edge ,
161+ {
162+ id : 3 ,
163+ fromNode : node3 ,
164+ toNode : node7 ,
165+ } as Edge ,
166+ ] ;
167+
168+ jest . spyOn ( edgeRepository , 'find' ) . mockResolvedValue ( expectedEdgeList ) ;
169+ const result = await service . findEdges ( ) ;
170+ expect ( result ) . toEqual ( expectedEdgeList ) ;
171+ expect ( edgeRepository . find ) . toHaveBeenCalledTimes ( 1 ) ;
172+ expect ( edgeRepository . find ) . toHaveBeenCalledWith ( {
173+ relations : [ 'fromNode' , 'toNode' ] ,
174+ select : {
175+ id : true ,
176+ fromNode : {
177+ id : true ,
178+ } ,
179+ toNode : {
180+ id : true ,
181+ } ,
182+ } ,
183+ } ) ;
184+ } ) ;
185+
186+ it ( '엣지가 없을 경우, 빈 배열을 던진다.' , async ( ) => {
187+ jest . spyOn ( edgeRepository , 'find' ) . mockResolvedValue ( [ ] ) ;
188+ const result = await service . findEdges ( ) ;
189+ expect ( result ) . toEqual ( [ ] ) ;
190+ } ) ;
191+ } ) ;
30192} ) ;
0 commit comments