-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathScheduleAdminFacadeTest.java
More file actions
162 lines (136 loc) · 5.61 KB
/
ScheduleAdminFacadeTest.java
File metadata and controls
162 lines (136 loc) · 5.61 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
package schedule.application;
import static kgu.developers.domain.schedule.domain.SubmissionType.CERTIFICATE;
import static kgu.developers.domain.schedule.domain.SubmissionType.MIDTHESIS;
import static kgu.developers.domain.schedule.domain.SubmissionType.SUBMITTED;
import static org.assertj.core.api.Assertions.assertThatThrownBy;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertTrue;
import java.time.LocalDateTime;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import kgu.developers.admin.schedule.application.ScheduleAdminFacade;
import kgu.developers.admin.schedule.presentation.request.ScheduleContentUpdateRequest;
import kgu.developers.admin.schedule.presentation.request.ScheduleCreateRequest;
import kgu.developers.admin.schedule.presentation.request.ScheduleUpdateRequest;
import kgu.developers.admin.schedule.presentation.response.SchedulePersistResponse;
import kgu.developers.domain.schedule.application.command.ScheduleCommandService;
import kgu.developers.domain.schedule.application.query.ScheduleQueryService;
import kgu.developers.domain.schedule.domain.Schedule;
import kgu.developers.domain.schedule.domain.SubmissionType;
import kgu.developers.domain.schedule.exception.DuplicateScheduleTypeException;
import kgu.developers.domain.schedule.exception.ScheduleNotFoundException;
import mock.repository.FakeScheduleRepository;
public class ScheduleAdminFacadeTest {
private static final LocalDateTime DEFAULT_START_DATE = LocalDateTime.of(2025, 1, 1, 0, 0);
private static final LocalDateTime DEFAULT_END_DATE = LocalDateTime.of(2025, 2, 1, 0, 0);
private ScheduleAdminFacade scheduleAdminFacade;
private FakeScheduleRepository fakeScheduleRepository;
private Long savedScheduleId;
@BeforeEach
public void init() {
fakeScheduleRepository = new FakeScheduleRepository();
scheduleAdminFacade = new ScheduleAdminFacade(
new ScheduleCommandService(fakeScheduleRepository),
new ScheduleQueryService(fakeScheduleRepository)
);
Schedule savedSchedule = fakeScheduleRepository.save(
Schedule.create(
SUBMITTED,
"본문",
DEFAULT_START_DATE,
DEFAULT_END_DATE
)
);
savedScheduleId = savedSchedule.getId();
}
@Test
@DisplayName("createSchedule은 일정을 생성하고 식별자를 반환한다")
void createSchedule_Success() {
// given
ScheduleCreateRequest request = ScheduleCreateRequest.builder()
.submissionType(MIDTHESIS)
.content("중간보고서 본문")
.startDate(DEFAULT_START_DATE.plusMonths(1))
.endDate(DEFAULT_END_DATE.plusMonths(1))
.build();
// when
SchedulePersistResponse response = scheduleAdminFacade.createSchedule(request);
// then
assertEquals(2L, response.scheduleId());
assertEquals(2, fakeScheduleRepository.findAll().size());
}
@Test
@DisplayName("기존 제출 유형으로 생성하면 DuplicateScheduleTypeException을 발생시킨다")
void createSchedule_DuplicatedSubmissionType_ThrowsException() {
// given
ScheduleCreateRequest request = ScheduleCreateRequest.builder()
.submissionType(SUBMITTED)
.content("본문")
.startDate(DEFAULT_START_DATE)
.endDate(DEFAULT_END_DATE)
.build();
// when & then
assertThatThrownBy(() -> scheduleAdminFacade.createSchedule(request))
.isInstanceOf(DuplicateScheduleTypeException.class);
}
@Test
@DisplayName("updateSchedule은 제출 유형과 기간 정보를 수정한다")
void updateSchedule_Success() {
// given
ScheduleUpdateRequest request = ScheduleUpdateRequest.builder()
.startDate(DEFAULT_START_DATE.plusDays(3))
.endDate(DEFAULT_END_DATE.plusDays(5))
.build();
// when
scheduleAdminFacade.updateSchedule(savedScheduleId, request);
// then
Schedule updated = fakeScheduleRepository.findById(savedScheduleId).orElseThrow();
assertEquals(DEFAULT_START_DATE.plusDays(3), updated.getStartDate());
assertEquals(DEFAULT_END_DATE.plusDays(5), updated.getEndDate());
}
@Test
@DisplayName("존재하지 않는 id로 일정 수정 시 ScheduleNotFoundException을 발생시킨다")
void updateSchedule_NotFound_ThrowsException() {
// given
ScheduleUpdateRequest request = ScheduleUpdateRequest.builder()
.startDate(DEFAULT_START_DATE)
.endDate(DEFAULT_END_DATE)
.build();
// when & then
assertThatThrownBy(() -> scheduleAdminFacade.updateSchedule(999L, request))
.isInstanceOf(ScheduleNotFoundException.class);
}
@Test
@DisplayName("updateScheduleContent는 제출 유형 기준으로 본문만 수정한다")
void updateScheduleContent_Success() {
// given
ScheduleContentUpdateRequest request = ScheduleContentUpdateRequest.builder()
.content("본문 수정")
.build();
// when
scheduleAdminFacade.updateScheduleContent(SUBMITTED, request);
// then
Schedule updated = fakeScheduleRepository.findById(savedScheduleId).orElseThrow();
assertEquals("본문 수정", updated.getContent());
}
@Test
@DisplayName("존재하지 않는 제출 유형으로 본문 수정 시 ScheduleNotFoundException을 발생시킨다")
void updateScheduleContent_NotFound_ThrowsException() {
// given
ScheduleContentUpdateRequest request = ScheduleContentUpdateRequest.builder()
.content("본문")
.build();
// when & then
assertThatThrownBy(() -> scheduleAdminFacade.updateScheduleContent(MIDTHESIS, request))
.isInstanceOf(ScheduleNotFoundException.class);
}
@Test
@DisplayName("deleteSchedule은 일정을 삭제한다")
void deleteSchedule_Success() {
// when
scheduleAdminFacade.deleteSchedule(savedScheduleId);
// then
assertTrue(fakeScheduleRepository.findById(savedScheduleId).isEmpty());
}
}