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