Node.js · TypeScript · SDK
Gerador de Cartão para Testes em Node.js
SDK oficial fakeforge-br gera números sintéticos de cartão que passam validação Luhn (mod-10). TypeScript types nativos. Snippets pra Jest, Vitest, NestJS, Express, Playwright E2E. Ambiente de desenvolvimento apenas.
Ferramenta para desenvolvedores. Os cartão de crédito gerados são sintéticos e não pertencem a nenhuma pessoa real. Uso restrito a testes de software, seed de banco de dados de desenvolvimento e fixtures de QA. Usar em cadastro real ou apresentar como documento verdadeiro configura falsidade ideológica (art. 299 CP).
TL;DR
npm install fakeforge-br
import { FakeForge } from "fakeforge-br"
const cartoes = await new FakeForge().creditCard(100)SDK oficial (com TypeScript types)
import { FakeForge, CreditCard } from "fakeforge-br"
const ff = new FakeForge()
// Type-safe
const cartoes: CreditCard[] = await ff.creditCard(100)
for (const c of cartoes) {
console.log(c.number, c.brand, c.holder, c.expiry, c.cvv)
}
// Preset fintech: cartão + banco + PIX + score coerentes
const [cliente] = await ff.preset("fintech", 1)
// cliente.credit_card já vem correlacionadoAlgoritmo Luhn local (TypeScript)
// utils/luhn.ts
const BIN_TESTE: Record<string, string> = {
visa: "4",
mastercard: "5",
elo: "6362",
}
function luhnChecksum(numeroSemDv: string): number {
const digitos = numeroSemDv.split("").reverse().map(Number)
let total = 0
for (let i = 0; i < digitos.length; i++) {
if (i % 2 === 0) {
const dobrado = digitos[i] * 2
total += dobrado < 10 ? dobrado : dobrado - 9
} else {
total += digitos[i]
}
}
return (10 - (total % 10)) % 10
}
export function gerarCartaoLuhn(bandeira: "visa" | "mastercard" | "elo" = "visa"): string {
const prefixo = BIN_TESTE[bandeira]
const tamPrefixo = prefixo.length
const aleatorios = Array.from({ length: 15 - tamPrefixo }, () =>
Math.floor(Math.random() * 10)
).join("")
const parcial = prefixo + aleatorios
const dv = luhnChecksum(parcial)
return `${parcial}${dv}`
}Uso em Jest — teste de checkout
// tests/checkout.test.ts
import { FakeForge } from "fakeforge-br"
import { CheckoutService } from "../src/checkout.service"
const ff = new FakeForge()
describe("Checkout — validação Luhn", () => {
let cartoes: Array<{ number: string; brand: string }>
beforeAll(async () => {
cartoes = await ff.creditCard(50)
})
test.each([0, 1, 2, 3, 4])("aceita cartão sintético #%i", async (i) => {
const service = new CheckoutService()
const resultado = await service.validarCartao(cartoes[i].number)
expect(resultado.valido).toBe(true)
})
test("rejeita Luhn inválido", async () => {
const service = new CheckoutService()
expect((await service.validarCartao("1234 5678 9012 3456")).valido).toBe(false)
})
})Playwright E2E — teste de checkout completo
// e2e/checkout.spec.ts
import { test, expect } from "@playwright/test"
import { FakeForge } from "fakeforge-br"
const ff = new FakeForge()
test("checkout completo em ambiente staging", async ({ page }) => {
const [cartao] = await ff.creditCard(1)
await page.goto("https://staging.myapp.com/checkout")
await page.fill("[data-test=card-number]", cartao.number.replace(/\s/g, ""))
await page.fill("[data-test=card-cvv]", cartao.cvv)
await page.fill("[data-test=card-expiry]", cartao.expiry)
await page.fill("[data-test=card-holder]", cartao.holder)
await page.click("[data-test=submit-payment]")
await expect(page.locator("[data-test=payment-status]")).toHaveText("aprovado")
})Números gerados são sintéticos, não pertencem a ninguém, não têm saldo real. Passam validação Luhn no client-side. Gateway real (Stripe, Mercado Pago, PagSeguro) vai rejeitar em transação verdadeira — use os cartões de teste oficiais do gateway pra testar aprovação/recusa de transação (ver guia Stripe).