Skip to content

Commit bfe5049

Browse files
authored
Merge pull request #171 from kt-cloud-basic-project/SHOP-132
feat: 찜기λŠ₯(wishlist) testcode 개발
2 parents 9233948 + 7fc8d7a commit bfe5049

2 files changed

Lines changed: 296 additions & 14 deletions

File tree

β€Žsrc/main/java/com/kt/dto/wishlist/WishlistResponse.javaβ€Ž

Lines changed: 8 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -4,21 +4,15 @@
44

55
import com.kt.domain.wishlist.Wishlist;
66

7-
import lombok.AllArgsConstructor;
8-
import lombok.Getter;
9-
import lombok.NoArgsConstructor;
7+
public record WishlistResponse(
8+
Long id,
9+
Long productId,
10+
String productName,
11+
Long price,
12+
LocalDateTime createdAt
13+
) {
1014

11-
@Getter
12-
@NoArgsConstructor
13-
@AllArgsConstructor
14-
public class WishlistResponse {
15-
private Long id;
16-
private Long productId;
17-
private String productName;
18-
private Long price;
19-
private LocalDateTime createdAt;
20-
21-
public static WishlistResponse from(Wishlist wishlist){
15+
public static WishlistResponse from(Wishlist wishlist) {
2216
return new WishlistResponse(
2317
wishlist.getId(),
2418
wishlist.getProduct().getId(),
Lines changed: 288 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,288 @@
1+
package com.kt.service.wishlist;
2+
3+
import static org.assertj.core.api.Assertions.*;
4+
5+
import java.time.LocalDate;
6+
import java.util.List;
7+
8+
import org.junit.jupiter.api.BeforeEach;
9+
import org.junit.jupiter.api.DisplayName;
10+
import org.junit.jupiter.api.Test;
11+
import org.springframework.beans.factory.annotation.Autowired;
12+
import org.springframework.boot.test.context.SpringBootTest;
13+
import org.springframework.context.ApplicationEventPublisher;
14+
import org.springframework.security.crypto.password.PasswordEncoder;
15+
import org.springframework.test.context.ActiveProfiles;
16+
import org.springframework.transaction.annotation.Transactional;
17+
18+
import com.kt.common.exception.CustomException;
19+
import com.kt.common.exception.ErrorCode;
20+
import com.kt.domain.category.Category;
21+
import com.kt.domain.membership.Membership;
22+
import com.kt.domain.product.Product;
23+
import com.kt.domain.user.Gender;
24+
import com.kt.domain.user.User;
25+
import com.kt.dto.wishlist.WishlistResponse;
26+
import com.kt.repository.category.CategoryRepository;
27+
import com.kt.repository.membership.MembershipRepository;
28+
import com.kt.repository.product.ProductRepository;
29+
import com.kt.repository.user.UserRepository;
30+
import com.kt.repository.wishlist.WishlistRepository;
31+
32+
@Transactional
33+
@ActiveProfiles("test")
34+
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
35+
public class WishlistServiceTest {
36+
37+
@Autowired
38+
private WishlistService wishlistService;
39+
40+
@Autowired
41+
private WishlistRepository wishlistRepository;
42+
43+
@Autowired
44+
private UserRepository userRepository;
45+
46+
@Autowired
47+
private ProductRepository productRepository;
48+
49+
@Autowired
50+
private MembershipRepository membershipRepository;
51+
52+
@Autowired
53+
private CategoryRepository categoryRepository;
54+
55+
@Autowired
56+
private PasswordEncoder passwordEncoder;
57+
58+
private User savedUser;
59+
private Product savedProduct;
60+
61+
@BeforeEach
62+
void setUp() {
63+
initWishlistTestData();
64+
}
65+
66+
void initWishlistTestData() {
67+
Membership membership = new Membership("BRONZE");
68+
membershipRepository.save(membership);
69+
70+
savedUser = userRepository.saveAndFlush(User.normalUser(
71+
"wishlist_user",
72+
passwordEncoder.encode("password1234"),
73+
"μ°œμœ μ €",
74+
"wishlist@kttech.com",
75+
"010-1234-5678",
76+
Gender.FEMALE,
77+
LocalDate.of(1999, 1, 10),
78+
membership
79+
));
80+
81+
Category category = categoryRepository.saveAndFlush(new Category("의λ₯˜"));
82+
83+
savedProduct = productRepository.saveAndFlush(
84+
new Product("μ˜€ν”„ν™”μ΄νŠΈ ν‹°μ…”μΈ ", "μ˜€ν”„ν™”μ΄νŠΈ 둜고 ν‹°μ…”μΈ ", 120000L, 100L, category)
85+
);
86+
}
87+
88+
@Test
89+
@DisplayName("찜 μΆ”κ°€ 성곡")
90+
public void 찜_μΆ”κ°€_성곡() {
91+
// when
92+
Long wishlistId = wishlistService.addWishlist(savedUser.getId(), savedProduct.getId());
93+
94+
// then
95+
assertThat(wishlistId).isNotNull();
96+
97+
var wishlists = wishlistRepository.findAll();
98+
assertThat(wishlists).hasSize(1);
99+
100+
var savedWishlist = wishlists.getFirst();
101+
assertThat(savedWishlist.getUser().getId()).isEqualTo(savedUser.getId());
102+
assertThat(savedWishlist.getProduct().getId()).isEqualTo(savedProduct.getId());
103+
}
104+
105+
@Test
106+
@DisplayName("찜 μΆ”κ°€ μ‹€νŒ¨ - μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ” μ‚¬μš©μž")
107+
public void 찜_μΆ”κ°€_μ‹€νŒ¨_μ‘΄μž¬ν•˜μ§€μ•ŠλŠ”μ‚¬μš©μž() {
108+
// given
109+
Long nonExistUserId = 9999L;
110+
111+
// when & then
112+
assertThatThrownBy(() -> wishlistService.addWishlist(nonExistUserId, savedProduct.getId()))
113+
.isInstanceOf(CustomException.class)
114+
.hasMessageContaining(ErrorCode.NOT_FOUND_USER.getMessage());
115+
}
116+
117+
@Test
118+
@DisplayName("찜 μΆ”κ°€ μ‹€νŒ¨ - μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ” μƒν’ˆ")
119+
public void 찜_μΆ”κ°€_μ‹€νŒ¨_μ‘΄μž¬ν•˜μ§€μ•ŠλŠ”μƒν’ˆ() {
120+
// given
121+
Long nonExistProductId = 9999L;
122+
123+
// when & then
124+
assertThatThrownBy(() -> wishlistService.addWishlist(savedUser.getId(), nonExistProductId))
125+
.isInstanceOf(CustomException.class)
126+
.hasMessageContaining(ErrorCode.NOT_FOUND_PRODUCT.getMessage());
127+
}
128+
129+
@Test
130+
@DisplayName("찜 μΆ”κ°€ μ‹€νŒ¨ - 이미 μ°œν•œ μƒν’ˆ")
131+
public void 찜_μΆ”κ°€_μ‹€νŒ¨_μ΄λ―Έμ°œν•œμƒν’ˆ() {
132+
// given
133+
wishlistService.addWishlist(savedUser.getId(), savedProduct.getId());
134+
135+
// when & then
136+
assertThatThrownBy(() -> wishlistService.addWishlist(savedUser.getId(), savedProduct.getId()))
137+
.isInstanceOf(CustomException.class)
138+
.hasMessageContaining(ErrorCode.ALREADY_WISHLISTED.getMessage());
139+
}
140+
141+
@Test
142+
@DisplayName("찜 μ‚­μ œ 성곡")
143+
public void 찜_μ‚­μ œ_성곡() {
144+
// given
145+
wishlistService.addWishlist(savedUser.getId(), savedProduct.getId());
146+
147+
// when
148+
wishlistService.removeWishlist(savedUser.getId(), savedProduct.getId());
149+
150+
// then
151+
boolean exists = wishlistRepository.existsByUserIdAndProductId(savedUser.getId(), savedProduct.getId());
152+
assertThat(exists).isFalse();
153+
}
154+
155+
@Test
156+
@DisplayName("찜 μ‚­μ œ μ‹€νŒ¨ - μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ” 찜")
157+
public void 찜_μ‚­μ œ_μ‹€νŒ¨_μ‘΄μž¬ν•˜μ§€μ•ŠλŠ”μ°œ() {
158+
// when & then
159+
assertThatThrownBy(() -> wishlistService.removeWishlist(savedUser.getId(), savedProduct.getId()))
160+
.isInstanceOf(CustomException.class)
161+
.hasMessageContaining(ErrorCode.NOT_FOUND_WISHLIST.getMessage());
162+
}
163+
164+
@Test
165+
@DisplayName("전체 찜 μ‚­μ œ 성곡")
166+
public void 전체_찜_μ‚­μ œ_성곡() {
167+
// given
168+
Category category2 = categoryRepository.saveAndFlush(new Category("의λ₯˜"));
169+
Product product2 = productRepository.saveAndFlush(
170+
new Product("λ‚˜μ΄ν‚€ μ‹ λ°œ", "μš΄λ™ν™”", 150000L, 30L, category2)
171+
);
172+
173+
wishlistService.addWishlist(savedUser.getId(), savedProduct.getId());
174+
wishlistService.addWishlist(savedUser.getId(), product2.getId());
175+
176+
// when
177+
wishlistService.removeAllWishlist(savedUser.getId());
178+
179+
// then
180+
List<WishlistResponse> userWishlists = wishlistService.getWishlists(savedUser.getId());
181+
assertThat(userWishlists).isEmpty();
182+
}
183+
184+
@Test
185+
@DisplayName("찜 λͺ©λ‘ 쑰회 성곡")
186+
public void 찜_λͺ©λ‘_쑰회_성곡() {
187+
// given
188+
Category category2 = categoryRepository.saveAndFlush(new Category("의λ₯˜"));
189+
Product product2 = productRepository.saveAndFlush(
190+
new Product("μ˜€ν”„ν™”μ΄νŠΈ ν›„λ“œν‹°", "μ˜€ν”„ν™”μ΄νŠΈ ν›„λ“œ μŠ€μ›»μ…”μΈ ", 350000L, 40L, category2)
191+
);
192+
Product product3 = productRepository.saveAndFlush(
193+
new Product("μ˜€ν”„ν™”μ΄νŠΈ μžμΌ“", "μ˜€ν”„ν™”μ΄νŠΈ μ•„μš°ν„° μžμΌ“", 890000L, 15L, category2)
194+
);
195+
196+
197+
wishlistService.addWishlist(savedUser.getId(), savedProduct.getId());
198+
wishlistService.addWishlist(savedUser.getId(), product2.getId());
199+
wishlistService.addWishlist(savedUser.getId(), product3.getId());
200+
201+
// when
202+
List<WishlistResponse> wishlists = wishlistService.getWishlists(savedUser.getId());
203+
204+
// then
205+
assertThat(wishlists).hasSize(3);
206+
207+
var productIds = wishlists.stream()
208+
.map(wishlistResponse -> wishlistResponse.productId())
209+
.toList();
210+
211+
assertThat(productIds).containsExactlyInAnyOrder(
212+
savedProduct.getId(),
213+
product2.getId(),
214+
product3.getId()
215+
);
216+
217+
var productNames = wishlists.stream()
218+
.map(wishlistResponse -> wishlistResponse.productName())
219+
.toList();
220+
221+
assertThat(productNames).containsExactlyInAnyOrder(
222+
"μ˜€ν”„ν™”μ΄νŠΈ ν‹°μ…”μΈ ",
223+
"μ˜€ν”„ν™”μ΄νŠΈ ν›„λ“œν‹°",
224+
"μ˜€ν”„ν™”μ΄νŠΈ μžμΌ“"
225+
);
226+
227+
}
228+
229+
@Test
230+
@DisplayName("찜 λͺ©λ‘ 쑰회 성곡 - 빈 λͺ©λ‘")
231+
public void 찜_λͺ©λ‘_쑰회_성곡_빈λͺ©λ‘() {
232+
// when
233+
List<WishlistResponse> wishlists = wishlistService.getWishlists(savedUser.getId());
234+
235+
// then
236+
assertThat(wishlists).isEmpty();
237+
}
238+
239+
@Test
240+
@DisplayName("λ‹€λ₯Έ μ‚¬μš©μžμ˜ μ°œμ€ μ‘°νšŒλ˜μ§€ μ•ŠμŒ")
241+
public void λ‹€λ₯Έμ‚¬μš©μž_찜_μ‘°νšŒμ•ˆλ¨() {
242+
// given
243+
User anotherUser = userRepository.saveAndFlush(User.normalUser(
244+
"another_user",
245+
passwordEncoder.encode("password1234"),
246+
"λ‹€λ₯Έμœ μ €",
247+
"another@kttech.com",
248+
"010-9999-9999",
249+
Gender.MALE,
250+
LocalDate.of(1995, 5, 15),
251+
savedUser.getMembership()
252+
));
253+
254+
wishlistService.addWishlist(savedUser.getId(), savedProduct.getId());
255+
wishlistService.addWishlist(anotherUser.getId(), savedProduct.getId());
256+
257+
// when
258+
List<WishlistResponse> user1Wishlists = wishlistService.getWishlists(savedUser.getId());
259+
List<WishlistResponse> user2Wishlists = wishlistService.getWishlists(anotherUser.getId());
260+
261+
// then
262+
assertThat(user1Wishlists).hasSize(1);
263+
assertThat(user2Wishlists).hasSize(1);
264+
265+
// 각자 μžμ‹ μ˜ 찜만 쑰회됨
266+
assertThat(user1Wishlists.get(0).productId()).isEqualTo(savedProduct.getId());
267+
assertThat(user2Wishlists.get(0).productId()).isEqualTo(savedProduct.getId());
268+
}
269+
270+
@Test
271+
@DisplayName("μƒν’ˆ μ‚­μ œ ν›„ 찜 λͺ©λ‘μ—μ„œ 쑰회 μ•ˆλ¨")
272+
public void μƒν’ˆμ‚­μ œν›„_찜λͺ©λ‘_μ‘°νšŒμ•ˆλ¨() {
273+
// given
274+
wishlistService.addWishlist(savedUser.getId(), savedProduct.getId());
275+
276+
// μƒν’ˆμ„ λΉ„ν™œμ„±ν™” (μ‹€μ œλ‘œλŠ” μ†Œν”„νŠΈ μ‚­μ œλ  수 있음)
277+
savedProduct.updateInActive();
278+
productRepository.saveAndFlush(savedProduct);
279+
280+
// when
281+
List<WishlistResponse> wishlists = wishlistService.getWishlists(savedUser.getId());
282+
283+
// then
284+
// μƒν’ˆμ΄ λΉ„ν™œμ„±ν™”λ˜μ–΄λ„ 찜 λͺ©λ‘μ—λŠ” μ—¬μ „νžˆ λ‚¨μ•„μžˆμ–΄μ•Ό 함 (λΉ„μ¦ˆλ‹ˆμŠ€ λ‘œμ§μ— 따라)
285+
// λ§Œμ•½ λΉ„ν™œμ„±ν™”λœ μƒν’ˆμ„ 찜 λͺ©λ‘μ—μ„œ μ œμ™Έν•΄μ•Ό ν•œλ‹€λ©΄ μ„œλΉ„μŠ€ 둜직 μˆ˜μ • ν•„μš”
286+
assertThat(wishlists).hasSize(1);
287+
}
288+
}

0 commit comments

Comments
Β (0)