1919import static org .junit .jupiter .api .Assertions .assertEquals ;
2020import static org .mockito .ArgumentMatchers .any ;
2121import static org .mockito .Mockito .mock ;
22+ import static org .mockito .Mockito .verifyNoInteractions ;
2223import static org .mockito .Mockito .when ;
2324
2425@ SuppressWarnings ("PMD.JUnitAssertionsShouldIncludeMessage" )
@@ -145,17 +146,46 @@ void should_return_event_date_when_delay_duration_is_0() {
145146 assertEquals (eventDate , actualDelayUntil );
146147 }
147148
149+ @ Test
150+ void should_not_call_holiday_service_when_delay_duration_is_0 () {
151+ ZonedDateTime eventDate = ZonedDateTime .of (2022 , 7 , 1 , 9 , 0 , 0 , 0 , ZoneId .systemDefault ());
152+
153+ ZonedDateTime actualDelayUntil = underTest .calculateDelayUntil (eventDate , 0 );
154+
155+ assertEquals (eventDate , actualDelayUntil );
156+ verifyNoInteractions (holidayService );
157+ }
158+
159+ @ Test
160+ void should_return_event_date_when_add_working_days_for_delay_duration_is_0 () throws Exception {
161+ ZonedDateTime eventDate = ZonedDateTime .of (2022 , 7 , 1 , 9 , 0 , 0 , 0 , ZoneId .systemDefault ());
162+
163+ var method = DueDateService .class .getDeclaredMethod (
164+ "addWorkingDaysForDelayDuration" ,
165+ ZonedDateTime .class ,
166+ int .class
167+ );
168+ method .setAccessible (true );
169+
170+ ZonedDateTime actual = (ZonedDateTime ) method .invoke (underTest , eventDate , 0 );
171+
172+ assertEquals (eventDate , actual );
173+ verifyNoInteractions (holidayService );
174+ }
175+
148176 @ ParameterizedTest
149177 @ ValueSource (ints = {1 , 2 , 3 })
150178 void should_return_next_working_day_when_event_date_is_friday_and_has_delay_duration (int delayDuration ) {
151179
152180 ZonedDateTime eventDate = ZonedDateTime .of (2022 , 7 , 1 , 9 , 0 , 0 , 0 , ZoneId .systemDefault ());
153181
154- ZonedDateTime expectedDueDateMonday = ZonedDateTime .of (2022 , 7 , 4 , 16 , 0 , 0 , 0 , ZoneId .systemDefault ());
182+ ZonedDateTime expectedDelayUntilDate = eventDate
183+ .plusDays (3 + (delayDuration - 1 ))
184+ .withHour (16 ).withMinute (0 ).withSecond (0 ).withNano (0 );
155185
156186 ZonedDateTime actualDelayUntilDate = underTest .calculateDelayUntil (eventDate , delayDuration );
157187
158- assertEquals (expectedDueDateMonday , actualDelayUntilDate );
188+ assertEquals (expectedDelayUntilDate , actualDelayUntilDate );
159189 }
160190
161191 @ ParameterizedTest
@@ -166,11 +196,27 @@ void should_return_next_working_day_when_event_date_plus_delay_duration_matches_
166196 when (holidayService .isHoliday (eventDate .plusDays (3 )))
167197 .thenReturn (true );
168198
169- ZonedDateTime expectedDueDateMonday = ZonedDateTime .of (2022 , 8 , 30 , 16 , 0 , 0 , 0 , ZoneId .systemDefault ());
199+ ZonedDateTime expectedDelayUntilDate = ZonedDateTime .of (2022 , 8 , 30 , 16 , 0 , 0 , 0 , ZoneId .systemDefault ())
200+ .plusDays (delayDuration - 1L );
170201
171202 ZonedDateTime actualDelayUntilDate = underTest .calculateDelayUntil (eventDate , delayDuration );
172203
173- assertEquals (expectedDueDateMonday , actualDelayUntilDate );
204+ assertEquals (expectedDelayUntilDate , actualDelayUntilDate );
205+ }
206+
207+ @ Test
208+ void should_skip_weekend_and_holiday_when_calculating_delay_duration () {
209+ ZonedDateTime eventDate = ZonedDateTime .of (2022 , 8 , 25 , 9 , 0 , 0 , 0 , ZoneId .systemDefault ());
210+
211+ when (holidayService .isHoliday (any (ZonedDateTime .class ))).thenReturn (false );
212+ when (holidayService .isHoliday (ZonedDateTime .of (2022 , 8 , 29 , 9 , 0 , 0 , 0 , ZoneId .systemDefault ())))
213+ .thenReturn (true );
214+
215+ ZonedDateTime expectedDelayUntilDate = ZonedDateTime .of (2022 , 8 , 31 , 16 , 0 , 0 , 0 , ZoneId .systemDefault ());
216+
217+ ZonedDateTime actualDelayUntilDate = underTest .calculateDelayUntil (eventDate , 3 );
218+
219+ assertEquals (expectedDelayUntilDate , actualDelayUntilDate );
174220 }
175221
176222 private void checkWorkingDays (ZonedDateTime startDay , int leadTimeDays , ZonedDateTime expectedDueDate ) {
@@ -202,7 +248,7 @@ private static Stream<ZonedDateTimeScenario> scenarioProvider() {
202248 ZonedDateTime .of (2021 , 3 , 1 , 16 , 0 , 0 , 0 , ZoneId .systemDefault ()))
203249 .days (18 )
204250 .expectedDateTime (
205- ZonedDateTime .of (2021 , 3 , 19 , 16 , 0 , 0 , 0 , ZoneId .systemDefault ()))
251+ ZonedDateTime .of (2021 , 3 , 25 , 16 , 0 , 0 , 0 , ZoneId .systemDefault ()))
206252 .build (),
207253
208254 ZonedDateTimeScenario .builder ()
@@ -226,15 +272,15 @@ private static Stream<ZonedDateTimeScenario> scenarioProvider() {
226272 ZonedDateTime .of (2021 , 3 , 1 , 16 , 0 , 0 , 0 , ZoneId .systemDefault ()))
227273 .days (30 )
228274 .expectedDateTime (
229- ZonedDateTime .of (2021 , 3 , 31 , 16 , 0 , 0 , 0 , ZoneId .systemDefault ()))
275+ ZonedDateTime .of (2021 , 4 , 12 , 16 , 0 , 0 , 0 , ZoneId .systemDefault ()))
230276 .build (),
231277
232278 ZonedDateTimeScenario .builder ()
233279 .actualDateTime (
234280 ZonedDateTime .of (2021 , 3 , 1 , 16 , 0 , 0 , 0 , ZoneId .systemDefault ()))
235281 .days (31 )
236282 .expectedDateTime (
237- ZonedDateTime .of (2021 , 4 , 1 , 16 , 0 , 0 , 0 , ZoneId .systemDefault ()))
283+ ZonedDateTime .of (2021 , 4 , 13 , 16 , 0 , 0 , 0 , ZoneId .systemDefault ()))
238284 .build ()
239285 );
240286 }
0 commit comments