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 = { IEPernambucoValidatorTest.IEPernambucoValidatorAntigoFormato.class, IEPernambucoValidatorTest.IEPernambucoValidatorNovoFormato.class }) public class IEPernambucoValidatorTest { /* * Este teste é um dos mais complexos. Este IEPernambucoValidator suporta o equivalente ao * IEPernambucoAntigaValidator E IEPernambucoNovaValidator utilizando o LogicOrComposedValidator * internamente. * * O que eu fiz foi criar 2 classes internas que copiam os exemplos do IEPernambucoAntigaValidatorTest * e IEPernambucoNovaValidatorTest e ambos usam o IEPernambucoValidator. * 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 IEPernambucoValidator newValidator(MessageProducer messageProducer, boolean isFormatted) { return new IEPernambucoValidator(messageProducer, isFormatted); } public static class IEPernambucoValidatorAntigoFormato extends IEValidatorTest { /* * IE validas * * 18.1.001.0000004-9 18100100000049 */ public IEPernambucoValidatorAntigoFormato() { super(wrongCheckDigitUnformattedString, validUnformattedString, validFormattedString, validValues); } private static final String wrongCheckDigitUnformattedString = "18100100000048"; private static final String validUnformattedString = "18100100000049"; private static final String validFormattedString = "18.1.001.0000004-9"; // TODO Adicionar mais IE validas private static final String[] validValues = { validFormattedString }; @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 IEPernambucoValidatorNovoFormato extends IEValidatorTest { /* * IE validas * * 0321418-40 032141840 */ public IEPernambucoValidatorNovoFormato() { super(wrongCheckDigitUnformattedString, validUnformattedString, validFormattedString, validValues); } private static final String wrongCheckDigitUnformattedString = "032141849"; private static final String validUnformattedString = "032141840"; private static final String validFormattedString = "0321418-40"; // TODO Adicionar mais IE validas private static final String[] validValues = { validFormattedString }; @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); } } }