Skip to content

Commit fa9ed8e

Browse files
committed
coupon-core: Coupon 모델관련 테스트 진행
발급 수량, 발급 기한 관련 테스트 진행 테스트 시에는 MySQL DB가 아닌 H2 DB를 바라보도록 yml 설정 추가
1 parent 5e97147 commit fa9ed8e

File tree

5 files changed

+210
-0
lines changed

5 files changed

+210
-0
lines changed
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package org.example.couponcore.exception;
2+
3+
import lombok.Getter;
4+
5+
@Getter
6+
public class CouponIssueException extends RuntimeException{
7+
8+
private final ErrorCode errorCode;
9+
private final String message;
10+
11+
public CouponIssueException(ErrorCode errorCode, String message) {
12+
this.errorCode =errorCode;
13+
this.message = message;
14+
}
15+
16+
@Override
17+
public String getMessage() {
18+
return "[%s] %s".formatted(errorCode, message);
19+
}
20+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package org.example.couponcore.exception;
2+
3+
import lombok.RequiredArgsConstructor;
4+
5+
@RequiredArgsConstructor
6+
public enum ErrorCode {
7+
INVALID_COUPON_ISSUE_QUANTITY("쿠폰 발급 수량이 유효하지 않습니다."),
8+
INVALID_COUPON_ISSUE_DATE("쿠폰 발급 기간이 유효하지 않습니다."),
9+
COUPON_NOT_EXIST("존재하지 않는 쿠폰입니다."),
10+
DUPLICATED_COUPON_ISSUE("이미 발급한 쿠폰입니다.");
11+
12+
public final String message;
13+
}

coupon-core/src/main/resources/application-core.yml

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,28 @@ spring:
1818
properties:
1919
hibernate:
2020
format_sql: true
21+
data:
22+
redis:
23+
host: localhost
24+
port: 6380
25+
26+
---
27+
spring:
28+
config:
29+
activate:
30+
on-profile: test
31+
datasource:
32+
url: jdbc:h2:mem:test;MODE=MySQL;DATABASE_TO_LOWER=TRUE;INIT=CREATE SCHEMA IF NOT EXISTS coupon;
33+
driverClassName: org.h2.Driver
34+
username: sa
35+
password:
36+
jpa:
37+
hibernate:
38+
ddl-auto: update
39+
show-sql: true
40+
properties:
41+
hibernate:
42+
format_sql: true
2143
data:
2244
redis:
2345
host: localhost
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package org.example.couponcore;
2+
3+
import org.springframework.boot.test.context.SpringBootTest;
4+
import org.springframework.test.context.ActiveProfiles;
5+
import org.springframework.test.context.TestPropertySource;
6+
import org.springframework.transaction.annotation.Transactional;
7+
8+
@Transactional
9+
@ActiveProfiles("test")
10+
@TestPropertySource(properties = "spring.config.name=application-core")
11+
@SpringBootTest(classes = CouponCoreConfiguration.class)
12+
public class TestConfig {
13+
}
Lines changed: 142 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,142 @@
1+
package org.example.couponcore.model;
2+
3+
import org.example.couponcore.exception.CouponIssueException;
4+
import org.example.couponcore.exception.ErrorCode;
5+
import org.junit.jupiter.api.Assertions;
6+
import org.junit.jupiter.api.DisplayName;
7+
import org.junit.jupiter.api.Test;
8+
9+
import java.time.LocalDateTime;
10+
11+
class CouponTest {
12+
13+
@Test
14+
@DisplayName("발급 수량이 남아있다면 true를 반환")
15+
void availableIssueQuantity_1() {
16+
// Given
17+
Coupon coupon = Coupon.builder()
18+
.totalQuantity(100)
19+
.issuedQuantity(99)
20+
.build();
21+
// When
22+
boolean result = coupon.availableIssueQuantity();
23+
// Then
24+
Assertions.assertTrue(result);
25+
}
26+
27+
@Test
28+
@DisplayName("발급 수량이 소진되었다면 false를 반환")
29+
void availableIssueQuantity_2() {
30+
// Given
31+
Coupon coupon = Coupon.builder()
32+
.totalQuantity(100)
33+
.issuedQuantity(100)
34+
.build();
35+
// When
36+
boolean result = coupon.availableIssueQuantity();
37+
// Then
38+
Assertions.assertFalse(result);
39+
}
40+
41+
@Test
42+
@DisplayName("최대 발급 수량이 설정되지 않았다면 true를 반환")
43+
void availableIssueQuantity_3() {
44+
// Given
45+
Coupon coupon = Coupon.builder()
46+
.totalQuantity(null)
47+
.issuedQuantity(100)
48+
.build();
49+
// When
50+
boolean result = coupon.availableIssueQuantity();
51+
// Then
52+
Assertions.assertTrue(result);
53+
}
54+
55+
@Test
56+
@DisplayName("발급 기간이 시작되었다면 true를 반환")
57+
void availableIssueDate_1() {
58+
// Given
59+
Coupon coupon = Coupon.builder()
60+
.dateIssueStart(LocalDateTime.now().minusDays(1))
61+
.dateIssueEnd(LocalDateTime.now().plusDays(1))
62+
.build();
63+
// When
64+
boolean result = coupon.availableIssueDate();
65+
// Then
66+
Assertions.assertTrue(result);
67+
}
68+
69+
@Test
70+
@DisplayName("발급 기간이 시작되지 않았다면 false를 반환")
71+
void availableIssueDate_2() {
72+
// Given
73+
Coupon coupon = Coupon.builder()
74+
.dateIssueStart(LocalDateTime.now().plusDays(1))
75+
.dateIssueEnd(LocalDateTime.now().plusDays(2))
76+
.build();
77+
// When
78+
boolean result = coupon.availableIssueDate();
79+
// Then
80+
Assertions.assertFalse(result);
81+
}
82+
83+
@Test
84+
@DisplayName("발급 기간이 종료되었다면 false를 반환")
85+
void availableIssueDate_3() {
86+
// Given
87+
Coupon coupon = Coupon.builder()
88+
.dateIssueStart(LocalDateTime.now().minusDays(1))
89+
.dateIssueEnd(LocalDateTime.now().minusDays(2))
90+
.build();
91+
// When
92+
boolean result = coupon.availableIssueDate();
93+
// Then
94+
Assertions.assertFalse(result);
95+
}
96+
97+
@Test
98+
@DisplayName("발급 수량과 발급 기간이 유효하다면 발급에 성공")
99+
void issue_1() {
100+
// Given
101+
Coupon coupon = Coupon.builder()
102+
.totalQuantity(100)
103+
.issuedQuantity(99)
104+
.dateIssueStart(LocalDateTime.now().minusDays(1))
105+
.dateIssueEnd(LocalDateTime.now().plusDays(2))
106+
.build();
107+
// When
108+
coupon.issue();
109+
// Then
110+
Assertions.assertEquals(coupon.getIssuedQuantity(), 100);
111+
}
112+
113+
@Test
114+
@DisplayName("발급 수량을 초과하면 예외반환")
115+
void issue_2() {
116+
// Given
117+
Coupon coupon = Coupon.builder()
118+
.totalQuantity(100)
119+
.issuedQuantity(100)
120+
.dateIssueStart(LocalDateTime.now().minusDays(1))
121+
.dateIssueEnd(LocalDateTime.now().plusDays(2))
122+
.build();
123+
// When & Then
124+
CouponIssueException exception = Assertions.assertThrows(CouponIssueException.class, coupon::issue);
125+
Assertions.assertEquals(exception.getErrorCode(), ErrorCode.INVALID_COUPON_ISSUE_QUANTITY);
126+
}
127+
128+
@Test
129+
@DisplayName("발급 기간이 유효하지 않다면 예외 반환")
130+
void issue_3() {
131+
// Given
132+
Coupon coupon = Coupon.builder()
133+
.totalQuantity(100)
134+
.issuedQuantity(99)
135+
.dateIssueStart(LocalDateTime.now().plusDays(1))
136+
.dateIssueEnd(LocalDateTime.now().plusDays(2))
137+
.build();
138+
// When & Then
139+
CouponIssueException exception = Assertions.assertThrows(CouponIssueException.class, coupon::issue);
140+
Assertions.assertEquals(exception.getErrorCode(), ErrorCode.INVALID_COUPON_ISSUE_DATE);
141+
}
142+
}

0 commit comments

Comments
 (0)