From df3fc1ffc851e7595cea38a4893bd4ebfcba6b75 Mon Sep 17 00:00:00 2001 From: ekgns33 Date: Thu, 10 Apr 2025 12:10:18 +0900 Subject: [PATCH 1/3] feat : remove `WAITING` status logic from `IncubatingEgg` --- .../runimo/runimo/user/domain/EggStatus.java | 1 - .../runimo/user/domain/IncubatingEgg.java | 17 +++++------------ .../user/service/IncubatingEggProcessor.java | 2 ++ 3 files changed, 7 insertions(+), 13 deletions(-) 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..b6386084 100644 --- a/src/main/java/org/runimo/runimo/user/domain/IncubatingEgg.java +++ b/src/main/java/org/runimo/runimo/user/domain/IncubatingEgg.java @@ -32,12 +32,12 @@ 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); this.userId = userId; this.eggId = eggId; this.currentLovePointAmount = currentLovePointAmount; @@ -45,11 +45,6 @@ public IncubatingEgg(Long userId, Long eggId, Long currentLovePointAmount, this.status = status; } - public void startIncubation() { - validateStateTransition(EggStatus.WAITING, "부화 대기중인 알에만 부화 시작가능"); - this.status = EggStatus.INCUBATING; - } - public void gainLovePoint(final Long amount) { validateStateTransition(EggStatus.INCUBATING, "부화중인 알에만 애정 포인트 추가가능"); validateAmount(amount); @@ -69,11 +64,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 +75,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); } From 53952d313b789ef460b12d89ad8aaedf51f079d8 Mon Sep 17 00:00:00 2001 From: ekgns33 Date: Thu, 10 Apr 2025 12:10:43 +0900 Subject: [PATCH 2/3] :white_check_mark: test : update test --- .../runimo/item/domain/IncubatingEggTest.java | 50 ----------------- .../user/api/IncubatingEggAcceptanceTest.java | 54 +++++++++++++++++++ 2 files changed, 54 insertions(+), 50 deletions(-) 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()); + + + + } } From c9ebc52ff81ac31335d590eab8fa4f900700c20a Mon Sep 17 00:00:00 2001 From: ekgns33 Date: Thu, 10 Apr 2025 12:23:10 +0900 Subject: [PATCH 3/3] :sparkles: feat : add null check for constructor --- .../java/org/runimo/runimo/user/domain/IncubatingEgg.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) 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 b6386084..89b5906c 100644 --- a/src/main/java/org/runimo/runimo/user/domain/IncubatingEgg.java +++ b/src/main/java/org/runimo/runimo/user/domain/IncubatingEgg.java @@ -38,11 +38,17 @@ public class IncubatingEgg extends BaseEntity { public IncubatingEgg(Long userId, Long eggId, Long currentLovePointAmount, Long hatchRequireAmount, EggStatus status) { 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; + if(status != null) { + this.status = status; + } } public void gainLovePoint(final Long amount) {