package br.com.caelum.stella.validation.ie;
import static org.junit.Assert.*;
import static org.mockito.Mockito.*;
import java.util.List;
import org.junit.Test;
import br.com.caelum.stella.MessageProducer;
import br.com.caelum.stella.ValidationMessage;
import br.com.caelum.stella.validation.InvalidStateException;
import br.com.caelum.stella.validation.RenavamValidator;
import br.com.caelum.stella.validation.Validator;
import br.com.caelum.stella.validation.error.IEError;
public abstract class IEValidatorTest {
protected final MessageProducer messageProducer = mock(MessageProducer.class);
private final String wrongCheckDigitUnformattedIE;
private final String validUnformattedIE;
private final String validFormattedIE;
private final String[] validFormattedValues;
public IEValidatorTest(String wrongCheckDigitUnformattedIE, String validUnformattedIE,
String validFormattedIE, String[] validFormattedValues) {
super();
this.wrongCheckDigitUnformattedIE = wrongCheckDigitUnformattedIE;
this.validUnformattedIE = validUnformattedIE;
this.validFormattedIE = validFormattedIE;
this.validFormattedValues = validFormattedValues;
}
protected abstract Validator<String> getValidator(MessageProducer messageProducer, boolean isFormatted);
@Test
public void shouldHaveDefaultConstructorThatUsesSimpleMessageProducerAndAssumesThatStringIsFormatted() {
try {
getValidator(messageProducer, true).assertValid(validFormattedIE);
} catch (InvalidStateException ie) {
String expected = "IEError : INVALID CHECK DIGITS";
assertEquals(expected, ie.getInvalidMessages().get(0).getMessage());
} catch (RuntimeException e) {
fail();
}
}
@Test
public void shouldNotValidateIEWithInvalidCharacter() {
Validator<String> validator = getValidator(messageProducer, false);
try {
validator.assertValid(validUnformattedIE.replaceFirst(".", "&"));
fail();
} catch (InvalidStateException e) {
assertEquals(1, e.getInvalidMessages().size());
}
verify(messageProducer, times(1)).getMessage(IEError.INVALID_DIGITS);
}
@Test
public void shouldNotValidateIEWithLessDigitsThanAllowed() {
Validator<String> validator = getValidator(messageProducer, false);
try {
validator.assertValid(validUnformattedIE.replaceFirst(".", ""));
fail();
} catch (InvalidStateException e) {
assertEquals(1, e.getInvalidMessages().size());
}
verify(messageProducer, times(1)).getMessage(IEError.INVALID_DIGITS);
}
@Test
// IEMatoGrosso, IERioGrandeDoNorte e IEBahia sobreescrevem
public void shouldNotValidateIEWithMoreDigitsThanAlowed() {
Validator<String> validator = getValidator(messageProducer, false);
String value = validUnformattedIE + "5";
try {
validator.assertValid(value);
fail();
} catch (InvalidStateException e) {
assertEquals(1, e.getInvalidMessages().size());
}
verify(messageProducer, times(1)).getMessage(IEError.INVALID_DIGITS);
}
@Test
public void shouldNotValidateIEsWithCheckDigitWrong() {
Validator<String> validator = getValidator(messageProducer, false);
String value = wrongCheckDigitUnformattedIE;
try {
validator.assertValid(value);
fail();
} catch (InvalidStateException e) {
assertEquals(1, e.getInvalidMessages().size());
}
verify(messageProducer, times(1)).getMessage(IEError.INVALID_CHECK_DIGITS);
}
@Test
public void shouldValidateValidIE() {
Validator<String> validator = getValidator(messageProducer, true);
for (String validValue : validFormattedValues) {
try {
validator.assertValid(validValue);
} catch (InvalidStateException e) {
fail("IE inválida: " + validValue);
}
List<ValidationMessage> errors = validator.invalidMessagesFor(validValue);
assertTrue(errors.isEmpty());
}
verify(messageProducer, never()).getMessage(any(IEError.class));
}
@Test
public void shouldValidateValidFormattedNovaIE() {
Validator<String> validator = getValidator(messageProducer, true);
String[] validValues = { validFormattedIE };
for (String validValue : validValues) {
try {
validator.assertValid(validValue);
} catch (InvalidStateException e) {
fail("IE inválida: " + validValue);
}
List<ValidationMessage> errors = validator.invalidMessagesFor(validValue);
assertTrue(errors.isEmpty());
}
verify(messageProducer, never()).getMessage(any(IEError.class));
}
@Test
public void shouldValidateNullIE() {
Validator<String> validator = getValidator(messageProducer, false);
List<ValidationMessage> errors;
String value = null;
try {
validator.assertValid(value);
} catch (InvalidStateException e) {
fail();
}
errors = validator.invalidMessagesFor(value);
assertTrue(errors.isEmpty());
verify(messageProducer, never()).getMessage(any(IEError.class));
}
@Test
public void shouldNotValidateValidUnformattedIE() {
Validator<String> validator = getValidator(messageProducer, true);
String value = validFormattedIE.replace('-', ':');
if(value.equals(validFormattedIE)) {
value = value.replace('/', ':');
if(value.equals(validFormattedIE)) {
value = value.replace('.', ':');
}
}
try {
validator.assertValid(value);
fail();
} catch (InvalidStateException e) {
assertEquals(1, e.getInvalidMessages().size());
}
verify(messageProducer, times(1)).getMessage(IEError.INVALID_FORMAT);
}
@Test
public void shouldGenerateValidFormattedIE() {
final Validator<String> ieValidator = getValidator(messageProducer, true);
final String generated = ieValidator.generateRandomValid();
ieValidator.assertValid(generated);
}
@Test
public void shouldGenerateValidUnformattedIE() {
final Validator<String> ieValidator = getValidator(messageProducer, false);
final String generated = ieValidator.generateRandomValid();
ieValidator.assertValid(generated);
}
}