package br.com.caelum.stella.validation;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import org.junit.Test;
/**
* @author Leonardo Bessa
* @author Fabio Kung
*/
public class CNPJValidatorTest {
private static final String INVALID_FORMAT = "INVALID FORMAT";
private static final String INVALID_CHECK_DIGITS = "INVALID CHECK DIGITS";
private static final String INVALID_DIGITS = "INVALID DIGITS";
private final String validString = "26.637.142/0001-58";
private final String validStringNotFormatted = "26637142000158";
private final String firstCheckDigitWrongNotFormatted = "26637142000168";
@Test
public void shouldHaveDefaultConstructorThatUsesSimpleMessageProducerAndAssumesThatStringIsNotFormatted() {
new CNPJValidator().assertValid(validStringNotFormatted);
try {
new CNPJValidator().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 shouldNotValidateCNPJWithLessDigitsThanAllowed() {
CNPJValidator validator = new CNPJValidator();
try {
String value = "1234567890123";
validator.assertValid(value);
fail();
} catch (InvalidStateException e) {
assertTrue(e.getInvalidMessages().size() == 1);
assertMessage(e, INVALID_DIGITS);
}
}
@Test
public void shouldNotValidateCNPJWithMoreDigitsThanAllowed() {
CNPJValidator validator = new CNPJValidator();
try {
String value = "123456789012345";
validator.assertValid(value);
fail();
} catch (InvalidStateException e) {
assertTrue(e.getInvalidMessages().size() == 1);
assertMessage(e, INVALID_DIGITS);
}
}
@Test
public void shouldNotValidateCNPJWithInvalidCharacter() {
CNPJValidator validator = new CNPJValidator(false);
try {
String value = "1111111a111111";
validator.assertValid(value);
fail();
} catch (InvalidStateException e) {
assertTrue(e.getInvalidMessages().size() == 1);
assertMessage(e, INVALID_DIGITS);
}
}
@Test
public void shouldValidateValidCNPJ() {
CNPJValidator validator = new CNPJValidator();
validator.assertValid("11222333000181");
validator.assertValid("63025530002409");
validator.assertValid("61519128000150");
validator.assertValid("68745386000102");
}
@Test
public void shoulValidateNullCNPJ() {
CNPJValidator validator = new CNPJValidator();
String value = null;
validator.assertValid(value);
}
@Test
public void shouldNotValidateCNPJCheckDigitsWithFirstCheckDigitWrong() {
CNPJValidator validator = new CNPJValidator();
// VALID CNPJ = 742213250001-30
try {
String value = "74221325000160";
validator.assertValid(value);
fail();
} catch (InvalidStateException e) {
assertTrue(e.getInvalidMessages().size() == 1);
assertMessage(e, INVALID_CHECK_DIGITS);
}
}
@Test
public void shouldNotValidateCNPJCheckDigitsWithSecondCheckDigitWrong() {
CNPJValidator validator = new CNPJValidator();
// VALID CNPJ = 266371420001-58
try {
String value = "26637142000154";
validator.assertValid(value);
fail();
} catch (InvalidStateException e) {
assertTrue(e.getInvalidMessages().size() == 1);
assertMessage(e, INVALID_CHECK_DIGITS);
}
}
@Test
public void shouldValidateValidFormattedCNPJ() {
CNPJValidator validator = new CNPJValidator(true);
String value = validString;
validator.assertValid(value);
}
@Test
public void shouldNotValidateValidUnformattedCNPJWhenExplicity() {
CNPJValidator validator = new CNPJValidator(true);
// VALID CNPJ = 26.637.142/0001-58
try {
String value = "26637142000158";
validator.assertValid(value);
fail();
} catch (InvalidStateException e) {
assertTrue(e.getInvalidMessages().size() == 1);
assertMessage(e, INVALID_FORMAT);
}
}
@Test
public void shouldNotBeEligibleWithNullCNPJ() {
final CNPJValidator cnpjValidator = new CNPJValidator();
assertFalse(cnpjValidator.isEligible(null));
}
@Test
public void shouldBeEligibleDefaultConstructor() {
final CNPJValidator cnpjValidator = new CNPJValidator();
assertTrue(cnpjValidator.isEligible(validStringNotFormatted));
assertFalse(cnpjValidator.isEligible(validString));
}
@Test
public void shouldBeEligibleConstructorNotFormatted() {
final CNPJValidator cnpjValidator = new CNPJValidator(false);
assertTrue(cnpjValidator.isEligible(validStringNotFormatted));
assertFalse(cnpjValidator.isEligible(validString));
}
@Test
public void shouldBeEligibleConstructorFormatted() {
final CNPJValidator cnpjValidator = new CNPJValidator(true);
assertFalse(cnpjValidator.isEligible(validStringNotFormatted));
assertTrue(cnpjValidator.isEligible(validString));
}
@Test
public void shouldGenerateValidFormattedCNPJ() {
final CNPJValidator cnpjValidator = new CNPJValidator(true);
final String generated = cnpjValidator.generateRandomValid();
cnpjValidator.assertValid(generated);
}
@Test
public void shouldGenerateValidUnformattedCPF() {
final CNPJValidator cnpjValidator = new CNPJValidator();
final String generated = cnpjValidator.generateRandomValid();
cnpjValidator.assertValid(generated);
}
}