Validar CNPJ: dois vetores de peso, duas chances de errar a implementação
Validar um CNPJ exige recalcular os dois dígitos verificadores a partir
dos 12 primeiros dígitos e comparar com os dígitos informados — usando
exatamente os dois vetores de peso fixos já documentados na página do
gerador de CNPJ
([5,4,3,2,9,8,7,6,5,4,3,2] e
[6,5,4,3,2,9,8,7,6,5,4,3,2]). O erro de implementação mais
comum nessa validação específica não está na fórmula em si, mas na
ordem das operações: o segundo dígito verificador precisa ser calculado
sobre os 13 dígitos que já incluem o primeiro dígito
verificador recém-calculado — não sobre os 12 dígitos originais mais um
placeholder. Inverter essa dependência produz um segundo dígito
incorreto mesmo com o vetor de peso certo.
Validar formato não é o mesmo que confirmar existência
Um validador de CNPJ — seja este, seja qualquer outro — confirma exclusivamente a integridade matemática do número: que os dígitos verificadores batem com a fórmula aplicada aos 12 primeiros dígitos. Isso não confirma que existe uma empresa real com aquele CNPJ, nem que ela está ativa perante a Receita Federal. Sistemas que precisam dessa confirmação adicional (por exemplo, antes de aprovar um cadastro de fornecedor) precisam de uma segunda camada de validação — consulta a uma API da Receita Federal ou de um provedor de dados cadastrais — que é estrutural e propositalmente separada da validação de dígito verificador.
Testando o validador com casos de borda, não só com CNPJs válidos
Uma suíte de testes que só verifica CNPJs válidos e reporta "passou" não testa a parte mais importante de um validador: a rejeição correta de entradas inválidas. Casos de borda relevantes incluem um CNPJ com um único dígito trocado (deveria ser rejeitado — testa se a fórmula está implementada corretamente, não só presente), sequências com os 14 dígitos iguais (deveriam ser rejeitadas explicitamente, mesmo passando "por acaso" na fórmula pura), e entradas com comprimento incorreto (13 ou 15 dígitos) — cada um exercitando um caminho de código diferente dentro do validador.