package br.com.caelum.stella.validation; import static org.hamcrest.Matchers.is; import static org.junit.Assert.*; import static org.junit.Assert.assertFalse; import org.junit.Before; import org.junit.Test; /** * @author Leonardo Bessa */ public class CPFValidatorTest { private static final String INVALID_FORMAT = "INVALID FORMAT"; private static final String REPEATED_DIGITS = "REPEATED DIGITS"; private static final String INVALID_CHECK_DIGITS = "INVALID CHECK DIGITS"; private static final String INVALID_DIGITS = "INVALID DIGITS"; private final String validString = "248.438.034-80"; private final String validStringNotFormatted = "24843803480"; private final String firstCheckDigitWrongNotFormatted = "24843803470"; private CPFValidator validator; @Before public void setUp() { validator = new CPFValidator(); } @Test public void shouldHaveDefaultConstructorThatUsesSimpleMessageProducerAndAssumesThatStringIsNotFormatted() { new CPFValidator().assertValid(validStringNotFormatted); try { new CPFValidator().assertValid(firstCheckDigitWrongNotFormatted); fail("Test expected to throw exception"); } catch (InvalidStateException e) { InvalidStateException invalidStateException = (InvalidStateException) e; assertMessage(invalidStateException, INVALID_CHECK_DIGITS); } } private void assertMessage(InvalidStateException invalidStateException, String expected) { assertTrue(invalidStateException.getInvalidMessages().get(0).getMessage().contains(expected)); } @Test public void shouldNotValidateCPFWithInvalidCharacter() { try { validator.assertValid("1111111a111"); fail(); } catch (InvalidStateException e) { assertTrue(e.getInvalidMessages().size() == 1); assertMessage(e, INVALID_DIGITS); } } @Test public void shouldNotValidateCPFWithLessDigitsThanAllowed() { try { validator.assertValid("1234567890"); fail(); } catch (InvalidStateException e) { assertTrue(e.getInvalidMessages().size() == 1); assertMessage(e, INVALID_DIGITS); } } @Test public void shouldNotValidateCPFWithMoreDigitsThanAlowed() { try { String value = "123456789012"; validator.assertValid(value); fail(); } catch (InvalidStateException e) { assertTrue(e.getInvalidMessages().size() == 1); assertMessage(e, INVALID_DIGITS); } } @Test public void shouldNotValidateCPFCheckDigitsWithFirstCheckDigitWrong() { // VALID CPF = 248.438.034-80 try { String value = "24843803470"; validator.assertValid(value); fail(); } catch (InvalidStateException e) { assertTrue(e.getInvalidMessages().size() == 1); assertMessage(e, INVALID_CHECK_DIGITS); } } @Test public void shouldNotValidateCPFCheckDigitsWithSecondCheckDigitWrong() { // VALID CPF = 099.075.865-60 try { String value = "09907586561"; validator.assertValid(value); fail(); } catch (InvalidStateException e) { assertTrue(e.getInvalidMessages().size() == 1); assertMessage(e, INVALID_CHECK_DIGITS); } } @Test public void shouldNeverThrowsNPE() { assertThat(validator.isEligible(null), is(false)); } @Test public void shouldValidateValidCPF() { validator.assertValid("11144477735"); validator.assertValid("88641577947"); validator.assertValid("34608514300"); validator.assertValid("47393545608"); } @Test public void shouldValidateNullCPF() { String value = null; validator.assertValid(value); } @Test public void shouldValidateCPFWithLeadingZeros() { String value = "01169538452"; validator.assertValid(value); } @Test public void shouldNotValidateCPFWithAllRepeatedDigitsWhenNotIgnoringIt() { CPFValidator validator = new CPFValidator(false, false); try { String value = "44444444444"; validator.assertValid(value); fail(); } catch (InvalidStateException e) { assertTrue(e.getInvalidMessages().size() == 1); assertMessage(e, REPEATED_DIGITS); } } @Test public void shouldNotValidateCPFWithAllRepeatedDigitsByDefault() { try { String value = "44444444444"; validator.assertValid(value); fail(); } catch (InvalidStateException e) { assertTrue(e.getInvalidMessages().size() == 1); assertMessage(e, REPEATED_DIGITS); } } @Test public void shouldValidateCPFWithAllRepeatedDigitsWhenIgnoringIt() { CPFValidator validator = new CPFValidator(false,true); String value = "44444444444"; validator.assertValid(value); } @Test public void shouldValidateValidFormattedCPF() { CPFValidator validator = new CPFValidator(true); // VALID CPF = 356.296.825-63 String value = "356.296.825-63"; validator.assertValid(value); } @Test public void shouldNotValidateValidUnformattedCPF() { CPFValidator validator = new CPFValidator(true); // VALID CPF = 332.375.322-40 try { String value = "33237532240"; validator.assertValid(value); fail(); } catch (InvalidStateException e) { assertTrue(e.getInvalidMessages().size() == 1); assertMessage(e, INVALID_FORMAT); } } @Test public void shouldBeEligibleDefaultConstructor() { final CPFValidator cpfValidator = new CPFValidator(); assertTrue(cpfValidator.isEligible(validStringNotFormatted)); assertFalse(cpfValidator.isEligible(validString)); } @Test public void shouldBeEligibleConstructorNotFormatted() { final CPFValidator cpfValidator = new CPFValidator(false); assertTrue(cpfValidator.isEligible(validStringNotFormatted)); assertFalse(cpfValidator.isEligible(validString)); } @Test public void shouldBeEligibleConstructorFormatted() { final CPFValidator cpfValidator = new CPFValidator(true); assertFalse(cpfValidator.isEligible(validStringNotFormatted)); assertTrue(cpfValidator.isEligible(validString)); } @Test public void shouldGenerateValidFormattedCPF() { final CPFValidator cpfValidator = new CPFValidator(true); final String generated = cpfValidator.generateRandomValid(); cpfValidator.assertValid(generated); } @Test public void shouldGenerateValidUnformattedCPF() { final CPFValidator cpfValidator = new CPFValidator(); final String generated = cpfValidator.generateRandomValid(); cpfValidator.assertValid(generated); } }