diff --git a/src/main/java/com/mr/domain/home/service/HomeService.java b/src/main/java/com/mr/domain/home/service/HomeService.java index 667f297d..7595efb2 100644 --- a/src/main/java/com/mr/domain/home/service/HomeService.java +++ b/src/main/java/com/mr/domain/home/service/HomeService.java @@ -24,13 +24,14 @@ import com.mr.domain.user.repository.UserRepository; import com.mr.global.apipayload.exception.GeneralException; import com.mr.global.util.RelativeDateFormatter; +import java.sql.Date; import java.time.DayOfWeek; import java.time.LocalDate; import java.time.LocalDateTime; import java.util.ArrayList; -import java.util.HashSet; import java.util.List; import java.util.Set; +import java.util.stream.Collectors; import lombok.RequiredArgsConstructor; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Slice; @@ -85,8 +86,9 @@ private List buildRecommendedLearnings( // 연속 출석일수는 기간 상한이 없어야 하므로 별도로 전체 기간 날짜만 조회 private Set fetchPracticeDates(Long userId) { - return new HashSet<>( - playingRepository.findDistinctEndedDatesByUserAndStatus(userId, PlayingStatus.COMPLETED)); + return playingRepository.findDistinctEndedDatesByUserAndStatus(userId, PlayingStatus.COMPLETED).stream() + .map(Date::toLocalDate) + .collect(Collectors.toSet()); } private UserSummary buildUserSummary(User user) { diff --git a/src/main/java/com/mr/domain/playing/repository/PlayingRepository.java b/src/main/java/com/mr/domain/playing/repository/PlayingRepository.java index 9e9bdc71..9ffee16f 100644 --- a/src/main/java/com/mr/domain/playing/repository/PlayingRepository.java +++ b/src/main/java/com/mr/domain/playing/repository/PlayingRepository.java @@ -3,7 +3,7 @@ import com.mr.domain.playing.entity.Playing; import com.mr.domain.playing.entity.enums.PlayingStatus; import jakarta.persistence.LockModeType; -import java.time.LocalDate; +import java.sql.Date; import java.time.LocalDateTime; import java.util.List; import java.util.Optional; @@ -85,7 +85,7 @@ select distinct function('date', p.endedAt) from Playing p and p.deletedAt is null and p.endedAt is not null """) - List findDistinctEndedDatesByUserAndStatus( + List findDistinctEndedDatesByUserAndStatus( @Param("userId") Long userId, @Param("status") PlayingStatus status ); diff --git a/src/test/java/com/mr/domain/home/service/HomeServiceTest.java b/src/test/java/com/mr/domain/home/service/HomeServiceTest.java index b5fed0a9..3b58cc27 100644 --- a/src/test/java/com/mr/domain/home/service/HomeServiceTest.java +++ b/src/test/java/com/mr/domain/home/service/HomeServiceTest.java @@ -28,6 +28,7 @@ import com.mr.domain.user.repository.StudentRepository; import com.mr.domain.user.repository.UserRepository; import com.mr.global.apipayload.exception.GeneralException; +import java.sql.Date; import java.time.DayOfWeek; import java.time.LocalDate; import java.time.LocalDateTime; @@ -90,6 +91,10 @@ private Playing mockPlaying(LocalDateTime endedAt, Integer durationSec) { return playing; } + private Date sqlDate(LocalDate date) { + return Date.valueOf(date); + } + @Test @DisplayName("getHome - 존재하지 않는 사용자면 404") void getHome_userNotFound_throws404() { @@ -140,7 +145,7 @@ void getHome_threeConsecutiveDaysIncludingToday_currentDaysIsThree() { LocalDate today = LocalDate.now(); given(playingRepository.findDistinctEndedDatesByUserAndStatus(1L, PlayingStatus.COMPLETED)).willReturn(List.of( - today, today.minusDays(1), today.minusDays(2), today.minusDays(5) // 연속 끊김 + sqlDate(today), sqlDate(today.minusDays(1)), sqlDate(today.minusDays(2)), sqlDate(today.minusDays(5)) )); HomeResponseDTO response = homeService.getHome(1L); @@ -154,8 +159,9 @@ void getHome_longStreak_notCappedByLookbackWindow() { stubBaseline(1L); LocalDate today = LocalDate.now(); - List endedDates = java.util.stream.IntStream.range(0, 65) + List endedDates = java.util.stream.IntStream.range(0, 65) .mapToObj(today::minusDays) + .map(this::sqlDate) .toList(); given(playingRepository.findDistinctEndedDatesByUserAndStatus(1L, PlayingStatus.COMPLETED)).willReturn(endedDates); @@ -171,7 +177,7 @@ void getHome_noPracticeToday_countsFromYesterday() { LocalDate yesterday = LocalDate.now().minusDays(1); given(playingRepository.findDistinctEndedDatesByUserAndStatus(1L, PlayingStatus.COMPLETED)) - .willReturn(List.of(yesterday)); + .willReturn(List.of(sqlDate(yesterday))); HomeResponseDTO response = homeService.getHome(1L); @@ -185,7 +191,7 @@ void getHome_duplicateDateFromRepository_countsOnce() { LocalDate today = LocalDate.now(); given(playingRepository.findDistinctEndedDatesByUserAndStatus(1L, PlayingStatus.COMPLETED)) - .willReturn(List.of(today, today, today)); + .willReturn(List.of(sqlDate(today), sqlDate(today), sqlDate(today))); HomeResponseDTO response = homeService.getHome(1L);