generated from pricelees/issue-pr-template
[#18] 코드 정리 및 일부 컨벤션 통일 #19
@ -5,11 +5,9 @@ import io.github.oshai.kotlinlogging.KotlinLogging
|
|||||||
import org.springframework.http.HttpStatus
|
import org.springframework.http.HttpStatus
|
||||||
import org.springframework.http.ResponseEntity
|
import org.springframework.http.ResponseEntity
|
||||||
import org.springframework.http.converter.HttpMessageNotReadableException
|
import org.springframework.http.converter.HttpMessageNotReadableException
|
||||||
import org.springframework.web.HttpRequestMethodNotSupportedException
|
|
||||||
import org.springframework.web.bind.MethodArgumentNotValidException
|
import org.springframework.web.bind.MethodArgumentNotValidException
|
||||||
import org.springframework.web.bind.annotation.ExceptionHandler
|
import org.springframework.web.bind.annotation.ExceptionHandler
|
||||||
import org.springframework.web.bind.annotation.RestControllerAdvice
|
import org.springframework.web.bind.annotation.RestControllerAdvice
|
||||||
import org.springframework.web.client.ResourceAccessException
|
|
||||||
import roomescape.common.dto.response.CommonErrorResponse
|
import roomescape.common.dto.response.CommonErrorResponse
|
||||||
|
|
||||||
@RestControllerAdvice
|
@RestControllerAdvice
|
||||||
@ -54,7 +54,6 @@ class PaymentService(
|
|||||||
canceledAt = cancelInfo.canceledAt
|
canceledAt = cancelInfo.canceledAt
|
||||||
).also { canceledPaymentRepository.save(it) }
|
).also { canceledPaymentRepository.save(it) }
|
||||||
|
|
||||||
|
|
||||||
@Transactional
|
@Transactional
|
||||||
fun createCanceledPaymentByReservationId(reservationId: Long): PaymentCancelRequest {
|
fun createCanceledPaymentByReservationId(reservationId: Long): PaymentCancelRequest {
|
||||||
val paymentKey: String = paymentRepository.findPaymentKeyByReservationId(reservationId)
|
val paymentKey: String = paymentRepository.findPaymentKeyByReservationId(reservationId)
|
||||||
@ -98,7 +98,6 @@ class ReservationService(
|
|||||||
reservationRepository.save(it)
|
reservationRepository.save(it)
|
||||||
}.toRetrieveResponse()
|
}.toRetrieveResponse()
|
||||||
|
|
||||||
|
|
||||||
private fun validateMemberAlreadyReserve(themeId: Long?, timeId: Long?, date: LocalDate?, memberId: Long?) {
|
private fun validateMemberAlreadyReserve(themeId: Long?, timeId: Long?, date: LocalDate?, memberId: Long?) {
|
||||||
val spec: Specification<ReservationEntity> = ReservationSearchSpecification()
|
val spec: Specification<ReservationEntity> = ReservationSearchSpecification()
|
||||||
.sameMemberId(memberId)
|
.sameMemberId(memberId)
|
||||||
@ -49,7 +49,6 @@ class ReservationWithPaymentService(
|
|||||||
@Transactional(readOnly = true)
|
@Transactional(readOnly = true)
|
||||||
fun isNotPaidReservation(reservationId: Long): Boolean = !paymentService.isReservationPaid(reservationId)
|
fun isNotPaidReservation(reservationId: Long): Boolean = !paymentService.isReservationPaid(reservationId)
|
||||||
|
|
||||||
|
|
||||||
fun updateCanceledTime(
|
fun updateCanceledTime(
|
||||||
paymentKey: String,
|
paymentKey: String,
|
||||||
canceledAt: OffsetDateTime
|
canceledAt: OffsetDateTime
|
||||||
@ -27,7 +27,6 @@ class TimeService(
|
|||||||
HttpStatus.BAD_REQUEST
|
HttpStatus.BAD_REQUEST
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
@Transactional(readOnly = true)
|
@Transactional(readOnly = true)
|
||||||
fun findAll(): TimeRetrieveListResponse = timeRepository.findAll().toRetrieveListResponse()
|
fun findAll(): TimeRetrieveListResponse = timeRepository.findAll().toRetrieveListResponse()
|
||||||
|
|
||||||
@ -12,10 +12,10 @@ import org.springframework.web.bind.annotation.RequestParam
|
|||||||
import roomescape.auth.web.support.Admin
|
import roomescape.auth.web.support.Admin
|
||||||
import roomescape.auth.web.support.LoginRequired
|
import roomescape.auth.web.support.LoginRequired
|
||||||
import roomescape.common.dto.response.CommonApiResponse
|
import roomescape.common.dto.response.CommonApiResponse
|
||||||
import roomescape.reservation.web.TimeWithAvailabilityListResponse
|
|
||||||
import roomescape.reservation.web.TimeCreateRequest
|
import roomescape.reservation.web.TimeCreateRequest
|
||||||
import roomescape.reservation.web.TimeCreateResponse
|
import roomescape.reservation.web.TimeCreateResponse
|
||||||
import roomescape.reservation.web.TimeRetrieveListResponse
|
import roomescape.reservation.web.TimeRetrieveListResponse
|
||||||
|
import roomescape.reservation.web.TimeWithAvailabilityListResponse
|
||||||
import java.time.LocalDate
|
import java.time.LocalDate
|
||||||
|
|
||||||
@Tag(name = "4. 예약 시간 API", description = "예약 시간을 조회 / 추가 / 삭제할 때 사용합니다.")
|
@Tag(name = "4. 예약 시간 API", description = "예약 시간을 조회 / 추가 / 삭제할 때 사용합니다.")
|
||||||
@ -1,7 +1,6 @@
|
|||||||
package roomescape.reservation.infrastructure.persistence
|
package roomescape.reservation.infrastructure.persistence
|
||||||
|
|
||||||
import com.fasterxml.jackson.annotation.JsonIgnore
|
import com.fasterxml.jackson.annotation.JsonIgnore
|
||||||
import io.swagger.v3.oas.annotations.media.Schema
|
|
||||||
import jakarta.persistence.*
|
import jakarta.persistence.*
|
||||||
import roomescape.member.infrastructure.persistence.MemberEntity
|
import roomescape.member.infrastructure.persistence.MemberEntity
|
||||||
import roomescape.theme.infrastructure.persistence.ThemeEntity
|
import roomescape.theme.infrastructure.persistence.ThemeEntity
|
||||||
@ -8,8 +8,8 @@ import roomescape.auth.web.support.MemberId
|
|||||||
import roomescape.common.dto.response.CommonApiResponse
|
import roomescape.common.dto.response.CommonApiResponse
|
||||||
import roomescape.common.exception.RoomescapeException
|
import roomescape.common.exception.RoomescapeException
|
||||||
import roomescape.payment.infrastructure.client.PaymentApproveRequest
|
import roomescape.payment.infrastructure.client.PaymentApproveRequest
|
||||||
import roomescape.payment.infrastructure.client.TossPaymentClient
|
|
||||||
import roomescape.payment.infrastructure.client.PaymentApproveResponse
|
import roomescape.payment.infrastructure.client.PaymentApproveResponse
|
||||||
|
import roomescape.payment.infrastructure.client.TossPaymentClient
|
||||||
import roomescape.payment.web.PaymentCancelRequest
|
import roomescape.payment.web.PaymentCancelRequest
|
||||||
import roomescape.reservation.business.ReservationService
|
import roomescape.reservation.business.ReservationService
|
||||||
import roomescape.reservation.business.ReservationWithPaymentService
|
import roomescape.reservation.business.ReservationWithPaymentService
|
||||||
@ -30,7 +30,6 @@ class ThemeService(
|
|||||||
fun findAll(): ThemesResponse = themeRepository.findAll()
|
fun findAll(): ThemesResponse = themeRepository.findAll()
|
||||||
.toResponse()
|
.toResponse()
|
||||||
|
|
||||||
|
|
||||||
@Transactional(readOnly = true)
|
@Transactional(readOnly = true)
|
||||||
fun findMostReservedThemes(count: Int): ThemesResponse {
|
fun findMostReservedThemes(count: Int): ThemesResponse {
|
||||||
val today = LocalDate.now()
|
val today = LocalDate.now()
|
||||||
@ -46,7 +46,6 @@ fun ThemeEntity.toResponse(): ThemeResponse = ThemeResponse(
|
|||||||
thumbnail = this.thumbnail
|
thumbnail = this.thumbnail
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
@Schema(name = "테마 목록 조회 응답", description = "모든 테마 목록 조회 응답시 사용됩니다.")
|
@Schema(name = "테마 목록 조회 응답", description = "모든 테마 목록 조회 응답시 사용됩니다.")
|
||||||
data class ThemesResponse(
|
data class ThemesResponse(
|
||||||
@field:Schema(description = "모든 테마 목록")
|
@field:Schema(description = "모든 테마 목록")
|
||||||
@ -17,7 +17,6 @@ import roomescape.member.infrastructure.persistence.MemberRepository
|
|||||||
import roomescape.util.JwtFixture
|
import roomescape.util.JwtFixture
|
||||||
import roomescape.util.MemberFixture
|
import roomescape.util.MemberFixture
|
||||||
|
|
||||||
|
|
||||||
class AuthServiceTest : BehaviorSpec({
|
class AuthServiceTest : BehaviorSpec({
|
||||||
val memberRepository: MemberRepository = mockk()
|
val memberRepository: MemberRepository = mockk()
|
||||||
val memberService: MemberService = MemberService(memberRepository)
|
val memberService: MemberService = MemberService(memberRepository)
|
||||||
@ -1,6 +1,5 @@
|
|||||||
package roomescape.payment.infrastructure.client
|
package roomescape.payment.infrastructure.client
|
||||||
|
|
||||||
import roomescape.payment.infrastructure.client.PaymentApproveRequest
|
|
||||||
import roomescape.payment.web.PaymentCancelRequest
|
import roomescape.payment.web.PaymentCancelRequest
|
||||||
import kotlin.math.roundToLong
|
import kotlin.math.roundToLong
|
||||||
|
|
||||||
@ -73,7 +73,7 @@ class TimeServiceTest : FunSpec({
|
|||||||
val time = TimeFixture.create()
|
val time = TimeFixture.create()
|
||||||
|
|
||||||
every { timeRepository.findByIdOrNull(id) } returns time
|
every { timeRepository.findByIdOrNull(id) } returns time
|
||||||
|
|
||||||
every { reservationRepository.findByTime(time) } returns listOf(mockk())
|
every { reservationRepository.findByTime(time) } returns listOf(mockk())
|
||||||
|
|
||||||
shouldThrow<RoomescapeException> {
|
shouldThrow<RoomescapeException> {
|
||||||
@ -12,8 +12,8 @@ import roomescape.reservation.web.MyReservationRetrieveResponse
|
|||||||
import roomescape.theme.infrastructure.persistence.ThemeEntity
|
import roomescape.theme.infrastructure.persistence.ThemeEntity
|
||||||
import roomescape.util.PaymentFixture
|
import roomescape.util.PaymentFixture
|
||||||
import roomescape.util.ReservationFixture
|
import roomescape.util.ReservationFixture
|
||||||
import roomescape.util.TimeFixture
|
|
||||||
import roomescape.util.ThemeFixture
|
import roomescape.util.ThemeFixture
|
||||||
|
import roomescape.util.TimeFixture
|
||||||
|
|
||||||
@DataJpaTest
|
@DataJpaTest
|
||||||
class ReservationRepositoryTest(
|
class ReservationRepositoryTest(
|
||||||
@ -10,8 +10,8 @@ import roomescape.member.infrastructure.persistence.MemberEntity
|
|||||||
import roomescape.theme.infrastructure.persistence.ThemeEntity
|
import roomescape.theme.infrastructure.persistence.ThemeEntity
|
||||||
import roomescape.util.MemberFixture
|
import roomescape.util.MemberFixture
|
||||||
import roomescape.util.ReservationFixture
|
import roomescape.util.ReservationFixture
|
||||||
import roomescape.util.TimeFixture
|
|
||||||
import roomescape.util.ThemeFixture
|
import roomescape.util.ThemeFixture
|
||||||
|
import roomescape.util.TimeFixture
|
||||||
import java.time.LocalDate
|
import java.time.LocalDate
|
||||||
|
|
||||||
@DataJpaTest
|
@DataJpaTest
|
||||||
@ -18,9 +18,9 @@ import roomescape.reservation.infrastructure.persistence.ReservationRepository
|
|||||||
import roomescape.reservation.infrastructure.persistence.TimeEntity
|
import roomescape.reservation.infrastructure.persistence.TimeEntity
|
||||||
import roomescape.reservation.infrastructure.persistence.TimeRepository
|
import roomescape.reservation.infrastructure.persistence.TimeRepository
|
||||||
import roomescape.util.ReservationFixture
|
import roomescape.util.ReservationFixture
|
||||||
import roomescape.util.TimeFixture
|
|
||||||
import roomescape.util.RoomescapeApiTest
|
import roomescape.util.RoomescapeApiTest
|
||||||
import roomescape.util.ThemeFixture
|
import roomescape.util.ThemeFixture
|
||||||
|
import roomescape.util.TimeFixture
|
||||||
import java.time.LocalDate
|
import java.time.LocalDate
|
||||||
import java.time.LocalTime
|
import java.time.LocalTime
|
||||||
|
|
||||||
@ -7,8 +7,8 @@ import roomescape.reservation.infrastructure.persistence.TimeEntity
|
|||||||
import roomescape.theme.infrastructure.persistence.ThemeEntity
|
import roomescape.theme.infrastructure.persistence.ThemeEntity
|
||||||
import roomescape.util.MemberFixture
|
import roomescape.util.MemberFixture
|
||||||
import roomescape.util.ReservationFixture
|
import roomescape.util.ReservationFixture
|
||||||
import roomescape.util.TimeFixture
|
|
||||||
import roomescape.util.ThemeFixture
|
import roomescape.util.ThemeFixture
|
||||||
|
import roomescape.util.TimeFixture
|
||||||
import java.time.LocalDate
|
import java.time.LocalDate
|
||||||
import java.time.LocalTime
|
import java.time.LocalTime
|
||||||
|
|
||||||
@ -9,22 +9,15 @@ import org.hamcrest.Matchers.equalTo
|
|||||||
import org.springframework.boot.test.context.SpringBootTest
|
import org.springframework.boot.test.context.SpringBootTest
|
||||||
import org.springframework.boot.test.web.server.LocalServerPort
|
import org.springframework.boot.test.web.server.LocalServerPort
|
||||||
import org.springframework.transaction.support.TransactionTemplate
|
import org.springframework.transaction.support.TransactionTemplate
|
||||||
import roomescape.theme.business.ThemeService
|
|
||||||
import roomescape.theme.util.TestThemeCreateUtil
|
import roomescape.theme.util.TestThemeCreateUtil
|
||||||
import roomescape.util.CleanerMode
|
import roomescape.util.CleanerMode
|
||||||
import roomescape.util.DatabaseCleanerExtension
|
import roomescape.util.DatabaseCleanerExtension
|
||||||
import java.time.LocalDate
|
import java.time.LocalDate
|
||||||
import kotlin.random.Random
|
import kotlin.random.Random
|
||||||
|
|
||||||
/**
|
|
||||||
* GET /themes/most-reserved-last-week API 테스트
|
|
||||||
* 상세 테스트는 Repository 테스트에서 진행
|
|
||||||
* 날짜 범위, 예약 수만 검증
|
|
||||||
*/
|
|
||||||
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
|
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
|
||||||
class MostReservedThemeAPITest(
|
class MostReservedThemeApiTest(
|
||||||
@LocalServerPort val port: Int,
|
@LocalServerPort val port: Int,
|
||||||
val themeService: ThemeService,
|
|
||||||
val transactionTemplate: TransactionTemplate,
|
val transactionTemplate: TransactionTemplate,
|
||||||
val entityManager: EntityManager,
|
val entityManager: EntityManager,
|
||||||
) : FunSpec({
|
) : FunSpec({
|
||||||
@ -53,59 +46,55 @@ class MostReservedThemeAPITest(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
context("가장 많이 예약된 테마를 조회할 때, ") {
|
context("지난 주 가장 많이 예약된 테마 API") {
|
||||||
val endpoint = "/themes/most-reserved-last-week"
|
val endpoint = "/themes/most-reserved-last-week"
|
||||||
test("갯수를 입력하지 않으면 10개를 반환한다.") {
|
|
||||||
|
test("count 파라미터가 없으면 10개를 반환한다") {
|
||||||
Given {
|
Given {
|
||||||
port(port)
|
port(port)
|
||||||
} When {
|
} When {
|
||||||
get(endpoint)
|
get(endpoint)
|
||||||
} Then {
|
} Then {
|
||||||
log().all()
|
|
||||||
statusCode(200)
|
statusCode(200)
|
||||||
body("data.themes.size()", equalTo(10))
|
body("data.themes.size()", equalTo(10))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
test("입력된 갯수가 조회된 갯수보다 크면 조회된 갯수만큼 반환한다.") {
|
test("조회된 테마가 count보다 적으면 조회된 만큼 반환한다") {
|
||||||
val count = 15
|
val count = 15
|
||||||
Given {
|
Given {
|
||||||
port(port)
|
port(port)
|
||||||
} When {
|
|
||||||
param("count", count)
|
param("count", count)
|
||||||
get("/themes/most-reserved-last-week")
|
} When {
|
||||||
|
get(endpoint)
|
||||||
} Then {
|
} Then {
|
||||||
log().all()
|
|
||||||
statusCode(200)
|
statusCode(200)
|
||||||
body("data.themes.size()", equalTo(10))
|
body("data.themes.size()", equalTo(10))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
test("입력된 갯수가 조회된 갯수보다 작으면 입력된 갯수만큼 반환한다.") {
|
test("조회된 테마가 count보다 많으면 count만큼 반환한다") {
|
||||||
val count = 5
|
val count = 5
|
||||||
Given {
|
Given {
|
||||||
port(port)
|
port(port)
|
||||||
} When {
|
|
||||||
param("count", count)
|
param("count", count)
|
||||||
get("/themes/most-reserved-last-week")
|
} When {
|
||||||
|
get(endpoint)
|
||||||
} Then {
|
} Then {
|
||||||
log().all()
|
|
||||||
statusCode(200)
|
statusCode(200)
|
||||||
body("data.themes.size()", equalTo(count))
|
body("data.themes.size()", equalTo(count))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
test("7일 전 부터 1일 전 까지 예약된 테마를 대상으로 한다.") {
|
test("지난 7일 동안의 예약만 집계한다") {
|
||||||
// 현재 저장된 데이터는 지난 7일간 예약된 테마 10개와 8일 전 예약된 테마 1개
|
// 8일 전에 예약된 테마는 집계에서 제외되어야 한다.
|
||||||
// 8일 전 예약된 테마는 제외되어야 하므로, 10개가 조회되어야 한다.
|
|
||||||
val count = 11
|
val count = 11
|
||||||
Given {
|
Given {
|
||||||
port(port)
|
port(port)
|
||||||
} When {
|
|
||||||
param("count", count)
|
param("count", count)
|
||||||
get("/themes/most-reserved-last-week")
|
} When {
|
||||||
|
get(endpoint)
|
||||||
} Then {
|
} Then {
|
||||||
log().all()
|
|
||||||
statusCode(200)
|
statusCode(200)
|
||||||
body("data.themes.size()", equalTo(10))
|
body("data.themes.size()", equalTo(10))
|
||||||
}
|
}
|
||||||
@ -4,10 +4,10 @@ import roomescape.auth.infrastructure.jwt.JwtHandler
|
|||||||
import roomescape.auth.web.LoginRequest
|
import roomescape.auth.web.LoginRequest
|
||||||
import roomescape.member.infrastructure.persistence.MemberEntity
|
import roomescape.member.infrastructure.persistence.MemberEntity
|
||||||
import roomescape.member.infrastructure.persistence.Role
|
import roomescape.member.infrastructure.persistence.Role
|
||||||
import roomescape.payment.infrastructure.persistence.CanceledPaymentEntity
|
|
||||||
import roomescape.payment.infrastructure.persistence.PaymentEntity
|
|
||||||
import roomescape.payment.infrastructure.client.PaymentApproveRequest
|
import roomescape.payment.infrastructure.client.PaymentApproveRequest
|
||||||
import roomescape.payment.infrastructure.client.PaymentApproveResponse
|
import roomescape.payment.infrastructure.client.PaymentApproveResponse
|
||||||
|
import roomescape.payment.infrastructure.persistence.CanceledPaymentEntity
|
||||||
|
import roomescape.payment.infrastructure.persistence.PaymentEntity
|
||||||
import roomescape.payment.web.PaymentCancelRequest
|
import roomescape.payment.web.PaymentCancelRequest
|
||||||
import roomescape.payment.web.PaymentCancelResponse
|
import roomescape.payment.web.PaymentCancelResponse
|
||||||
import roomescape.reservation.infrastructure.persistence.ReservationEntity
|
import roomescape.reservation.infrastructure.persistence.ReservationEntity
|
||||||
Loading…
x
Reference in New Issue
Block a user