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