Skip to content

Commit 2b634e7

Browse files
authored
Merge branch 'develop' into be-feature-#188
2 parents e073915 + b38817b commit 2b634e7

9 files changed

+272
-53
lines changed

Diff for: .gitignore

+1
Original file line numberDiff line numberDiff line change
@@ -49,3 +49,4 @@ lerna-debug.log*
4949
!.vscode/launch.json
5050
!.vscode/extensions.json
5151
db.sqlite
52+
apps/backend/db.sqlite

Diff for: .vscode/settings.json

Whitespace-only changes.

Diff for: apps/backend/src/edge/dtos/createEdge.dto.ts

+1-20
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,5 @@
11
import { ApiProperty } from '@nestjs/swagger';
2-
import { IsString, IsNumber, IsIn } from 'class-validator';
3-
// import { Direction } from '../edge.entity';
4-
5-
const Direction = ['N', 'S', 'E', 'W'];
2+
import { IsNumber } from 'class-validator';
63

74
export class CreateEdgeDto {
85
@IsNumber()
@@ -12,26 +9,10 @@ export class CreateEdgeDto {
129
})
1310
fromNode: number;
1411

15-
@IsString()
16-
@IsIn(Direction)
17-
@ApiProperty({
18-
example: 'N',
19-
description: '출발 노드 지점 방향 (N, S, E, W 중 하나)',
20-
})
21-
fromPoint: string;
22-
2312
@IsNumber()
2413
@ApiProperty({
2514
example: 1,
2615
description: '도착 노드의 ID',
2716
})
2817
toNode: number;
29-
30-
@IsString()
31-
@IsIn(Direction)
32-
@ApiProperty({
33-
example: 'N',
34-
description: '도착 노드 지점 방향 (N, S, E, W 중 하나)',
35-
})
36-
toPoint: string;
3718
}

Diff for: apps/backend/src/edge/dtos/findEdgesResponse.dto.ts

-2
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,7 @@ export class FindEdgesResponseDto {
1515
{
1616
id: 1,
1717
fromNode: 2,
18-
fromPoint: 'N',
1918
toNode: 7,
20-
toPoint: 'W',
2119
},
2220
],
2321
description: '모든 Edge 배열',

Diff for: apps/backend/src/edge/edge.controller.spec.ts

+96-1
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,120 @@
11
import { Test, TestingModule } from '@nestjs/testing';
22
import { EdgeController } from './edge.controller';
33
import { EdgeService } from './edge.service';
4+
import { CreateEdgeDto } from './dtos/createEdge.dto';
5+
import { EdgeResponseMessage } from './edge.controller';
6+
import { EdgeNotFoundException } from '../exception/edge.exception';
7+
import { Edge } from './edge.entity';
8+
import { Node } from '../node/node.entity';
49

510
describe('EdgeController', () => {
611
let controller: EdgeController;
12+
let edgeService: EdgeService;
713

814
beforeEach(async () => {
915
const module: TestingModule = await Test.createTestingModule({
1016
controllers: [EdgeController],
1117
providers: [
1218
{
1319
provide: EdgeService,
14-
useValue: {},
20+
useValue: {
21+
createEdge: jest.fn(),
22+
deleteEdge: jest.fn(),
23+
findEdges: jest.fn(),
24+
},
1525
},
1626
],
1727
}).compile();
1828

1929
controller = module.get<EdgeController>(EdgeController);
30+
edgeService = module.get<EdgeService>(EdgeService);
2031
});
2132

2233
it('컨트롤러 클래스가 정상적으로 인스턴스화된다.', () => {
2334
expect(controller).toBeDefined();
2435
});
36+
37+
describe('createEdge', () => {
38+
it('엣지가 성공적으로 만들어진다', async () => {
39+
const dto: CreateEdgeDto = { fromNode: 1, toNode: 3 };
40+
const expectedResponse = {
41+
message: EdgeResponseMessage.EDGE_CREATED,
42+
};
43+
44+
jest.spyOn(edgeService, 'createEdge').mockResolvedValue(undefined);
45+
const result = await controller.createEdge(dto);
46+
47+
expect(edgeService.createEdge).toHaveBeenCalledWith(dto);
48+
expect(result).toEqual(expectedResponse);
49+
});
50+
});
51+
52+
describe('deleteEdge', () => {
53+
it('id에 해당하는 엣지를 찾아 삭제한다.', async () => {
54+
const id = 2;
55+
const expectedResponse = {
56+
message: EdgeResponseMessage.EDGE_DELETED,
57+
};
58+
59+
const result = await controller.deleteEdge(id);
60+
61+
expect(edgeService.deleteEdge).toHaveBeenCalledWith(id);
62+
expect(result).toEqual(expectedResponse);
63+
});
64+
65+
it('id에 해당하는 엣지가 존재하지 않으면 NodeNotFoundException을 throw한다.', async () => {
66+
jest
67+
.spyOn(edgeService, 'deleteEdge')
68+
.mockRejectedValue(new EdgeNotFoundException());
69+
70+
await expect(controller.deleteEdge(1)).rejects.toThrow(
71+
EdgeNotFoundException,
72+
);
73+
});
74+
});
75+
76+
describe('findEdges', () => {
77+
it('모든 엣지 목록을 반환한다.', async () => {
78+
const node3 = {
79+
id: 3,
80+
x: 0,
81+
y: 0,
82+
title: 'Node Title',
83+
page: null,
84+
outgoingEdges: [],
85+
incomingEdges: [],
86+
} as Node;
87+
const node4 = {
88+
id: 4,
89+
x: 0,
90+
y: 0,
91+
title: 'Node Title',
92+
page: null,
93+
outgoingEdges: [],
94+
incomingEdges: [],
95+
} as Node;
96+
const node5 = {
97+
id: 5,
98+
x: 0,
99+
y: 0,
100+
title: 'Node Title',
101+
page: null,
102+
outgoingEdges: [],
103+
incomingEdges: [],
104+
} as Node;
105+
106+
const expectedEdges = [
107+
{ id: 1, fromNode: node3, toNode: node5 },
108+
{ id: 2, fromNode: node3, toNode: node4 },
109+
] as Edge[];
110+
node3.outgoingEdges = [];
111+
112+
jest.spyOn(edgeService, 'findEdges').mockResolvedValue(expectedEdges);
113+
114+
await expect(controller.findEdges()).resolves.toEqual({
115+
message: EdgeResponseMessage.EDGE_ALL_RETURNED,
116+
edges: expectedEdges,
117+
});
118+
});
119+
});
25120
});

Diff for: apps/backend/src/edge/edge.controller.ts

+4-4
Original file line numberDiff line numberDiff line change
@@ -33,11 +33,11 @@ export class EdgeController {
3333
})
3434
@Get('/')
3535
@HttpCode(HttpStatus.OK)
36-
async getNodes() {
37-
const nodes = await this.edgeService.findEdges();
36+
async findEdges() {
37+
const edges = await this.edgeService.findEdges();
3838
return {
3939
message: EdgeResponseMessage.EDGE_ALL_RETURNED,
40-
nodes: nodes,
40+
edges: edges,
4141
};
4242
}
4343

@@ -56,7 +56,7 @@ export class EdgeController {
5656
@ApiOperation({ summary: '엣지를 삭제합니다.' })
5757
@Delete('/:id')
5858
@HttpCode(HttpStatus.OK)
59-
async deleteNode(
59+
async deleteEdge(
6060
@Param('id', ParseIntPipe) id: number,
6161
): Promise<{ message: string }> {
6262
await this.edgeService.deleteEdge(id);

Diff for: apps/backend/src/edge/edge.entity.ts

+5-19
Original file line numberDiff line numberDiff line change
@@ -2,20 +2,12 @@
22
import {
33
Entity,
44
PrimaryGeneratedColumn,
5-
Column,
5+
// Column,
66
ManyToOne,
77
JoinColumn,
88
} from 'typeorm';
99
import { Node } from '../node/node.entity';
1010

11-
// TODO: frontend, backend가 공유하는 shared에 direction.enum.ts로 분리
12-
// export enum Direction {
13-
// NORTH = 'N',
14-
// SOUTH = 'S',
15-
// EAST = 'E',
16-
// WEST = 'W',
17-
// }
18-
1911
@Entity()
2012
export class Edge {
2113
@PrimaryGeneratedColumn('increment')
@@ -29,15 +21,9 @@ export class Edge {
2921
@JoinColumn({ name: 'to_node_id' })
3022
toNode: Node;
3123

32-
@Column()
33-
fromPoint: string;
34-
35-
@Column()
36-
toPoint: string;
37-
38-
@Column({ nullable: true })
39-
type: string;
24+
// @Column({ nullable: true })
25+
// type: string;
4026

41-
@Column({ nullable: true })
42-
color: string;
27+
// @Column({ nullable: true })
28+
// color: string;
4329
}

0 commit comments

Comments
 (0)