package br.com.caelum.stella.validation.ie; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import org.junit.runner.RunWith; import org.junit.runners.Suite; import org.junit.runners.Suite.SuiteClasses; import br.com.caelum.stella.MessageProducer; import br.com.caelum.stella.validation.InvalidStateException; import br.com.caelum.stella.validation.Validator; import br.com.caelum.stella.validation.error.IEError; @RunWith(value = Suite.class) @SuiteClasses(value = { IESaoPauloValidatorTest.IESaoPauloComercioIndustria.class, IESaoPauloValidatorTest.IESaoPauloProdutorRural.class }) public class IESaoPauloValidatorTest { /* * Este teste é um dos mais complexos. Este IESaoPauloValidator suporta o * equivalente ao IESaoPauloProdutorRuralValidator E * IESaoPauloComercioIndustriaValidator utilizando o * LogicOrComposedValidator internamente. * * O que eu fiz foi criar 2 classes internas que copiam os exemplos do * IESaoPauloProdutorRuralValidatorTest e * IESaoPauloComercioIndustriaValidatorTest e ambos usam o * IESaoPauloValidator. Esta abordagem não funcionou para 3 métodos de * teste genérico que foram sbreescritos: * shouldNotValidateIEWithLessDigitsThanAllowed e * shouldNotValidateIEWithMoreDigitsThanAlowed que não fazem sentido pois os * limites de caracter são muito distantes e o terceiro método * shouldNotValidateIEWithInvalidCharacter que ao inves de lançar * IEError.INVALID_DIGITS lança IEError.INVALID_FORMAT por causa da * utilização do LogicOrComposedValidator */ public static IESaoPauloValidator newValidator(MessageProducer messageProducer, boolean isFormatted) { return new IESaoPauloValidator(messageProducer, isFormatted); } public static class IESaoPauloComercioIndustria extends IEValidatorTest { public IESaoPauloComercioIndustria() { super(wrongCheckDigitString, validUnformattedString, validString, validValues); } private static final String wrongCheckDigitString = "110042490104"; private static final String validUnformattedString = "110042490114"; private static final String validString = "110.042.490.114"; // TODO adicionar mais IE validos para São Paulo private static final String[] validValues = { validString }; @Override protected Validator<String> getValidator(MessageProducer messageProducer, boolean isFormatted) { return newValidator(messageProducer, isFormatted); } @Override public void shouldNotValidateIEWithLessDigitsThanAllowed() { } @Override public void shouldNotValidateIEWithMoreDigitsThanAlowed() { } @Override public void shouldNotValidateIEWithInvalidCharacter() { Validator<String> validator = getValidator(messageProducer, false); try { validator.assertValid(validUnformattedString.replaceFirst(".", "&")); fail(); } catch (InvalidStateException e) { assertTrue(e.getInvalidMessages().size() == 1); } verify(messageProducer, times(1)).getMessage(IEError.INVALID_FORMAT); } } public static class IESaoPauloProdutorRural extends IEValidatorTest { public IESaoPauloProdutorRural() { super(wrongCheckDigitString, validUnformattedString, validString, validValues); } private static final String wrongCheckDigitString = "P011004245002"; private static final String validUnformattedString = "P011004243002"; private static final String validString = "P-01100424.3/002"; // TODO adicionar mais IE validos para São Paulo private static final String[] validValues = { validString }; @Override protected Validator<String> getValidator(MessageProducer messageProducer, boolean isFormatted) { return newValidator(messageProducer, isFormatted); } @Override public void shouldNotValidateIEWithLessDigitsThanAllowed() { } @Override public void shouldNotValidateIEWithMoreDigitsThanAlowed() { } @Override public void shouldNotValidateIEWithInvalidCharacter() { Validator<String> validator = getValidator(messageProducer, false); try { validator.assertValid(validUnformattedString.replaceFirst(".", "&")); fail(); } catch (InvalidStateException e) { assertTrue(e.getInvalidMessages().size() == 1); } verify(messageProducer, times(1)).getMessage(IEError.INVALID_FORMAT); } } }