Skip to content

Commit 1aed5f6

Browse files
authored
Merge pull request #486 from TaskFlow-CLAP/CLAP-379
CLAP-379 비밀번호 정규식 누락된 문자 추가 및 테스트 코드 추가
2 parents c51f7e9 + 79dba17 commit 1aed5f6

File tree

3 files changed

+93
-4
lines changed

3 files changed

+93
-4
lines changed

src/main/java/clap/server/common/annotation/validation/password/ValidPassword.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package clap.server.common.annotation.validation.password;
22

3+
import clap.server.domain.policy.member.PasswordPolicy;
34
import jakarta.validation.Constraint;
45
import jakarta.validation.Payload;
56

@@ -10,7 +11,7 @@
1011

1112
@Target({ ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER })
1213
@Retention(RetentionPolicy.RUNTIME)
13-
@Constraint(validatedBy = PasswordValidator.class)
14+
@Constraint(validatedBy = PasswordPolicy.class)
1415
public @interface ValidPassword {
1516

1617
String message() default "대문자, 소문자, 숫자, 특수문자를 포함하며 8자 이상이어야 합니다.";

src/main/java/clap/server/common/annotation/validation/password/PasswordValidator.java renamed to src/main/java/clap/server/domain/policy/member/PasswordPolicy.java

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,16 @@
1-
package clap.server.common.annotation.validation.password;
1+
package clap.server.domain.policy.member;
22

3+
import clap.server.common.annotation.architecture.Policy;
4+
import clap.server.common.annotation.validation.password.ValidPassword;
35
import jakarta.validation.ConstraintValidator;
46
import jakarta.validation.ConstraintValidatorContext;
57

68
import java.util.regex.Pattern;
79

8-
public class PasswordValidator implements ConstraintValidator<ValidPassword, String> {
10+
@Policy
11+
public class PasswordPolicy implements ConstraintValidator<ValidPassword, String> {
912

10-
private static final String PASSWORD_REGEX = "^(?=.*[A-Z])(?=.*[a-z])(?=.*\\d)(?=.*[!@#$%^&*()_+={}\\[\\]:;\"'<>,.?/\\\\|]).{8,}$";
13+
private static final String PASSWORD_REGEX = "^(?=.*[A-Z])(?=.*[a-z])(?=.*\\d)(?=.*[!@#$%^&*()_+{}\\[\\]:;<>,.?/~`-]).{8,20}$";
1114

1215
@Override
1316
public boolean isValid(String password, ConstraintValidatorContext context) {
Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
package clap.server.domain.policy.member;
2+
3+
import jakarta.validation.ConstraintValidatorContext;
4+
import org.junit.jupiter.api.BeforeEach;
5+
import org.junit.jupiter.api.DisplayName;
6+
import org.junit.jupiter.api.Test;
7+
8+
import static org.assertj.core.api.Assertions.assertThat;
9+
import static org.mockito.Mockito.mock;
10+
11+
class PasswordPolicyTest {
12+
13+
private PasswordPolicy passwordPolicy;
14+
private ConstraintValidatorContext context;
15+
16+
@BeforeEach
17+
void setUp() {
18+
passwordPolicy = new PasswordPolicy();
19+
context = mock(ConstraintValidatorContext.class); // Mock ConstraintValidatorContext
20+
}
21+
22+
@Test
23+
@DisplayName("유효한 비밀번호 - 대문자, 소문자, 숫자, 특수문자 포함")
24+
void validPassword() {
25+
String validPassword = "Abcdef1!";
26+
boolean result = passwordPolicy.isValid(validPassword, context);
27+
assertThat(result).isTrue();
28+
}
29+
30+
@Test
31+
@DisplayName("유효하지 않은 비밀번호 - 대문자 없음")
32+
void invalidPassword_noUpperCase() {
33+
String invalidPassword = "abcdef1!";
34+
boolean result = passwordPolicy.isValid(invalidPassword, context);
35+
assertThat(result).isFalse();
36+
}
37+
38+
@Test
39+
@DisplayName("유효하지 않은 비밀번호 - 소문자 없음")
40+
void invalidPassword_noLowerCase() {
41+
String invalidPassword = "ABCDEF1!";
42+
boolean result = passwordPolicy.isValid(invalidPassword, context);
43+
assertThat(result).isFalse();
44+
}
45+
46+
@Test
47+
@DisplayName("유효하지 않은 비밀번호 - 숫자 없음")
48+
void invalidPassword_noDigit() {
49+
String invalidPassword = "Abcdefgh!";
50+
boolean result = passwordPolicy.isValid(invalidPassword, context);
51+
assertThat(result).isFalse();
52+
}
53+
54+
@Test
55+
@DisplayName("유효하지 않은 비밀번호 - 특수문자 없음")
56+
void invalidPassword_noSpecialCharacter() {
57+
String invalidPassword = "Abcdefg1";
58+
boolean result = passwordPolicy.isValid(invalidPassword, context);
59+
assertThat(result).isFalse();
60+
}
61+
62+
@Test
63+
@DisplayName("유효하지 않은 비밀번호 - 길이가 8자 미만")
64+
void invalidPassword_tooShort() {
65+
String invalidPassword = "Ab1!";
66+
boolean result = passwordPolicy.isValid(invalidPassword, context);
67+
assertThat(result).isFalse();
68+
}
69+
70+
@Test
71+
@DisplayName("유효하지 않은 비밀번호 - 길이가 20자 초과")
72+
void invalidPassword_tooLong() {
73+
String invalidPassword = "Abcdefg1!Abcdefg1!Abcdefg1!";
74+
boolean result = passwordPolicy.isValid(invalidPassword, context);
75+
assertThat(result).isFalse();
76+
}
77+
78+
@Test
79+
@DisplayName("유효하지 않은 비밀번호 - null 값")
80+
void invalidPassword_null() {
81+
String invalidPassword = null;
82+
boolean result = passwordPolicy.isValid(invalidPassword, context);
83+
assertThat(result).isFalse();
84+
}
85+
}

0 commit comments

Comments
 (0)