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 correlacionado

Algoritmo 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).

Próximos passos