diff --git a/service/src/main/kotlin/com/sangdol/roomescape/theme/infrastructure/persistence/ThemeRepository.kt b/service/src/main/kotlin/com/sangdol/roomescape/theme/infrastructure/persistence/ThemeRepository.kt index cef38dff..2260e2fe 100644 --- a/service/src/main/kotlin/com/sangdol/roomescape/theme/infrastructure/persistence/ThemeRepository.kt +++ b/service/src/main/kotlin/com/sangdol/roomescape/theme/infrastructure/persistence/ThemeRepository.kt @@ -32,10 +32,9 @@ interface ThemeRepository : JpaRepository { AND (s.date BETWEEN :startFrom AND :endAt) GROUP BY s.theme_id - ORDER BY - reservation_count desc LIMIT :count ) ranked_themes ON t.id = ranked_themes.theme_id + ORDER BY ranked_themes.reservation_count DESC, t.id ASC """, nativeQuery = true ) diff --git a/service/src/test/kotlin/com/sangdol/roomescape/theme/ThemeApiTest.kt b/service/src/test/kotlin/com/sangdol/roomescape/theme/ThemeApiTest.kt index 30e51c65..3051cd56 100644 --- a/service/src/test/kotlin/com/sangdol/roomescape/theme/ThemeApiTest.kt +++ b/service/src/test/kotlin/com/sangdol/roomescape/theme/ThemeApiTest.kt @@ -4,14 +4,15 @@ import com.sangdol.common.types.web.HttpStatus import com.sangdol.common.utils.KoreaDate import com.sangdol.roomescape.supports.* import com.sangdol.roomescape.theme.business.DateUtils +import com.sangdol.roomescape.theme.dto.ThemeInfoResponse import com.sangdol.roomescape.theme.exception.ThemeErrorCode import com.sangdol.roomescape.theme.infrastructure.persistence.ThemeEntity import com.sangdol.roomescape.theme.infrastructure.persistence.ThemeRepository -import com.sangdol.roomescape.theme.dto.ThemeInfoResponse import com.sangdol.roomescape.theme.mapper.toEntity import com.sangdol.roomescape.user.infrastructure.persistence.UserEntity import io.kotest.matchers.collections.shouldContainInOrder import io.kotest.matchers.collections.shouldHaveSize +import io.kotest.matchers.comparables.shouldBeLessThan import org.hamcrest.CoreMatchers.equalTo import org.springframework.http.HttpMethod import java.time.LocalDate @@ -72,6 +73,35 @@ class ThemeApiTest( response.map { it.id }.shouldContainInOrder(expectedResult) } } + + test("예약 수가 동일한 경우 ID 오름차순으로 정렬한다.") { + val expectedSize = initialize("두 개의 테마에 각각 1개의 확정 예약 생성") { + val user = testAuthUtil.defaultUserLogin() + (1..2).map { _ -> + dummyInitializer.createConfirmReservation( + user.first, + scheduleRequest = ScheduleFixture.createRequest.copy( + date = DateUtils.getSundayOfPreviousWeek(KoreaDate.today()) + ) + ) + } + }.size + + runTest( + on = { + get("/themes/most-reserved?count=10") + }, + expect = { + statusCode(HttpStatus.OK.value()) + } + ).also { res -> + val response: List = + ResponseParser.parseListResponse(res.extract().path("data.themes")) + + response shouldHaveSize expectedSize + response[0].id shouldBeLessThan response[1].id + } + } } }