Skip to content

Commit 80ad86d

Browse files
committed
feature: 쿠폰 조회 로직 및 관련 통합테스트 작성
1 parent 7f29fdc commit 80ad86d

5 files changed

Lines changed: 128 additions & 0 deletions

File tree

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package com.loopers.domain.coupon;
2+
3+
import java.util.Optional;
4+
5+
public interface CouponRepository {
6+
7+
Coupon save(Coupon coupon);
8+
9+
Optional<Coupon> findById(Long id);
10+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package com.loopers.domain.coupon;
2+
3+
import com.loopers.support.error.CoreException;
4+
import com.loopers.support.error.ErrorType;
5+
import lombok.RequiredArgsConstructor;
6+
import org.springframework.stereotype.Component;
7+
8+
@RequiredArgsConstructor
9+
@Component
10+
public class CouponService {
11+
12+
private final CouponRepository couponRepository;
13+
14+
15+
public Coupon getCoupon(Long id) {
16+
return couponRepository.findById(id)
17+
.orElseThrow(() -> new CoreException(ErrorType.NOT_FOUND, "쿠폰을 찾을 수 없습니다."));
18+
}
19+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package com.loopers.infrastructure.coupon;
2+
3+
import com.loopers.domain.coupon.Coupon;
4+
import org.springframework.data.jpa.repository.JpaRepository;
5+
6+
public interface CouponJpaRepository extends JpaRepository<Coupon, Long> {
7+
8+
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package com.loopers.infrastructure.coupon;
2+
3+
import com.loopers.domain.coupon.Coupon;
4+
import com.loopers.domain.coupon.CouponRepository;
5+
import java.util.Optional;
6+
import lombok.RequiredArgsConstructor;
7+
import org.springframework.stereotype.Component;
8+
9+
@RequiredArgsConstructor
10+
@Component
11+
public class CouponRepositoryImpl implements CouponRepository {
12+
13+
private final CouponJpaRepository couponJpaRepository;
14+
15+
@Override
16+
public Coupon save(Coupon coupon) {
17+
return couponJpaRepository.save(coupon);
18+
}
19+
20+
@Override
21+
public Optional<Coupon> findById(Long id) {
22+
return couponJpaRepository.findById(id);
23+
}
24+
}
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
package com.loopers.domain.coupon;
2+
3+
import static org.assertj.core.api.Assertions.assertThat;
4+
import static org.junit.jupiter.api.Assertions.*;
5+
6+
import com.loopers.domain.user.User;
7+
import com.loopers.domain.user.User.Gender;
8+
import com.loopers.domain.user.UserRepository;
9+
import com.loopers.utils.DatabaseCleanUp;
10+
import org.junit.jupiter.api.AfterEach;
11+
import org.junit.jupiter.api.DisplayName;
12+
import org.junit.jupiter.api.Nested;
13+
import org.junit.jupiter.api.Test;
14+
import org.springframework.beans.factory.annotation.Autowired;
15+
import org.springframework.boot.test.context.SpringBootTest;
16+
import org.springframework.test.context.bean.override.mockito.MockitoSpyBean;
17+
import org.springframework.transaction.annotation.Transactional;
18+
19+
@SpringBootTest
20+
@Transactional
21+
class CouponServiceIntegrationTest {
22+
23+
@Autowired
24+
CouponService couponService;
25+
26+
@MockitoSpyBean
27+
CouponRepository couponRepository;
28+
29+
@MockitoSpyBean
30+
UserRepository userRepository;
31+
32+
@Autowired
33+
private DatabaseCleanUp databaseCleanUp;
34+
35+
@AfterEach
36+
void tearDown() {
37+
databaseCleanUp.truncateAllTables();
38+
}
39+
40+
@DisplayName("쿠폰 조회 시,")
41+
@Nested
42+
class GetCoupon {
43+
44+
@DisplayName("존재하는 쿠폰이면 조회된다.")
45+
@Test
46+
void getCoupon_success_whenExists() {
47+
// arrange
48+
User user = userRepository.save(new User("user1", "a@email.com", "2025-11-11", Gender.FEMALE));
49+
Coupon coupon = couponRepository.save(
50+
new Coupon(user.getId(), CouponType.FIXED_AMOUNT, 10)
51+
);
52+
53+
// act
54+
Coupon found = couponService.getCoupon(coupon.getId());
55+
56+
// assert
57+
assertThat(found).isNotNull();
58+
assertThat(found.getId()).isEqualTo(coupon.getId());
59+
}
60+
61+
@DisplayName("존재하지 않는 쿠폰이면 예외가 발생한다.")
62+
@Test
63+
void getCoupon_fail_whenNotFound() {
64+
assertThrows(RuntimeException.class, () -> couponService.getCoupon(999L));
65+
}
66+
}
67+
}

0 commit comments

Comments
 (0)