Skip to content

Commit f9430a9

Browse files
committed
feat: 주문 상태 전환 검증 로직에 CoreException 도입 및 테스트 수정
1 parent ec48d7d commit f9430a9

File tree

3 files changed

+43
-17
lines changed

3 files changed

+43
-17
lines changed

src/main/kotlin/com/nilgil/commerce/order/Order.kt

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.nilgil.commerce.order
22

33
import com.nilgil.commerce.common.BaseEntity
4+
import com.nilgil.commerce.common.error.CoreException
45
import jakarta.persistence.Column
56
import jakarta.persistence.Entity
67
import jakarta.persistence.EnumType
@@ -22,29 +23,29 @@ class Order(
2223

2324
fun pay(paymentId: Long) {
2425
if (this.status != OrderStatus.CREATED) {
25-
throw IllegalStateException("결제를 진행할 수 없는 상태입니다.")
26+
throw CoreException(OrderError.INVALID_STATUS_TRANSITION, "결제를 진행할 수 없는 상태입니다.")
2627
}
2728
this.paymentId = paymentId
2829
this.status = OrderStatus.PAID
2930
}
3031

3132
fun complete() {
3233
if (this.status != OrderStatus.PAID) {
33-
throw IllegalStateException("완료 처리할 수 없는 상태입니다.")
34+
throw CoreException(OrderError.INVALID_STATUS_TRANSITION, "완료 처리할 수 없는 상태입니다.")
3435
}
3536
this.status = OrderStatus.COMPLETED
3637
}
3738

3839
fun cancel() {
3940
if (this.status != OrderStatus.CREATED && this.status != OrderStatus.PAID) {
40-
throw IllegalStateException("취소할 수 없는 상태입니다.")
41+
throw CoreException(OrderError.INVALID_STATUS_TRANSITION, "취소할 수 없는 상태입니다.")
4142
}
4243
this.status = OrderStatus.CANCELLED
4344
}
4445

4546
fun returnOrder() {
4647
if (this.status != OrderStatus.COMPLETED) {
47-
throw IllegalStateException("반품할 수 없는 상태입니다.")
48+
throw CoreException(OrderError.INVALID_STATUS_TRANSITION, "반품할 수 없는 상태입니다.")
4849
}
4950
this.status = OrderStatus.RETURNED
5051
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package com.nilgil.commerce.order
2+
3+
import com.nilgil.commerce.common.error.ErrorType
4+
import org.springframework.http.HttpStatus
5+
6+
enum class OrderError(
7+
override val status: HttpStatus,
8+
override val code: String,
9+
override val message: String,
10+
) : ErrorType {
11+
INVALID_STATUS_TRANSITION(HttpStatus.CONFLICT, "O001", "주문 상태를 변경할 수 없습니다."),
12+
}

src/test/kotlin/com/nilgil/commerce/order/OrderTest.kt

Lines changed: 26 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.nilgil.commerce.order
22

3+
import com.nilgil.commerce.common.error.CoreException
34
import org.assertj.core.api.Assertions.assertThat
45
import org.assertj.core.api.Assertions.assertThatThrownBy
56
import org.junit.jupiter.api.DisplayName
@@ -37,14 +38,17 @@ class OrderTest {
3738
}
3839

3940
@Test
40-
fun `CREATED 상태가 아니면 IllegalStateException이 발생한다`() {
41+
fun `CREATED 상태가 아니면 INVALID_STATUS_TRANSITION 에러가 발생한다`() {
4142
// given
4243
val order = OrderFixtures.anOrder()
4344
order.pay(paymentId = 123L)
4445

4546
// when, then
4647
assertThatThrownBy { order.pay(paymentId = 456L) }
47-
.isInstanceOf(IllegalStateException::class.java)
48+
.isInstanceOf(CoreException::class.java)
49+
.extracting { it as CoreException }
50+
.extracting(CoreException::type)
51+
.isEqualTo(OrderError.INVALID_STATUS_TRANSITION)
4852
}
4953
}
5054

@@ -65,13 +69,16 @@ class OrderTest {
6569
}
6670

6771
@Test
68-
fun `PAID 상태가 아니면 IllegalStateException이 발생한다`() {
72+
fun `PAID 상태가 아니면 INVALID_STATUS_TRANSITION 에러가 발생한다`() {
6973
// given
7074
val order = OrderFixtures.anOrder()
7175

7276
// when, then
7377
assertThatThrownBy { order.complete() }
74-
.isInstanceOf(IllegalStateException::class.java)
78+
.isInstanceOf(CoreException::class.java)
79+
.extracting { it as CoreException }
80+
.extracting(CoreException::type)
81+
.isEqualTo(OrderError.INVALID_STATUS_TRANSITION)
7582
}
7683
}
7784

@@ -104,20 +111,22 @@ class OrderTest {
104111
}
105112

106113
@Test
107-
fun `COMPLETED 상태이면 IllegalStateException이 발생한다`() {
114+
fun `COMPLETED 상태이면 INVALID_STATUS_TRANSITION 에러가 발생한다`() {
108115
// given
109116
val order = OrderFixtures.anOrder()
110117
order.pay(123L)
111118
order.complete()
112119

113120
// when, then
114121
assertThatThrownBy { order.cancel() }
115-
.isInstanceOf(IllegalStateException::class.java)
116-
.hasMessage("취소할 수 없는 상태입니다.")
122+
.isInstanceOf(CoreException::class.java)
123+
.extracting { it as CoreException }
124+
.extracting(CoreException::type)
125+
.isEqualTo(OrderError.INVALID_STATUS_TRANSITION)
117126
}
118127

119128
@Test
120-
fun `RETURNED 상태이면 IllegalStateException이 발생한다`() {
129+
fun `RETURNED 상태이면 INVALID_STATUS_TRANSITION 에러가 발생한다`() {
121130
// given
122131
val order = OrderFixtures.anOrder()
123132
order.pay(123L)
@@ -126,8 +135,10 @@ class OrderTest {
126135

127136
// when, then
128137
assertThatThrownBy { order.cancel() }
129-
.isInstanceOf(IllegalStateException::class.java)
130-
.hasMessage("취소할 수 없는 상태입니다.")
138+
.isInstanceOf(CoreException::class.java)
139+
.extracting { it as CoreException }
140+
.extracting(CoreException::type)
141+
.isEqualTo(OrderError.INVALID_STATUS_TRANSITION)
131142
}
132143
}
133144

@@ -149,14 +160,16 @@ class OrderTest {
149160
}
150161

151162
@Test
152-
fun `COMPLETED 상태가 아니면 IllegalStateException이 발생한다`() {
163+
fun `COMPLETED 상태가 아니면 INVALID_STATUS_TRANSITION 에러가 발생한다`() {
153164
// given
154165
val order = OrderFixtures.anOrder()
155166

156167
// when, then
157168
assertThatThrownBy { order.returnOrder() }
158-
.isInstanceOf(IllegalStateException::class.java)
159-
.hasMessage("반품할 수 없는 상태입니다.")
169+
.isInstanceOf(CoreException::class.java)
170+
.extracting { it as CoreException }
171+
.extracting(CoreException::type)
172+
.isEqualTo(OrderError.INVALID_STATUS_TRANSITION)
160173
}
161174
}
162175
}

0 commit comments

Comments
 (0)