기존의 코드에서 WEAK(약함)의 경우를 추가했다.
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import static org.assertj.core.api.AssertionsForClassTypes.assertThat;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertThrows;
public class PasswordLevelCheckTest {
PasswordLevelCheck checker = new PasswordLevelCheck(); // 테스트 메서드 중복코드 리팩토링
private void assertLevel(String pwd,PasswordLevel str //열거값 사용) { // 메서드를 만들어서 리팩토링
PasswordLevel reuslt = checker.check(pwd);
assertThat(str).isEqualTo(reuslt);
}
//Strong
@Test
@DisplayName("모든조건충족") //이 애노테이션을 써서 메서드를 설명할 수 있다.
void MeetsAllConditions() {
assertLevel("sdfeDEF1dfsdf",PasswordLevel.STRONG);
// assertLevel("sdf",PasswordLevel.STRONG); NORMAL
// assertLevel("sdfeDEFdfsdf",PasswordLevel.STRONG); NORMAL
}
// normal
@Test
void 길이_12문자미만_제외_나머지_충족() {
assertLevel("sfeDEF1f",PasswordLevel.NORMAL);
// assertLevel("sdfeDEF1dfsdf",PasswordLevel.NORMAL); STRONG
}
@Test
void 숫자제외_나머지_충족(){
assertLevel("sdfeDEFdfsdf",PasswordLevel.NORMAL);
// assertLevel("sdfeDEFdf2sdf",PasswordLevel.NORMAL); STRONG
}
@Test
void 대문자제외_나머지_충족() {
assertLevel("sdf32dgef324",PasswordLevel.NORMAL);
}
//Invalid
@Test
void null값(){
assertLevel(null,PasswordLevel.INVAILD);
}
@Test
void 빈문자열() {
assertLevel("",PasswordLevel.INVAILD);
}
/* -------------------------------------------------*/
//weak추가
@Test
void 길이만_충족() {
assertLevel("asdfesdfdsdfdf", PasswordLevel.WEAK);
}
@Test
void 숫자만_충족() {
assertLevel("1112123",PasswordLevel.WEAK);
}
@Test
void 대문자만_충족(){
assertLevel("SDFESDDF",PasswordLevel.WEAK);
}
public class PasswordLevelCheck {
public PasswordLevel check(String pwd) {
if (pwd == null || pwd.isEmpty()) return PasswordLevel.INVAILD;
// weak인 경우 추가
// 코드의 위치를 바꿔서 적용 시킴.
if (pwd.length() >= 12 && !isNumber(pwd) && !isUpper(pwd)) return PasswordLevel.WEAK; // 3가지 조건 중 하나만 적용
if (!(pwd.length() >= 12) && isNumber(pwd) && !isUpper(pwd)) return PasswordLevel.WEAK;
if (!(pwd.length() >= 12) && !isNumber(pwd) && isUpper(pwd)) return PasswordLevel.WEAK;
/*-------------------------------------------------------------------*/
if (pwd.length() <= 12) return PasswordLevel.NORMAL;
if (!isNumber(pwd)) return PasswordLevel.NORMAL;
if (!isUpper(pwd)) return PasswordLevel.NORMAL;
return PasswordLevel.STRONG; //모두 충족
}
private boolean isNumber(String pwd) { //리팩토링
for (char num : pwd.toCharArray()) // 문자 배열로 만들기
if (num >= '0' && num <= '9') return true;
return false;
}
private boolean isUpper(String pwd) {
for (char up : pwd.toCharArray())
if (Character.isUpperCase(up)) return true; // 대문자 확인 방법(wrapper클래스에 있었음)
return false;
}
}
public enum PasswordLevel {
NORMAL, INVAILD, WEAK, STRONG //WEAK추가
}