Skip to content

Commit

Permalink
Feat/#15 Project 도메인 모델 구현 (#29)
Browse files Browse the repository at this point in the history
* feat: Project 도메인 엔티티 구현

- Project 도메인 엔티티를 구현했습니다.
  - Project 생성 시 전달받은 이름이 공백이거나 없을 경우 예외를 반환하는 검증로직을 추가했습니다.
  - 이에 따른 테스트를 진행했습니다.

* chore: 테스트 메서드 명 변경

- 일부 테스트 메서드 명을 변경했습니다.

* feat: 검증 로직 추가

- VARCHAR(100) 이상의 값을 저장할 수 없게 검증 로직을 추가했습니다.
  • Loading branch information
tidavid1 authored Aug 13, 2024
1 parent f44c6a3 commit 6d2d95b
Show file tree
Hide file tree
Showing 3 changed files with 115 additions and 0 deletions.
Original file line number Diff line number Diff line change
@@ -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);
}

}
Original file line number Diff line number Diff line change
@@ -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<Project, Long> {

}
Original file line number Diff line number Diff line change
@@ -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<Arguments> exceptionValues() {
return Stream.of(
Arguments.of(""),
Arguments.of((String) null),
Arguments.of(" "),
Arguments.of("한글33자이상이면예외가발생해야할것같은데진짜발생하는지확인하기위한테스트값입니다.")
);
}

}
}

0 comments on commit 6d2d95b

Please sign in to comment.