Skip to content

Commit 4a9a958

Browse files
[#135]; feat: AvailableTimeParser 테스트 코드 추가
[#135]; feat: AvailableTimeParser 테스트 코드 추가
2 parents 03dbab4 + acb720d commit 4a9a958

1 file changed

Lines changed: 189 additions & 0 deletions

File tree

Lines changed: 189 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,189 @@
1+
package com.yourssu.scouter.ats.business.support.utils
2+
3+
import com.yourssu.scouter.common.implement.support.google.ResponseItem
4+
import com.yourssu.scouter.common.implement.support.initialization.ApplicantAvailableTimeMap
5+
import org.junit.jupiter.api.DisplayName
6+
import org.junit.jupiter.api.Test
7+
import java.time.LocalDateTime
8+
import kotlin.test.assertEquals
9+
10+
class AvailableTimeParserTest {
11+
12+
val availableTimeMap: ApplicantAvailableTimeMap = ApplicantAvailableTimeMap(
13+
time = listOf("(\\d+)시\\s*~\\s*(\\d+)시"),
14+
days = listOf("yyyy M월 d일 E요일 HH:mm", "yyyy MM.dd HH:mm")
15+
)
16+
17+
val parser = AvailableTimeParser(availableTimeMap)
18+
19+
@Test
20+
@DisplayName("지원자의 면접 가능시간을 나타내는 ResponseItem 배열을 LocalDateTime 배열로 변환한다.")
21+
fun parseTimeOnlyHourSuccessTest() {
22+
// given
23+
val item1 = ResponseItem(":09.24", "12시~15시")
24+
val responseItems: List<ResponseItem> = listOf(item1)
25+
26+
val expectedOutput = listOf(
27+
LocalDateTime.of(2025, 9, 24, 12, 0),
28+
LocalDateTime.of(2025, 9, 24, 13, 0),
29+
LocalDateTime.of(2025, 9, 24, 14, 0),
30+
)
31+
// when
32+
val localDateTimes = parser.parse(responseItems)
33+
// then
34+
assertEquals(expectedOutput, localDateTimes)
35+
}
36+
37+
@Test
38+
@DisplayName("availableTimeMap에 지원하는 날짜 형식이 없는 경우 빈 배열을 반환한다.")
39+
fun parseInvalidDayFormatTest() {
40+
// given
41+
val item1 = ResponseItem(":9/24", "12시~15시")
42+
val responseItems: List<ResponseItem> = listOf(item1)
43+
// when
44+
val localDateTimes = parser.parse(responseItems)
45+
// then
46+
assertEquals(emptyList(), localDateTimes)
47+
}
48+
49+
@Test
50+
@DisplayName("availableTimeMap에 지원하는 시간 형식이 없는 경우 빈 배열을 반환한다.")
51+
fun parseInvalidTimeFormatTest() {
52+
// given
53+
val item1 = ResponseItem(":9.24", "12:00~15:00")
54+
val responseItems: List<ResponseItem> = listOf(item1)
55+
// when
56+
val localDateTimes = parser.parse(responseItems)
57+
// then
58+
assertEquals(emptyList(), localDateTimes)
59+
}
60+
61+
@Test
62+
@DisplayName("빈 배열이 입력으로 들어올 경우, 빈 배열을 반환한다.")
63+
fun parseEmptyListTest() {
64+
// given
65+
val responseItems: List<ResponseItem> = emptyList()
66+
// when
67+
val localDateTimes = parser.parse(responseItems)
68+
// then
69+
assertEquals(emptyList(), localDateTimes)
70+
}
71+
72+
@Test
73+
@DisplayName("시간이 역순으로 들어올 경우, 빈 배열을 반환한다.")
74+
fun parseReversedTimeTest() {
75+
// given
76+
val item1 = ResponseItem(":9.24", answer = "14시~12시")
77+
val responseItems = listOf(item1)
78+
// when
79+
val localDateTimes = parser.parse(responseItems)
80+
// then
81+
assertEquals(emptyList(), localDateTimes)
82+
}
83+
84+
@Test
85+
@DisplayName("응답이 '불가'인 경우 빈 배열을 반환한다.")
86+
fun parseUnavailableAnswerTest() {
87+
// given
88+
val item1 = ResponseItem(":9.24", answer = "불가")
89+
val responseItems = listOf(item1)
90+
// when
91+
val localDateTimes = parser.parse(responseItems)
92+
// then
93+
assertEquals(emptyList(), localDateTimes)
94+
}
95+
96+
@Test
97+
@DisplayName("응답이 '상관없음'인 경우 00:00부터 23:00까지 모든 시간을 반환한다.")
98+
fun parseAllAvailableAnswerTest() {
99+
// given
100+
val item1 = ResponseItem(":09.24", answer = "상관없음")
101+
val responseItems = listOf(item1)
102+
// when
103+
val localDateTimes = parser.parse(responseItems)
104+
// then
105+
assertEquals(24, localDateTimes.size)
106+
assertEquals(LocalDateTime.of(2025, 9, 24, 0, 0), localDateTimes.first())
107+
assertEquals(LocalDateTime.of(2025, 9, 24, 23, 0), localDateTimes.last())
108+
}
109+
110+
@Test
111+
@DisplayName("쉼표로 구분된 여러 시간을 파싱한다.")
112+
fun parseMultipleTimesTest() {
113+
// given
114+
val item1 = ResponseItem(":09.24", answer = "12시~14시, 16시~18시")
115+
val responseItems = listOf(item1)
116+
val expectedOutput = listOf(
117+
LocalDateTime.of(2025, 9, 24, 12, 0),
118+
LocalDateTime.of(2025, 9, 24, 13, 0),
119+
LocalDateTime.of(2025, 9, 24, 16, 0),
120+
LocalDateTime.of(2025, 9, 24, 17, 0)
121+
)
122+
// when
123+
val localDateTimes = parser.parse(responseItems)
124+
// then
125+
assertEquals(expectedOutput, localDateTimes)
126+
}
127+
128+
@Test
129+
@DisplayName("여러 ResponseItem이 있을 때 모든 시간을 합쳐서 반환한다.")
130+
fun parseMultipleResponseItemsTest() {
131+
// given
132+
val item1 = ResponseItem(":09.24", answer = "12시~14시")
133+
val item2 = ResponseItem(":09.25", answer = "16시~18시")
134+
val responseItems = listOf(item1, item2)
135+
val expectedOutput = listOf(
136+
LocalDateTime.of(2025, 9, 24, 12, 0),
137+
LocalDateTime.of(2025, 9, 24, 13, 0),
138+
LocalDateTime.of(2025, 9, 25, 16, 0),
139+
LocalDateTime.of(2025, 9, 25, 17, 0)
140+
)
141+
// when
142+
val localDateTimes = parser.parse(responseItems)
143+
// then
144+
assertEquals(expectedOutput, localDateTimes)
145+
}
146+
147+
@Test
148+
@DisplayName("각기 다른 날짜 형식을 사용해도 파싱한다.")
149+
fun parseAlternateDateFormatTest() {
150+
// given
151+
val item1 = ResponseItem(":09.24", answer = "12시~15시")
152+
val item2 = ResponseItem(":9월 25일 목요일", answer = "12시~13시")
153+
val responseItems = listOf(item1, item2)
154+
val expectedOutput = listOf(
155+
LocalDateTime.of(2025, 9, 24, 12, 0),
156+
LocalDateTime.of(2025, 9, 24, 13, 0),
157+
LocalDateTime.of(2025, 9, 24, 14, 0),
158+
LocalDateTime.of(2025, 9, 25, 12, 0),
159+
)
160+
// when
161+
val localDateTimes = parser.parse(responseItems)
162+
// then
163+
assertEquals(expectedOutput, localDateTimes)
164+
}
165+
166+
@Test
167+
@DisplayName("분 단위 시간 패턴을 파싱한다.")
168+
fun parseTimeWithMinutesTest() {
169+
// given
170+
val availableTimeMapWithMinutes = ApplicantAvailableTimeMap(
171+
time = listOf("(\\d+):(\\d+)\\s*~\\s*(\\d+):(\\d+)"),
172+
days = listOf("yyyy M월 d일 E요일 HH:mm")
173+
)
174+
val parserWithMinutes = AvailableTimeParser(availableTimeMapWithMinutes)
175+
176+
val item1 = ResponseItem(":9월 24일 수요일", answer = "12:30~14:30")
177+
val responseItems = listOf(item1)
178+
val expectedOutput = listOf(
179+
LocalDateTime.of(2025, 9, 24, 12, 30),
180+
LocalDateTime.of(2025, 9, 24, 13, 0),
181+
LocalDateTime.of(2025, 9, 24, 13, 30),
182+
LocalDateTime.of(2025, 9, 24, 14, 0),
183+
)
184+
// when
185+
val localDateTimes = parserWithMinutes.parse(responseItems)
186+
// then
187+
assertEquals(expectedOutput, localDateTimes)
188+
}
189+
}

0 commit comments

Comments
 (0)