/testing
// 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 commitsmem.store.used("acme", "otp/sms", at); // 0pricemeter/testing testler, örnekler ve bu dokümantasyon için üç şey verir.
memoryAdapters(opts)
Bölüm başlığı “memoryAdapters(opts)”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ı).
expectPlan(plan, expected)
Bölüm başlığı “expectPlan(plan, expected)”Ç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.
commitContract({ make, prepaid? })
Bölüm başlığı “commitContract({ make, prepaid? })”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.
Bunu kullanmadan nasıl yapardım
Bölüm başlığı “Bunu kullanmadan nasıl yapardım”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.