diff --git a/src/main/java/org/runimo/runimo/rewards/service/RewardService.java b/src/main/java/org/runimo/runimo/rewards/service/RewardService.java index 1f529f9b..da0b06d3 100644 --- a/src/main/java/org/runimo/runimo/rewards/service/RewardService.java +++ b/src/main/java/org/runimo/runimo/rewards/service/RewardService.java @@ -35,9 +35,7 @@ public RewardResponse claimReward(RewardClaimCommand command) { Egg grantedEgg = rewardEgg(command); Long grantedLoveAmount = loveGrantService.grantLoveToUserWithDistance(runningRecord); runningRecord.reward(command.userId()); - return new RewardResponse(!grantedEgg.isEmpty(), grantedEgg.getItemCode(), - grantedEgg.getEggType().getName(), - grantedLoveAmount); + return RewardResponse.of(grantedEgg, grantedLoveAmount); } private Egg rewardEgg(RewardClaimCommand command) { diff --git a/src/main/java/org/runimo/runimo/rewards/service/dto/RewardResponse.java b/src/main/java/org/runimo/runimo/rewards/service/dto/RewardResponse.java index a007954b..d0d4c281 100644 --- a/src/main/java/org/runimo/runimo/rewards/service/dto/RewardResponse.java +++ b/src/main/java/org/runimo/runimo/rewards/service/dto/RewardResponse.java @@ -1,11 +1,24 @@ package org.runimo.runimo.rewards.service.dto; +import org.runimo.runimo.item.domain.Egg; + public record RewardResponse( Boolean isRewarded, String eggCode, String eggType, + String eggImgUrl, Long lovePointAmount ) { + public static RewardResponse of(Egg egg, Long lovePointAmount) { + return new RewardResponse( + egg != Egg.EMPTY, + egg.getItemCode(), + egg.getEggType().getName(), + egg.getImgUrl(), + lovePointAmount + ); + } + } diff --git a/src/main/java/org/runimo/runimo/rewards/service/lovepoint/LoveGrantService.java b/src/main/java/org/runimo/runimo/rewards/service/lovepoint/LoveGrantService.java index db596ddd..406c4ca9 100644 --- a/src/main/java/org/runimo/runimo/rewards/service/lovepoint/LoveGrantService.java +++ b/src/main/java/org/runimo/runimo/rewards/service/lovepoint/LoveGrantService.java @@ -5,7 +5,6 @@ import lombok.RequiredArgsConstructor; import org.runimo.runimo.common.scale.Distance; import org.runimo.runimo.records.domain.RunningRecord; -import org.runimo.runimo.user.domain.LovePoint; import org.runimo.runimo.user.domain.User; import org.runimo.runimo.user.service.LovePointProcessor; import org.runimo.runimo.user.service.UserFinder; @@ -23,8 +22,8 @@ public Long grantLoveToUserWithDistance(RunningRecord runningRecord) { User user = userFinder.findUserById(runningRecord.getUserId()) .orElseThrow(IllegalStateException::new); Long loveAmount = calculateLoveAmount(runningRecord.getTotalDistance()); - LovePoint lovePoint = lovePointProcessor.acquireLovePoint(user.getId(), loveAmount); - return lovePoint.getAmount(); + lovePointProcessor.acquireLovePoint(user.getId(), loveAmount); + return loveAmount; } private Long calculateLoveAmount(Distance distance) { diff --git a/src/test/java/org/runimo/runimo/rewards/api/RewardAcceptanceTest.java b/src/test/java/org/runimo/runimo/rewards/api/RewardAcceptanceTest.java index ac814fb1..12cba0c1 100644 --- a/src/test/java/org/runimo/runimo/rewards/api/RewardAcceptanceTest.java +++ b/src/test/java/org/runimo/runimo/rewards/api/RewardAcceptanceTest.java @@ -219,7 +219,9 @@ void tearDown() { .log().all() .statusCode(HttpStatus.OK.value()) .body("payload.love_point_amount", notNullValue()) - .body("payload.love_point_amount", greaterThan(0)); + .body("payload.love_point_amount", greaterThan(0)) + .body("payload.love_point_amount", equalTo(5)) + .body("payload.egg_img_url", notNullValue()); } @Test diff --git a/src/test/java/org/runimo/runimo/rewards/service/lovepoint/LoveGrantServiceTest.java b/src/test/java/org/runimo/runimo/rewards/service/lovepoint/LoveGrantServiceTest.java new file mode 100644 index 00000000..fa58c95c --- /dev/null +++ b/src/test/java/org/runimo/runimo/rewards/service/lovepoint/LoveGrantServiceTest.java @@ -0,0 +1,68 @@ +package org.runimo.runimo.rewards.service.lovepoint; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.when; +import static org.mockito.MockitoAnnotations.initMocks; + +import java.time.LocalDateTime; +import java.util.Optional; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.runimo.runimo.common.scale.Distance; +import org.runimo.runimo.records.domain.RunningRecord; +import org.runimo.runimo.user.UserFixtures; +import org.runimo.runimo.user.service.LovePointProcessor; +import org.runimo.runimo.user.service.UserFinder; + +class LoveGrantServiceTest { + + + @InjectMocks + private LoveGrantService loveGrantService; + @Mock + private UserFinder userFinder; + @Mock + private LovePointProcessor lovePointProcessor; + + @BeforeEach + void setup() { + initMocks(this); + } + + @Test + void km_당_1포인트를_지급한다() { + + RunningRecord record = RunningRecord.builder() + .isRewarded(false) + .startedAt(LocalDateTime.of(2020, 1, 1, 12, 0, 0)) + .endAt(LocalDateTime.of(2020, 1, 1, 12, 30, 0)) + .totalDistance(new Distance(7800L)) + .build(); + + when(userFinder.findUserById(any())).thenReturn( + Optional.ofNullable(UserFixtures.getUserWithId(1L))); + Long amount = loveGrantService.grantLoveToUserWithDistance(record); + + assertEquals(7L, amount); + } + + @Test + void 달린거리_1km보다_작으면_지급하지_않는다() { + RunningRecord record = RunningRecord.builder() + .isRewarded(false) + .startedAt(LocalDateTime.of(2020, 1, 1, 12, 0, 0)) + .endAt(LocalDateTime.of(2020, 1, 1, 12, 30, 0)) + .totalDistance(new Distance(900L)) + .build(); + + when(userFinder.findUserById(any())).thenReturn( + Optional.ofNullable(UserFixtures.getUserWithId(1L))); + Long amount = loveGrantService.grantLoveToUserWithDistance(record); + + assertEquals(0L, amount); + } + +} \ No newline at end of file