İçeriğe geç

/testing

docs/src/snippets/modules.test.ts
// import { expectPlan, memoryAdapters } from "pricemeter/testing";
const mem = memoryAdapters({
rates: { "otp/sms": (dims) => (dims.country === "TR" ? flat(20_000) : null) }, // a Rate, or a function of (dims, ctx, at)
prepaid: true,
balances: { acme: 1_000_000 },
periodOf: (at) => monthKey({ at }), // usedSoFar per (account, meter, month)
});
const metering = buildMetering().refs(["otp_send"]).meter("otp/sms", ["country"]).bind(mem);
const { plan } = await metering.plan.observe("otp/sms", { country: "TR" }, 2, { type: "otp_send", id: "m1" }, { accountId: "acme" }, { at });
expectPlan(plan, {
ledger: [{ op: "charge", amount: 40_000 }], // only the fields you give are compared…
usage: [{ meter: "otp/sms", dims: { country: "TR" } }], // …but the row count must match
});
mem.store.available("acme"); // 1_000_000 — plan.* never commits
mem.store.used("acme", "otp/sms", at); // 0

pricemeter/testing testler, örnekler ve bu dokümantasyon için üç şey verir.

Adapter sözleşmesine uyan bellek içi getRate + commit + store: ya hep ya hiç, (refType, refId) üzerinde idempotent, prepaid ve yetersizse InsufficientCredit.

Seçenek Anlamı Varsayılan
rates sayaç → Rate ya da (dims, ctx, at) => Rate | { rate, usedSoFar?, carry? } | null. Listede olmayan sayacın fiyatı yoktur {}
prepaid Bakiye kapısı false (postpaid)
balances Hesap → başlangıç bakiyesi (mikro birim) {}
periodOf at → dönem anahtarı; usedSoFar (hesap, sayaç, dönem) başına sayılır tek ömürlük dönem "*"

getRate, cevapta usedSoFar yoksa onu kendi yazdığı usage satırlarından doldurur (boyutsuz, sayaç başına; A100). store şunları açar: usage, ledger, account(id) ({ balance, reserved }), available(id), used(account, meter, period?), credit(account, amount), setRate(meter, rate?) ve commits (no-op retry’lar dahil commit çağrı sayısı).

Çerçevesiz bir plan doğrulaması: satırlar sırayla ve kısmen karşılaştırılır (yalnızca verdiğin alanlar), ama satır sayısı tutmalıdır. İlk farkta, gerçek satırı da gösteren bir hata fırlatır; vitest, jest, node:test ya da bun test içinde çalışır.

Her commit’in geçmesi gereken sözleşme: satır yazımı, tekrarlanan (refType, refId)’nin no-op olması, negatif charge’ın alacak olması, hold/capture/release muhasebesi, tekrarlanan hold’dan sonra release, ve prepaid’de yetersiz bakiyenin hiçbir şey yazmaması. { ok, checks: [{ name, ok, error? }] } döner. Kullanım: Adapter yazma.

Testlerde gerçek adapter’ını kullanabilirsin: SQLite için new DatabaseSync(":memory:") hızlıdır ve pricemeter/sqlite ile aynı sonucu verir. expectPlan yerine test çerçevenin toMatchObject’i iş görür (satır sayısını ayrıca kontrol et). Bellek adapter’ının asıl değeri, getRate yazmadan bir tarifeyi sayaca bağlamak ve sözleşmenin en kısa, okunabilir referansı olmaktır.