From 2706f1877eaf2ddd289b13a4424f9e2c1c4d831c Mon Sep 17 00:00:00 2001 From: KyungMin Lee Date: Tue, 13 Aug 2024 10:43:33 +0900 Subject: [PATCH] =?UTF-8?q?Feat/#15=20Project=20=EB=8F=84=EB=A9=94?= =?UTF-8?q?=EC=9D=B8=20=EB=AA=A8=EB=8D=B8=20=EA=B5=AC=ED=98=84=20(#29)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat: Project 도메인 엔티티 구현 - Project 도메인 엔티티를 구현했습니다. - Project 생성 시 전달받은 이름이 공백이거나 없을 경우 예외를 반환하는 검증로직을 추가했습니다. - 이에 따른 테스트를 진행했습니다. * chore: 테스트 메서드 명 변경 - 일부 테스트 메서드 명을 변경했습니다. * feat: 검증 로직 추가 - VARCHAR(100) 이상의 값을 저장할 수 없게 검증 로직을 추가했습니다. --- .../logbat/domain/project/domain/Project.java | 51 ++++++++++++++++++ .../repository/ProjectJpaRepository.java | 10 ++++ .../domain/project/domain/ProjectTest.java | 54 +++++++++++++++++++ 3 files changed, 115 insertions(+) create mode 100644 logbat/src/main/java/info/logbat/domain/project/domain/Project.java create mode 100644 logbat/src/main/java/info/logbat/domain/project/repository/ProjectJpaRepository.java create mode 100644 logbat/src/test/java/info/logbat/domain/project/domain/ProjectTest.java diff --git a/logbat/src/main/java/info/logbat/domain/project/domain/Project.java b/logbat/src/main/java/info/logbat/domain/project/domain/Project.java new file mode 100644 index 0000000..00e2ad8 --- /dev/null +++ b/logbat/src/main/java/info/logbat/domain/project/domain/Project.java @@ -0,0 +1,51 @@ +package info.logbat.domain.project.domain; + +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.Table; +import java.nio.charset.StandardCharsets; +import java.time.LocalDateTime; +import lombok.AccessLevel; +import lombok.Getter; +import lombok.NoArgsConstructor; +import org.hibernate.annotations.SoftDelete; +import org.springframework.data.annotation.CreatedDate; +import org.springframework.data.annotation.LastModifiedDate; + +@Entity +@Getter +@SoftDelete +@Table(name = "projects") +@NoArgsConstructor(access = AccessLevel.PROTECTED) +public class Project { + + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + private Long id; + + @Column(name = "name", nullable = false, length = 100) + private String name; + + @CreatedDate + @Column(name = "created_at") + private LocalDateTime createdAt; + + @LastModifiedDate + @Column(name = "updated_at") + private LocalDateTime updatedAt; + + private Project(String name) { + this.name = name; + } + + public static Project from(String name) { + if (name == null || name.isBlank() || name.getBytes(StandardCharsets.UTF_8).length > 100) { + throw new IllegalArgumentException("잘못된 이름 요청입니다."); + } + return new Project(name); + } + +} diff --git a/logbat/src/main/java/info/logbat/domain/project/repository/ProjectJpaRepository.java b/logbat/src/main/java/info/logbat/domain/project/repository/ProjectJpaRepository.java new file mode 100644 index 0000000..92ba6cc --- /dev/null +++ b/logbat/src/main/java/info/logbat/domain/project/repository/ProjectJpaRepository.java @@ -0,0 +1,10 @@ +package info.logbat.domain.project.repository; + +import info.logbat.domain.project.domain.Project; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface ProjectJpaRepository extends JpaRepository { + +} diff --git a/logbat/src/test/java/info/logbat/domain/project/domain/ProjectTest.java b/logbat/src/test/java/info/logbat/domain/project/domain/ProjectTest.java new file mode 100644 index 0000000..bf868e6 --- /dev/null +++ b/logbat/src/test/java/info/logbat/domain/project/domain/ProjectTest.java @@ -0,0 +1,54 @@ +package info.logbat.domain.project.domain; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +import java.util.stream.Stream; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; + +@DisplayName("Project 도메인은") +class ProjectTest { + + @DisplayName("생성시") + @Nested + class whenCreated { + + @DisplayName("이름이 잘못된 경우 예외를 던진다.") + @ParameterizedTest + @MethodSource("exceptionValues") + void throwsExceptionForInvalidName(String name) { + // Act & Assert + assertThatThrownBy(() -> Project.from(name)) + .isInstanceOf(IllegalArgumentException.class) + .hasMessage("잘못된 이름 요청입니다."); + } + + @Test + @DisplayName("정상적으로 생성된다.") + void testFromMethodSuccess() { + // Arrange + String expectedProjectName = "이름"; + // Act + Project actualResult = Project.from(expectedProjectName); + // Assert + assertThat(actualResult) + .hasFieldOrPropertyWithValue("name", expectedProjectName); + } + + + private static Stream exceptionValues() { + return Stream.of( + Arguments.of(""), + Arguments.of((String) null), + Arguments.of(" "), + Arguments.of("한글33자이상이면예외가발생해야할것같은데진짜발생하는지확인하기위한테스트값입니다.") + ); + } + + } +}