diff --git a/src/main/java/org/runimo/runimo/user/domain/EggStatus.java b/src/main/java/org/runimo/runimo/user/domain/EggStatus.java index 5efd57ed..b83d3170 100644 --- a/src/main/java/org/runimo/runimo/user/domain/EggStatus.java +++ b/src/main/java/org/runimo/runimo/user/domain/EggStatus.java @@ -1,7 +1,6 @@ package org.runimo.runimo.user.domain; public enum EggStatus { - WAITING, // 부화 대기 INCUBATING, // 부화 중 INCUBATED, // 부화 완료 대기 HATCHED // 부화 완료 diff --git a/src/main/java/org/runimo/runimo/user/domain/IncubatingEgg.java b/src/main/java/org/runimo/runimo/user/domain/IncubatingEgg.java index 3a34591f..89b5906c 100644 --- a/src/main/java/org/runimo/runimo/user/domain/IncubatingEgg.java +++ b/src/main/java/org/runimo/runimo/user/domain/IncubatingEgg.java @@ -32,22 +32,23 @@ public class IncubatingEgg extends BaseEntity { @Column(name = "egg_status", nullable = false) @Enumerated(EnumType.STRING) - private EggStatus status; + private EggStatus status = EggStatus.INCUBATING; @Builder public IncubatingEgg(Long userId, Long eggId, Long currentLovePointAmount, Long hatchRequireAmount, EggStatus status) { - validateCreation(status, currentLovePointAmount, hatchRequireAmount); + validateCreation(currentLovePointAmount, hatchRequireAmount); + Objects.requireNonNull(userId); + Objects.requireNonNull(eggId); + Objects.requireNonNull(currentLovePointAmount); + Objects.requireNonNull(hatchRequireAmount); this.userId = userId; this.eggId = eggId; this.currentLovePointAmount = currentLovePointAmount; this.hatchRequireAmount = hatchRequireAmount; - this.status = status; - } - - public void startIncubation() { - validateStateTransition(EggStatus.WAITING, "부화 대기중인 알에만 부화 시작가능"); - this.status = EggStatus.INCUBATING; + if(status != null) { + this.status = status; + } } public void gainLovePoint(final Long amount) { @@ -69,11 +70,10 @@ public void hatch() { this.status = EggStatus.HATCHED; } - private void validateCreation(final EggStatus status, final Long currentLovePointAmount, + private void validateCreation(final Long currentLovePointAmount, final Long hatchRequireAmount) { - if (status == EggStatus.WAITING && currentLovePointAmount != 0) { - throw new IllegalArgumentException( - "부화 대기중인 알은 애정 포인트가 0이어야 합니다. 현재: " + currentLovePointAmount); + if(currentLovePointAmount < 0) { + throw new IllegalArgumentException("보유한 애정 포인트는 0보다 작을 수 없습니다."); } if (hatchRequireAmount <= 0) { throw new IllegalArgumentException( @@ -81,7 +81,6 @@ private void validateCreation(final EggStatus status, final Long currentLovePoin } } - private void validateStateTransition(final EggStatus expected, final String message) { if (status != expected) { throw new IllegalStateException(message + " 현재 상태: " + status); diff --git a/src/main/java/org/runimo/runimo/user/service/IncubatingEggProcessor.java b/src/main/java/org/runimo/runimo/user/service/IncubatingEggProcessor.java index 6d058cc7..f28ebf77 100644 --- a/src/main/java/org/runimo/runimo/user/service/IncubatingEggProcessor.java +++ b/src/main/java/org/runimo/runimo/user/service/IncubatingEggProcessor.java @@ -2,6 +2,7 @@ import lombok.RequiredArgsConstructor; import org.runimo.runimo.item.domain.Egg; +import org.runimo.runimo.user.domain.EggStatus; import org.runimo.runimo.user.domain.IncubatingEgg; import org.runimo.runimo.user.repository.IncubatingEggRepository; import org.runimo.runimo.user.service.dtos.UseLovePointCommand; @@ -21,6 +22,7 @@ public IncubatingEgg create(Long userId, Egg egg) { .eggId(egg.getId()) .currentLovePointAmount(0L) .hatchRequireAmount(egg.getHatchRequireAmount()) + .status(EggStatus.INCUBATING) .build(); return incubatingEggRepository.save(incubatingEgg); } diff --git a/src/test/java/org/runimo/runimo/item/domain/IncubatingEggTest.java b/src/test/java/org/runimo/runimo/item/domain/IncubatingEggTest.java index 71f1dac7..e7c7b3f2 100644 --- a/src/test/java/org/runimo/runimo/item/domain/IncubatingEggTest.java +++ b/src/test/java/org/runimo/runimo/item/domain/IncubatingEggTest.java @@ -9,41 +9,6 @@ class IncubatingEggTest { - @Test - void startIncubation_성공() { - // given - IncubatingEgg incubatingEgg = IncubatingEgg.builder() - .userId(1L) - .eggId(100L) - .currentLovePointAmount(0L) - .hatchRequireAmount(10L) - .status(EggStatus.WAITING) - .build(); - - assertEquals(EggStatus.WAITING, incubatingEgg.getStatus()); - - // when - incubatingEgg.startIncubation(); - - // then - assertEquals(EggStatus.INCUBATING, incubatingEgg.getStatus()); - } - - @Test - void startIncubation_실패_이미_부화중() { - // given - IncubatingEgg incubatingEgg = IncubatingEgg.builder() - .userId(1L) - .eggId(100L) - .currentLovePointAmount(2L) - .hatchRequireAmount(10L) - .status(EggStatus.INCUBATING) - .build(); - - // when & then - assertThrows(IllegalStateException.class, incubatingEgg::startIncubation); - } - @Test void gainLovePoint_성공() { // given @@ -129,21 +94,6 @@ class IncubatingEggTest { assertThrows(IllegalStateException.class, incubatingEgg::hatch); } - @Test - void hatch_실패_부화_대기중인_알() { - // given - IncubatingEgg incubatingEgg = IncubatingEgg.builder() - .userId(1L) - .eggId(100L) - .currentLovePointAmount(0L) - .hatchRequireAmount(10L) - .status(EggStatus.WAITING) - .build(); - - // when & then - assertThrows(IllegalStateException.class, incubatingEgg::hatch); - } - @Test void gainLovePoint_과다_지급() { // given diff --git a/src/test/java/org/runimo/runimo/user/api/IncubatingEggAcceptanceTest.java b/src/test/java/org/runimo/runimo/user/api/IncubatingEggAcceptanceTest.java index 00fdfcc4..87cfe784 100644 --- a/src/test/java/org/runimo/runimo/user/api/IncubatingEggAcceptanceTest.java +++ b/src/test/java/org/runimo/runimo/user/api/IncubatingEggAcceptanceTest.java @@ -3,6 +3,7 @@ import static io.restassured.RestAssured.given; import static org.hamcrest.Matchers.equalTo; import static org.hamcrest.Matchers.greaterThan; +import static org.hamcrest.Matchers.notNullValue; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; @@ -243,4 +244,57 @@ void tearDown() { .statusCode(200) .body("payload.love_point", equalTo(initialLovePoint)); } + + @Test + @Sql(scripts = "/sql/user_item_test_data.sql", executionPhase = Sql.ExecutionPhase.BEFORE_TEST_METHOD) + void 알_등록_후_조회() throws JsonProcessingException { + String token = "Bearer " + jwtTokenFactory.generateAccessToken("test-user-uuid-1"); + + Integer eggId = + given() + .header("Authorization", token) + .contentType(ContentType.JSON) + + .when() + .get("/api/v1/users/eggs") + + .then() + .log().ifError() + .statusCode(200) + .body("payload.items", notNullValue()) + .extract() + .path("payload.items[0].item_id"); + + + RegisterEggRequest request = new RegisterEggRequest((long)eggId); + + given() + .header("Authorization", token) + .contentType(ContentType.JSON) + .body(objectMapper.writeValueAsString(request)) + + .when() + .post("/api/v1/users/eggs") + + .then() + .statusCode(201) + .log().ifError() + .body("payload.incubating_egg_id", notNullValue()) + .body("payload.current_love_point_amount", equalTo(0)); + + given() + .header("Authorization", token) + .contentType(ContentType.JSON) + + .when() + .get("/api/v1/users/eggs/incubators") + .then() + .log().all() + .statusCode(200) + .body("payload.incubating_eggs", notNullValue()) + .body("payload.incubating_eggs[0].name", notNullValue()); + + + + } }