Skip to content

Commit

Permalink
test(voc): request dto 테스트 추가 및 가독성 개선
Browse files Browse the repository at this point in the history
  • Loading branch information
zeus6768 committed Nov 17, 2024
1 parent 978eda2 commit a24ff6c
Show file tree
Hide file tree
Showing 2 changed files with 112 additions and 53 deletions.
2 changes: 1 addition & 1 deletion backend/src/main/java/codezap/voc/dto/VocRequest.java
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ public record VocRequest(

@Nullable
@Schema(description = "사용자 db id(선택)", example = "1")
@Min(1)
@Min(value = 1, message = "1 이상이어야 합니다.")
Long memberId,

@Nullable
Expand Down
163 changes: 111 additions & 52 deletions backend/src/test/java/codezap/voc/dto/VocRequestTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,20 +2,21 @@

import static org.assertj.core.api.Assertions.assertThat;

import java.util.Set;
import java.util.stream.Stream;

import jakarta.validation.ConstraintViolation;
import jakarta.validation.Validation;
import jakarta.validation.Validator;
import jakarta.validation.ValidatorFactory;

import org.apache.commons.lang3.RandomStringUtils;
import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.BeforeAll;
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;
import org.junit.jupiter.params.provider.ValueSource;

Expand All @@ -24,6 +25,11 @@ class VocRequestTest {
private static ValidatorFactory validatorFactory;
private static Validator validator;

private static String message = "lorem ipsum dolor sit amet consectetur adipiscing elit fugiat cupiditat";
private static String email = "codezap2024@gmail.com";
private static Long memberId = 1L;
private static String name = "만두";

private VocRequest sut;

@BeforeAll
Expand All @@ -37,29 +43,89 @@ static void tearDown() {
validatorFactory.close();
}

@Test
@DisplayName("해피 케이스")
void success() {
var content = "lorem ipsum dolor sit amet consectetur adipiscing elit fugiat cupiditat";
var email = "codezap2024@gmail.com";
sut = new VocRequest(content, email);
@ParameterizedTest
@MethodSource
@DisplayName("해피 케이스: memberId와 name은 optional")
void success(String message, String email, Long memberId, String name) {
sut = new VocRequest(message, email, memberId, name);

Set<ConstraintViolation<VocRequest>> constraintViolations = validator.validate(sut);
var constraintViolations = validator.validate(sut);

assertThat(constraintViolations).isEmpty();
}

static Stream<Arguments> success() {
return Stream.of(
Arguments.of(message, email, memberId, name),
Arguments.of(message, email, memberId, null),
Arguments.of(message, email, null, null));
}

@Nested
@DisplayName("문의 내용 검증")
class MessageTest {

@ParameterizedTest
@MethodSource
@DisplayName("문의 내용 길이 임계값 검증: 20글자부터 10,000글자까지 정상 동작")
void message_length_success(String message) {
sut = new VocRequest(message, null);

var constraintViolations = validator.validate(sut);

assertThat(constraintViolations).isEmpty();
}

static Stream<String> message_length_success() {
var messageLength20 = RandomStringUtils.randomAlphanumeric(20);
var messageLength10_000 = RandomStringUtils.randomAlphanumeric(10_000);
return Stream.of(messageLength20, messageLength10_000);
}

@ParameterizedTest
@MethodSource
@DisplayName("문의 내용 길이 임계값 검증: 19자 이하, 10,001글자 이상에서 예외 발생")
void message_length_fail(String message) {
sut = new VocRequest(message, null);

var constraintViolations = validator.validate(sut);

assertThat(constraintViolations).isNotEmpty()
.first()
.extracting(ConstraintViolation::getMessage)
.isEqualTo("문의 내용은 최소 20자, 최대 10,000 자 입력할 수 있습니다.");
}

static Stream<String> message_length_fail() {
var messageLength19 = RandomStringUtils.randomAlphanumeric(19);
var messageLength10_001 = RandomStringUtils.randomAlphanumeric(10_001);
return Stream.of(messageLength19, messageLength10_001);
}

@Test
@DisplayName("문의 내용이 null인 경우 예외 발생")
void message_null_fail() {
sut = new VocRequest(null, null);

var constraintViolations = validator.validate(sut);

assertThat(constraintViolations).isNotEmpty()
.first()
.extracting(ConstraintViolation::getMessage)
.isEqualTo("문의 내용은 비어있을 수 없습니다.");
}
}

@Nested
@DisplayName("이메일 검증")
class EmailFieldTest {
class EmailTest {

@Test
@DisplayName("이메일이 null인 경우에도 정상 동작")
void email_null_success() {
var content = "lorem ipsum dolor sit amet consectetur adipiscing elit fugiat cupiditat";
sut = new VocRequest(content, null);
sut = new VocRequest(message, null);

Set<ConstraintViolation<VocRequest>> constraintViolations = validator.validate(sut);
var constraintViolations = validator.validate(sut);

assertThat(constraintViolations).isEmpty();
}
Expand All @@ -68,70 +134,63 @@ void email_null_success() {
@ValueSource(strings = {"", "codezap", "@gmail.com", ".com"})
@DisplayName("이메일 형식에 맞지 않는 경우 예외 발생")
void email_format_fail(String email) {
var content = "lorem ipsum dolor sit amet consectetur adipiscing elit fugiat cupiditat";
sut = new VocRequest(content, email);
sut = new VocRequest(message, email);

Set<ConstraintViolation<VocRequest>> constraintViolations = validator.validate(sut);
var constraintViolations = validator.validate(sut);

assertThat(constraintViolations).hasSize(1)
assertThat(constraintViolations).isNotEmpty()
.first()
.extracting(ConstraintViolation::getMessage)
.isEqualTo("올바른 형식의 이메일 주소여야 합니다.");
}
}

@Nested
@DisplayName("문의 내용 검증")
class ContentFieldTest {
@DisplayName("memberId 검증")
class MemberIdTest {

@ParameterizedTest
@MethodSource
@DisplayName("문의 내용 길이 임계값 검증 성공: 최소 20자, 최대 10,000자")
void content_length_success(String content) {
sut = new VocRequest(content, null);
@Test
@DisplayName("memberId가 0인 경우 예외 발생")
void memberId_fail() {
memberId = 0L;
sut = new VocRequest(message, email, memberId, name);

Set<ConstraintViolation<VocRequest>> constraintViolations = validator.validate(sut);
var constraintViolations = validator.validate(sut);

assertThat(constraintViolations).isEmpty();
}

static Stream<String> content_length_success() {
var contentLength20 = "z".repeat(20);
var contentLength10_000 = "z".repeat(10_000);
return Stream.of(contentLength20, contentLength10_000);
assertThat(constraintViolations).isNotEmpty()
.first()
.extracting(ConstraintViolation::getMessage)
.isEqualTo("1 이상이어야 합니다.");
}
}

@ParameterizedTest
@MethodSource
@DisplayName("문의 내용 길이 임계값 검증 실패: 문의 내용 20자 미만, 10,000자 초과")
void content_length_fail(String content) {
sut = new VocRequest(content, null);
@Nested
@DisplayName("로그인한 사용자 이름 검증")
class NameTest {

Set<ConstraintViolation<VocRequest>> constraintViolations = validator.validate(sut);
@Test
@DisplayName("사용자 이름이 길이 임계값 검증: 255글자까지 성공")
void name_success() {
name = "z".repeat(255);
sut = new VocRequest(message, email, memberId, name);

assertThat(constraintViolations).hasSize(1)
.first()
.extracting(ConstraintViolation::getMessage)
.isEqualTo("문의 내용은 최소 20자, 최대 10,000 자 입력할 수 있습니다.");
}
var constraintViolations = validator.validate(sut);

static Stream<String> content_length_fail() {
var contentLength19 = "z".repeat(19);
var contentLength10_001 = "z".repeat(10_001);
return Stream.of(contentLength19, contentLength10_001);
assertThat(constraintViolations).isEmpty();
}

@Test
@DisplayName("문의 내용이 null인 경우 예외 발생")
void content_null_fail() {
sut = new VocRequest(null, null);
@DisplayName("사용자 이름이 길이 임계값 검증: 256글자부터 예외 발생")
void name_fail() {
name = "z".repeat(256);
sut = new VocRequest(message, email, memberId, name);

Set<ConstraintViolation<VocRequest>> constraintViolations = validator.validate(sut);
var constraintViolations = validator.validate(sut);

assertThat(constraintViolations).hasSize(1)
assertThat(constraintViolations).isNotEmpty()
.first()
.extracting(ConstraintViolation::getMessage)
.isEqualTo("문의 내용은 비어있을 수 없습니다.");
.isEqualTo("아이디는 255자 이하로 입력해주세요.");
}
}
}

0 comments on commit a24ff6c

Please sign in to comment.