Skip to content

Commit

Permalink
[#16] feat: username validation guava 전환
Browse files Browse the repository at this point in the history
  • Loading branch information
jinyoungchoi95 committed Aug 27, 2021
1 parent 3b1a5b2 commit ca19bfd
Show file tree
Hide file tree
Showing 2 changed files with 43 additions and 78 deletions.
19 changes: 16 additions & 3 deletions src/main/java/com/study/realworld/user/domain/Username.java
Original file line number Diff line number Diff line change
@@ -1,28 +1,41 @@
package com.study.realworld.user.domain;

import static com.google.common.base.Preconditions.checkArgument;
import static java.util.regex.Pattern.matches;

import java.util.Objects;
import javax.persistence.Column;
import javax.persistence.Embeddable;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.Pattern;
import javax.validation.constraints.Size;
import org.apache.commons.lang3.StringUtils;

@Embeddable
public class Username {

@NotBlank(message = "username must be provided.")
@Size(max = 20, message = "username length must be less than 20 characters.")
@Pattern(regexp = "^[0-9a-zA-Z가-힣]*$", message = "Invalid username name")
@Column(name = "username", length = 20, unique = true, nullable = false)
private String name;

protected Username() {
}

public Username(String name) {
checkUsername(name);

this.name = name;
}

private static void checkUsername(String name) {
checkArgument(StringUtils.isNotBlank(name), "username must be provided.");
checkArgument(name.length() <= 20, "username length must be less then 20 characters.");
checkArgument(checkUsernamePattern(name), "usernmae must be provided by limited pattern.");
}

private static boolean checkUsernamePattern(String name) {
return matches("^[0-9a-zA-Z가-힣]*$", name);
}

@Override
public boolean equals(Object o) {
if (this == o) {
Expand Down
102 changes: 27 additions & 75 deletions src/test/java/com/study/realworld/user/domain/UsernameTest.java
Original file line number Diff line number Diff line change
@@ -1,27 +1,15 @@
package com.study.realworld.user.domain;

import static org.assertj.core.api.Assertions.assertThat;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.assertj.core.api.Assertions.assertThatExceptionOfType;

import java.util.Collection;
import javax.validation.ConstraintViolation;
import javax.validation.Validation;
import javax.validation.Validator;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.ValueSource;

class UsernameTest {

private Validator validator;

@BeforeEach
void beforeEach() {
validator = Validation.buildDefaultValidatorFactory().getValidator();
}

@Test
void usernameTest() {
Username username = new Username();
Expand All @@ -32,106 +20,70 @@ void usernameTest() {
void usernameNullTest() {

// given
Username username = new Username(null);

// when
Collection<ConstraintViolation<Username>> constraintViolations
= validator.validate(username);
String input = null;

// then
assertEquals(1, constraintViolations.size());
assertEquals("username must be provided.",
constraintViolations.iterator().next().getMessage());
// when & then
assertThatExceptionOfType(IllegalArgumentException.class)
.isThrownBy(() -> new Username(input))
.withMessageMatching("username must be provided.");
}

@Test
@ParameterizedTest
@ValueSource(strings = {"", " ", " "})
@DisplayName("유저 네임은 빈칸이 들어오면 invalid되어야 한다.")
void usernameNothingTest() {
void usernameNothingTest(String input) {

// given
Username username = new Username("");

// when
Collection<ConstraintViolation<Username>> constraintViolations
= validator.validate(username);

// then
assertEquals(1, constraintViolations.size());
assertEquals("username must be provided.",
constraintViolations.iterator().next().getMessage());
}

@Test
@DisplayName("유저 네임은 공백이 들어오면 invalid되어야 한다.")
void usernameBlankTest() {

// given
Username username = new Username(" ");

// when
Collection<ConstraintViolation<Username>> constraintViolations
= validator.validate(username);

// then
assertEquals(2, constraintViolations.size());
// when & then
assertThatExceptionOfType(IllegalArgumentException.class)
.isThrownBy(() -> new Username(input))
.withMessageMatching("username must be provided.");
}

@Test
@DisplayName("유저네임이 20글자가 넘어가면 invalid되어야 한다.")
void usernameMaxSizeTest() {

// given
Username username = new Username("123456789012345678901");
String input = "123456789012345678901";

// when
Collection<ConstraintViolation<Username>> constraintViolations
= validator.validate(username);

// then
assertEquals(1, constraintViolations.size());
assertEquals("username length must be less than 20 characters.",
constraintViolations.iterator().next().getMessage());
// when & then
assertThatExceptionOfType(IllegalArgumentException.class)
.isThrownBy(() -> new Username(input))
.withMessageMatching("username length must be less then 20 characters.");
}

@Test
@DisplayName("유저네임은 한글, 숫자, 영어만 들어갈 수 있다.")
void usernameValidTest() {

// given
Username username = new Username("123가믜힣abcABC");
String input = "123가믜힣abcABC";

// when
Collection<ConstraintViolation<Username>> constraintViolations
= validator.validate(username);
Username username = new Username(input);

// then
assertEquals(0, constraintViolations.size());
assertThat(username.toString()).isEqualTo(input);
}

@ParameterizedTest
@ValueSource(strings = {"테스트1#", "@test", "test."})
@DisplayName("유저네임에 한글, 숫자, 영어 말고 다른 값이 들어오면 invalid되어야한다.")
void usernameInvalidTest(String input) {

// given
Username username = new Username(input);

// when
Collection<ConstraintViolation<Username>> constraintViolations
= validator.validate(username);

// then
assertEquals(1, constraintViolations.size());
assertEquals("Invalid username name", constraintViolations.iterator().next().getMessage());
// when & then
assertThatExceptionOfType(IllegalArgumentException.class)
.isThrownBy(() -> new Username(input))
.withMessageMatching("usernmae must be provided by limited pattern.");
}

@Test
@DisplayName("equals hashCode 테스트")
void usernameEqualsHashCodeTest() {

// given
Username username = new Username("[email protected]");
Username copyUsername = new Username("[email protected]");
Username username = new Username("username");
Username copyUsername = new Username("username");

// when & then
assertThat(username)
Expand Down

0 comments on commit ca19bfd

Please sign in to comment.