Użytkownik podaje przy rejestracji lub zmianie hasło jakie by chciał mieć.
Hasło przechodzi przez różne etapy sprawdzające czy wolno mu takie hasło mieć.
Jeżeli nie przejdzie któregoś z etapów, to do listy dodawany jest błąd(z najprostszego możliwego enuma).
Każdy etap to klasa dziedzicząca po interfejsie z jedną metodą, i do każdego jest osobna klasa testów.
Dodawanie etapów:
public class PassphraseValidator{
private List<ValidatePasswordStage> stageErrors=new ArrayList<>();
private void stages(){
stageErrors.add(new CheckLengthStage());
stageErrors.add(new CheckRepetitionsStage());
// **stageErrors.add(new CheckContainLoginStage());**
}
public Set<PassValidationErrors> validate(String pass, String nik, String prevPass) {
stages();
Set<PassValidationErrors> result = new HashSet<>();
for (ValidatePasswordStage stage : stageErrors) {
stage.check(pass, nik, prevPass, result);
}
return result;
}
}
Jeżeli sprawdzanie czy hasło zawiera login jest zakomentowane to 2 z 3 testów przechodzi(długość, powtórzenia), natomiast kiedy jest odkomentowane, to przechodzi tylko 1 z 3 testów(właśnie to sprawdzanie czy hasło zawiera login).
Wygląda to tak jakby ten test wpływał na inne, ale przecież nie może.
Co skopałem i jak to poprawić?
Sprawdzenie czy hasło zawiera login:
public class CheckContainLoginStage implements ValidatePasswordStage{
@Override
public void check(String pass, String login, String prevPass, Set<PassValidationErrors> results) {
String nick;
nick = login.substring(0, login.indexOf("@"));
if(pass.indexOf(nick)!=-1){
results.add(PassValidationErrors.pass_contains_nick);
}
}
}
Test do tego sprawdzenia:
public class CheckContainLoginStageNGTest {
@Test
public void isLoginInPassword(){
String login="[email protected]",
pass="smerfik",
pass2="avogadro123456";
PassphraseValidator passphrase=new PassphraseValidator();
Set<PassValidationErrors> result;
result=passphrase.validate(pass, login, "");
Assert.assertFalse(result.contains(PassValidationErrors.pass_contains_nick));
result=passphrase.validate(pass2, login, "");
Assert.assertTrue(result.contains(PassValidationErrors.pass_contains_nick));
}
}
Kod testujący długość:
public void check(String pass, String login, String prevPass, Set<PassValidationErrors> results) {
if(pass.length()<MIN_LENGTH || pass.length()>MAX_LENGTH){
results.add(PassValidationErrors.wrong_length);
}
}
Test do niego:
public void isLengthOk(){
String toshort="ala11",
correct="tojestdobrehasło",
tolong="baaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
+ "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
PassphraseValidator passphrase=new PassphraseValidator();
Set<PassValidationErrors> result;
result=passphrase.validate(toshort, "", "");
Assert.assertTrue(result.contains(PassValidationErrors.wrong_length));
result=passphrase.validate(correct, "", "");
Assert.assertFalse(result.contains(PassValidationErrors.wrong_length));
result=passphrase.validate(tolong, "", "");
Assert.assertTrue(result.contains(PassValidationErrors.wrong_length));
}
Ja to chyba jestem "szczególnie uzdolniony", bo testy które są po to żeby ułatwiać życie są dla mnie kolejnym miejscem na popełnienie błędu.