Gerar CPF em JavaScript: Função com Testes Vitest
O gerador de CPF da página principal cria números válidos em um clique — mas quando os testes precisam rodar sem dependência de browser, gerar CPF em JavaScript direto no código é a melhor opção. A função abaixo aplica o algoritmo de módulo 11 para produzir números de 11 dígitos com dígitos verificadores corretos.
Código
'use strict';
var CPF = function CPF() { };
CPF.generate = function () {
var digits = [];
for (var i = 0; i < 9; i++) {
digits.push(Math.floor(Math.random() * 10));
}
var sum1 = 0;
for (var j = 0; j < 9; j++) {
sum1 += digits[j] * (10 - j);
}
var r1 = sum1 % 11;
var d1 = r1 < 2 ? 0 : 11 - r1;
digits.push(d1);
var sum2 = 0;
for (var k = 0; k < 10; k++) {
sum2 += digits[k] * (11 - k);
}
var r2 = sum2 % 11;
var d2 = r2 < 2 ? 0 : 11 - r2;
digits.push(d2);
return digits.join('');
};
CPF.validate = function (value) {
if (!value) return false;
var cleanCPF = String(value).replace(/[^\d]/g, '');
if (cleanCPF.length !== 11) return false;
for (var i = 0; i < 10; i++) {
if (cleanCPF === Array(12).join(String(i))) return false;
}
var sum1 = 0;
for (var j = 0; j < 9; j++) {
sum1 += parseInt(cleanCPF.charAt(j), 10) * (10 - j);
}
var r1 = sum1 % 11;
var d1 = r1 < 2 ? 0 : 11 - r1;
if (parseInt(cleanCPF.charAt(9), 10) !== d1) return false;
var sum2 = 0;
for (var k = 0; k < 10; k++) {
sum2 += parseInt(cleanCPF.charAt(k), 10) * (11 - k);
}
var r2 = sum2 % 11;
var d2 = r2 < 2 ? 0 : 11 - r2;
return parseInt(cleanCPF.charAt(10), 10) === d2;
};Análise do código
CPF.generate cria um array com 9 dígitos aleatórios via Math.floor(Math.random() * 10). Em seguida, calcula o primeiro dígito verificador multiplicando cada dígito pelo peso decrescente (10 a 2), aplicando % 11 e convertendo: resto menor que 2 vira 0, senão 11 - resto. O segundo verificador repete o processo com 10 dígitos e pesos de 11 a 2.
CPF.validate limpa a entrada com regex, rejeita CPFs com 11 dígitos iguais, recalcula os dois dígitos verificadores e compara com os informados. Está incluída para que os testes possam verificar que o CPF gerado é válido.
O retorno é uma string de 11 dígitos numéricos sem formatação. Para exibir com máscara, aplique a função de máscara de CPF em JavaScript.
Uso
var cpf = CPF.generate();
console.log(cpf); // "52998224725" (exemplo)
console.log(CPF.validate(cpf)); // trueTestes
Testes com Vitest:
import { describe, it, expect } from 'vitest';
describe('CPF.generate', () => {
it('retorna string com 11 dígitos numéricos', () => {
var cpf = CPF.generate();
expect(cpf).toMatch(/^\d{11}$/);
});
it('gera CPF que passa na validação', () => {
var cpf = CPF.generate();
expect(CPF.validate(cpf)).toBe(true);
});
it('gera CPFs diferentes entre si', () => {
var cpfs = new Set();
for (var i = 0; i < 50; i++) {
cpfs.add(CPF.generate());
}
expect(cpfs.size).toBeGreaterThan(1);
});
});Veja também: validar CPF em JavaScript e o gerador de CPF online.