@bayarkit/testing 0.2.2 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,521 @@
1
+ /**
2
+ * A fake Paddle Billing API (one-time transactions and refund adjustments), built from the official docs in
3
+ * `gateways/paddle/spec.md`, then checked against the sandbox on 30 October 2026 (spec "Measured"). Rules not marked
4
+ * measured are still the docs' word. Change this file first when Paddle changes.
5
+ *
6
+ * What it checks, and where each rule comes from (spec sections in brackets):
7
+ * - auth: `Authorization: Bearer <key>`; missing → 403 `authentication_missing`, not Bearer → 403
8
+ * `authentication_malformed`, another key → 403 `invalid_token` [§1, errors index];
9
+ * - `Paddle-Version` is REQUIRED and must be `1`. Real Paddle falls back to the account default [§1]; the fake is
10
+ * stricter on purpose so a test proves the adapter always pins the version;
11
+ * - JSON in and out, entities under `data`, errors `{ error: { type, code, detail, documentation_url } }` [§1, §7];
12
+ * - create: one or more non-catalog prices, `unit_price.amount` a STRING of an integer in the lowest denomination, a
13
+ * currency from the 33 Paddle takes (no MYR), `description` 2–500, `product.tax_category` from the documented set,
14
+ * `custom_data` an object with at least one key or null [§2.1]; the default payment link must be set and a passed
15
+ * `checkout.url` must be on an approved domain [§2.2]; documented minimum charges [§6];
16
+ * - tax (merchant of record) [§2.3]: a `tax_mode: internal` price is charged as asked. Any other mode gets a 10% tax on
17
+ * top here. The rate is the fake's own choice: real tax depends on the buyer's country, so the point is only that
18
+ * an app cannot know the total in advance unless it sends `internal`;
19
+ * - `price.quantity` = the range the buyer may pick at checkout, default `{ minimum: 1, maximum: 100 }` (measured on the
20
+ * sandbox 30 Oct 2026: the checkout shows a quantity picker and the total follows it); `setQuantity()` plays it;
21
+ * - a new transaction without a customer is `draft`; `markPaid` = `completed` with one captured payment; a declined
22
+ * card adds an `error` payment and leaves the status alone [§3];
23
+ * - refunds: `POST /adjustments` with `action: refund`, only on `completed`, full or per-item partial, never above
24
+ * what remains, not while another refund awaits approval; each starts `pending_approval` and `approveRefunds()`
25
+ * plays the sandbox's approval run. Adjusted totals drop on approval, not on create (measured) [§5];
26
+ * - webhooks: `Paddle-Signature: ts=<unix>;h1=<hex HMAC-SHA256(secret, "<ts>:<raw body>")>`, one `h1` per secret [§4].
27
+ */
28
+ import { createHmac, randomBytes } from 'node:crypto';
29
+ import { createServer } from 'node:http';
30
+ import { flip } from './types.js';
31
+ export const PADDLE_VERSION = '1';
32
+ /** The payment currencies Paddle lists [§6]. */
33
+ const CURRENCIES = new Set('USD GBP EUR ARS AUD BRL CAD CHF CLP CNY COP CZK DKK HKD HUF ILS INR JPY KRW MXN NOK NZD PEN PLN RUB SEK SGD THB TRY TWD UAH VND ZAR'.split(' '));
34
+ /** Minimum charges the docs state, lowest denomination [§6]. Other currencies are not checked here. */
35
+ const MINIMUMS = { USD: 70, EUR: 65, GBP: 55, SGD: 90, JPY: 100 };
36
+ const TAX_CATEGORIES = new Set([
37
+ 'digital-goods',
38
+ 'ebooks',
39
+ 'implementation-services',
40
+ 'professional-services',
41
+ 'saas',
42
+ 'software-programming-services',
43
+ 'standard',
44
+ 'training-services',
45
+ 'website-hosting',
46
+ ]);
47
+ const TAX_MODES = new Set(['account_setting', 'external', 'internal', 'location']);
48
+ const FAKE_TAX_RATE = 0.1;
49
+ const obj = (v) => (v && typeof v === 'object' && !Array.isArray(v) ? v : {});
50
+ /**
51
+ * `ts=<ts>;h1=<hex>` exactly as Paddle builds it: HMAC-SHA256 over `${ts}:${rawBody}`, keyed with the destination's
52
+ * secret. Pass several secrets to get one `h1` each, as during a secret rotation.
53
+ */
54
+ export function paddleSignature(secret, rawBody, ts) {
55
+ const h1 = (Array.isArray(secret) ? secret : [secret]).map((s) => `;h1=${createHmac('sha256', s).update(`${ts}:${rawBody}`, 'utf8').digest('hex')}`);
56
+ return `ts=${ts}${h1.join('')}`;
57
+ }
58
+ const paddleId = (prefix) => {
59
+ const chars = 'abcdefghijklmnopqrstuvwxyz0123456789';
60
+ return `${prefix}_${[...randomBytes(26)].map((b) => chars[b % chars.length]).join('')}`;
61
+ };
62
+ class Refused extends Error {
63
+ status;
64
+ code;
65
+ constructor(status, code, detail) {
66
+ super(detail);
67
+ this.status = status;
68
+ this.code = code;
69
+ }
70
+ }
71
+ const invalid = (detail) => new Refused(400, 'invalid_field', detail);
72
+ export async function startFakePaddle(opts) {
73
+ const defaultLink = opts.defaultPaymentLink ?? 'https://shop.example/pay';
74
+ const approved = new Set(opts.approvedDomains ?? []);
75
+ if (defaultLink)
76
+ approved.add(new URL(defaultLink).host);
77
+ const transactions = new Map();
78
+ const adjustments = new Map();
79
+ const requests = [];
80
+ const iso = () => new Date().toISOString();
81
+ const server = createServer((req, res) => {
82
+ let raw = '';
83
+ req.on('data', (d) => {
84
+ raw += d;
85
+ });
86
+ req.on('end', () => {
87
+ const path = (req.url ?? '').split('?')[0] ?? '';
88
+ const send = (status, o) => {
89
+ res.writeHead(status, { 'content-type': 'application/json' });
90
+ res.end(JSON.stringify(o));
91
+ };
92
+ const fail = (status, code, detail) => send(status, {
93
+ error: {
94
+ type: 'request_error',
95
+ code,
96
+ detail,
97
+ documentation_url: `https://developer.paddle.com/errors/shared/${code}`,
98
+ },
99
+ meta: { request_id: randomBytes(8).toString('hex') },
100
+ });
101
+ let body = null;
102
+ if (raw) {
103
+ try {
104
+ body = JSON.parse(raw);
105
+ }
106
+ catch {
107
+ body = undefined;
108
+ }
109
+ }
110
+ requests.push({ method: req.method ?? '', path, body, headers: req.headers });
111
+ const auth = req.headers.authorization;
112
+ if (!auth)
113
+ return fail(403, 'authentication_missing', 'No Authorization header detected.');
114
+ if (!/^Bearer \S+$/.test(auth))
115
+ return fail(403, 'authentication_malformed', 'Authorization header invalid.');
116
+ if (auth !== `Bearer ${opts.apiKey}`)
117
+ return fail(403, 'invalid_token', 'The API key is not valid.');
118
+ if (req.headers['paddle-version'] !== PADDLE_VERSION) {
119
+ return fail(400, 'bad_request', `fake Paddle: send Paddle-Version: ${PADDLE_VERSION} (pin the API version).`);
120
+ }
121
+ if (req.method === 'POST') {
122
+ if (!String(req.headers['content-type'] ?? '').includes('application/json')) {
123
+ return fail(415, 'unsupported_media_type', 'The request has an invalid Content-Type header.');
124
+ }
125
+ if (body === undefined || typeof body !== 'object' || body === null) {
126
+ return fail(400, 'invalid_json', 'The request is not valid JSON.');
127
+ }
128
+ }
129
+ try {
130
+ if (req.method === 'POST' && path === '/transactions') {
131
+ return send(201, {
132
+ data: create(body),
133
+ meta: { request_id: randomBytes(8).toString('hex') },
134
+ });
135
+ }
136
+ const get = /^\/transactions\/([A-Za-z0-9_]+)$/.exec(path);
137
+ if (req.method === 'GET' && get)
138
+ return send(200, { data: find(get[1] ?? '') });
139
+ if (req.method === 'POST' && path === '/adjustments') {
140
+ return send(201, {
141
+ data: refund(body),
142
+ meta: { request_id: randomBytes(8).toString('hex') },
143
+ });
144
+ }
145
+ return fail(404, 'not_found', `Unrecognized request URL (${req.method}: ${path}).`);
146
+ }
147
+ catch (e) {
148
+ if (e instanceof Refused)
149
+ return fail(e.status, e.code, e.message);
150
+ throw e;
151
+ }
152
+ });
153
+ });
154
+ function find(id) {
155
+ const t = transactions.get(id);
156
+ if (!t)
157
+ throw new Refused(404, 'not_found', `Entity ${id} not found.`);
158
+ return t;
159
+ }
160
+ function create(body) {
161
+ if (!defaultLink) {
162
+ throw new Refused(400, 'transaction_default_checkout_url_not_set', 'Set a default payment link first.');
163
+ }
164
+ const items = body.items;
165
+ if (!Array.isArray(items) || items.length < 1 || items.length > 100)
166
+ throw invalid('items: 1 to 100 entries.');
167
+ // What GET answers: the request's items with Paddle's defaults filled in (the request log stays as sent).
168
+ const stored = structuredClone(items);
169
+ let currency = '';
170
+ const lineItems = [];
171
+ let subtotal = 0;
172
+ let tax = 0;
173
+ for (const [i, item] of items.entries()) {
174
+ const p = obj(obj(item).price);
175
+ if (!Object.keys(p).length)
176
+ throw invalid(`items[${i}].price is required (non-catalog price).`);
177
+ const q = obj(item).quantity;
178
+ if (typeof q !== 'number' || !Number.isInteger(q) || q < 1)
179
+ throw invalid(`items[${i}].quantity must be a positive integer.`);
180
+ const desc = p.description;
181
+ if (typeof desc !== 'string' || desc.length < 2 || desc.length > 500) {
182
+ throw invalid(`items[${i}].price.description: 2 to 500 characters.`);
183
+ }
184
+ if (p.name !== undefined && (typeof p.name !== 'string' || p.name.length < 1 || p.name.length > 150)) {
185
+ throw invalid(`items[${i}].price.name: 1 to 150 characters.`);
186
+ }
187
+ const amount = obj(p.unit_price).amount;
188
+ if (typeof amount !== 'string' || !/^\d+$/.test(amount)) {
189
+ throw invalid(`items[${i}].price.unit_price.amount must be a string of an integer (lowest denomination).`);
190
+ }
191
+ const code = obj(p.unit_price).currency_code;
192
+ if (typeof code !== 'string' || !CURRENCIES.has(code)) {
193
+ throw invalid(`items[${i}].price.unit_price.currency_code is not a supported currency.`);
194
+ }
195
+ if (currency && code !== currency)
196
+ throw invalid('All items must use the same currency.');
197
+ currency = code;
198
+ const mode = p.tax_mode ?? 'account_setting';
199
+ if (typeof mode !== 'string' || !TAX_MODES.has(mode))
200
+ throw invalid(`items[${i}].price.tax_mode is not valid.`);
201
+ const product = obj(p.product);
202
+ if (typeof product.name !== 'string' || product.name.length < 1 || product.name.length > 200) {
203
+ throw invalid(`items[${i}].price.product.name: 1 to 200 characters.`);
204
+ }
205
+ if (typeof product.tax_category !== 'string' || !TAX_CATEGORIES.has(product.tax_category)) {
206
+ throw invalid(`items[${i}].price.product.tax_category is not valid.`);
207
+ }
208
+ const range = p.quantity ?? { minimum: 1, maximum: 100 };
209
+ const qmin = obj(range).minimum;
210
+ const qmax = obj(range).maximum;
211
+ if (!Number.isInteger(qmin) ||
212
+ !Number.isInteger(qmax) ||
213
+ qmin < 1 ||
214
+ qmax < qmin) {
215
+ throw invalid(`items[${i}].price.quantity: minimum and maximum, 1 <= minimum <= maximum.`);
216
+ }
217
+ obj(obj(stored[i]).price).quantity = { minimum: qmin, maximum: qmax };
218
+ const lineSub = Number(amount) * q;
219
+ const lineTax = mode === 'internal' ? 0 : Math.round(lineSub * FAKE_TAX_RATE);
220
+ subtotal += lineSub;
221
+ tax += lineTax;
222
+ const total = String(lineSub + lineTax);
223
+ lineItems.push({
224
+ id: paddleId('txnitm'),
225
+ price_id: paddleId('pri'),
226
+ quantity: q,
227
+ tax_rate: mode === 'internal' ? '0' : String(FAKE_TAX_RATE),
228
+ unit_totals: { subtotal: amount, discount: '0', tax: '0', total: amount },
229
+ totals: { subtotal: String(lineSub), discount: '0', tax: String(lineTax), total },
230
+ product: { id: paddleId('pro'), name: product.name, tax_category: product.tax_category },
231
+ });
232
+ }
233
+ const cd = body.custom_data;
234
+ if (cd !== undefined &&
235
+ cd !== null &&
236
+ (typeof cd !== 'object' || Array.isArray(cd) || !Object.keys(cd).length)) {
237
+ throw invalid('custom_data must be an object with at least one key, or null.');
238
+ }
239
+ const grand = subtotal + tax;
240
+ const min = MINIMUMS[currency];
241
+ if (min !== undefined && grand < min) {
242
+ throw new Refused(400, 'transaction_balance_less_than_charge_limit', `The balance is below ${min} ${currency}.`);
243
+ }
244
+ let base = defaultLink;
245
+ const passed = obj(body.checkout).url;
246
+ if (passed !== undefined && passed !== null) {
247
+ let host = '';
248
+ try {
249
+ host = new URL(String(passed)).host;
250
+ }
251
+ catch {
252
+ throw invalid('checkout.url must be a URL.');
253
+ }
254
+ if (!approved.has(host)) {
255
+ throw new Refused(400, 'transaction_checkout_url_domain_is_not_approved', `${host} is not approved.`);
256
+ }
257
+ base = String(passed);
258
+ }
259
+ const id = paddleId('txn');
260
+ const totals = {
261
+ subtotal: String(subtotal),
262
+ discount: '0',
263
+ tax: String(tax),
264
+ total: String(grand),
265
+ credit: '0',
266
+ balance: String(grand),
267
+ grand_total: String(grand),
268
+ fee: null,
269
+ earnings: null,
270
+ currency_code: currency,
271
+ };
272
+ const now = iso();
273
+ const txn = {
274
+ id,
275
+ status: 'draft',
276
+ customer_id: null,
277
+ address_id: null,
278
+ business_id: null,
279
+ custom_data: cd ?? null,
280
+ origin: 'api',
281
+ collection_mode: body.collection_mode ?? 'automatic',
282
+ subscription_id: null,
283
+ invoice_id: null,
284
+ invoice_number: null,
285
+ billing_details: null,
286
+ billing_period: null,
287
+ currency_code: currency,
288
+ discount_id: null,
289
+ created_at: now,
290
+ updated_at: now,
291
+ billed_at: null,
292
+ items: stored,
293
+ details: {
294
+ tax_rates_used: [],
295
+ totals,
296
+ adjusted_totals: { ...totals },
297
+ payout_totals: null,
298
+ line_items: lineItems,
299
+ },
300
+ payments: [],
301
+ checkout: { url: `${base}${base.includes('?') ? '&' : '?'}_ptxn=${id}` },
302
+ };
303
+ transactions.set(id, txn);
304
+ return txn;
305
+ }
306
+ /** What is still refundable per line item: its total minus every refund that is pending or approved. */
307
+ function remaining(t) {
308
+ const left = new Map(t.details.line_items.map((li) => [li.id, Number(li.totals.total)]));
309
+ for (const a of adjustments.values()) {
310
+ if (a.transaction_id !== t.id || (a.status !== 'pending_approval' && a.status !== 'approved'))
311
+ continue;
312
+ for (const it of a.items)
313
+ left.set(it.item_id, (left.get(it.item_id) ?? 0) - Number(it.amount));
314
+ }
315
+ return left;
316
+ }
317
+ function refund(body) {
318
+ if (body.action !== 'refund')
319
+ throw invalid('action: this fake handles refunds only.');
320
+ if (typeof body.reason !== 'string' || !body.reason.trim())
321
+ throw invalid('reason is required.');
322
+ if (typeof body.transaction_id !== 'string')
323
+ throw invalid('transaction_id is required.');
324
+ const t = find(body.transaction_id);
325
+ const type = body.type ?? 'partial';
326
+ if (type !== 'full' && type !== 'partial')
327
+ throw invalid('type must be full or partial.');
328
+ if (body.tax_mode !== undefined && type === 'full') {
329
+ throw new Refused(400, 'adjustment_tax_mode_not_allowed', 'tax_mode is for partial refunds only.');
330
+ }
331
+ if (t.status !== 'completed') {
332
+ throw new Refused(400, 'adjustment_transaction_invalid_status_for_refund', `Transaction is ${t.status}.`);
333
+ }
334
+ const pending = [...adjustments.values()].some((a) => a.transaction_id === t.id && a.status === 'pending_approval');
335
+ if (pending)
336
+ throw new Refused(400, 'adjustment_pending_refund_request', 'A refund is pending approval.');
337
+ const left = remaining(t);
338
+ let items;
339
+ if (type === 'full') {
340
+ items = [...left]
341
+ .filter(([, n]) => n > 0)
342
+ .map(([item_id, n]) => ({ item_id, type: 'full', amount: String(n) }));
343
+ if (!items.length)
344
+ throw new Refused(400, 'adjustment_total_amount_above_remaining_allowed', 'Nothing left.');
345
+ }
346
+ else {
347
+ if (!Array.isArray(body.items) || !body.items.length)
348
+ throw invalid('items are required for a partial refund.');
349
+ items = [];
350
+ for (const entry of body.items) {
351
+ const it = obj(entry);
352
+ const itemId = String(it.item_id);
353
+ const have = left.get(itemId);
354
+ if (have === undefined) {
355
+ throw new Refused(400, 'adjustment_transaction_item_invalid', `Item ${itemId} is not on the transaction.`);
356
+ }
357
+ if (it.type === 'full') {
358
+ items.push({ item_id: itemId, type: 'full', amount: String(have) });
359
+ continue;
360
+ }
361
+ if (it.type !== 'partial' || typeof it.amount !== 'string' || !/^\d+$/.test(it.amount)) {
362
+ throw invalid('items[].amount must be a string of an integer (lowest denomination).');
363
+ }
364
+ const n = Number(it.amount);
365
+ if (n === 0)
366
+ throw new Refused(400, 'adjustment_amount_cannot_be_zero', 'The amount cannot be zero.');
367
+ if (n > have) {
368
+ throw new Refused(400, 'adjustment_amount_above_remaining_allowed', `Only ${have} remains on the item.`);
369
+ }
370
+ items.push({ item_id: itemId, type: 'partial', amount: it.amount });
371
+ }
372
+ }
373
+ const total = items.reduce((s, it) => s + Number(it.amount), 0);
374
+ const now = iso();
375
+ const adj = {
376
+ id: paddleId('adj'),
377
+ action: 'refund',
378
+ type,
379
+ transaction_id: t.id,
380
+ subscription_id: null,
381
+ customer_id: t.customer_id,
382
+ reason: body.reason,
383
+ credit_applied_to_balance: null,
384
+ currency_code: t.currency_code,
385
+ status: 'pending_approval',
386
+ items,
387
+ totals: {
388
+ subtotal: String(total),
389
+ tax: '0',
390
+ total: String(total),
391
+ fee: '0',
392
+ earnings: '0',
393
+ currency_code: t.currency_code,
394
+ },
395
+ payout_totals: null,
396
+ tax_rates_used: [],
397
+ created_at: now,
398
+ updated_at: now,
399
+ };
400
+ adjustments.set(adj.id, adj);
401
+ return adj;
402
+ }
403
+ await new Promise((r) => server.listen(0, '127.0.0.1', r));
404
+ const url = `http://127.0.0.1:${server.address().port}`;
405
+ const known = (id) => {
406
+ const t = transactions.get(id);
407
+ if (!t)
408
+ throw new Error(`fake Paddle: no transaction ${id}`);
409
+ return t;
410
+ };
411
+ return {
412
+ url,
413
+ requests,
414
+ transaction: (id) => transactions.get(id),
415
+ adjustment: (id) => adjustments.get(id),
416
+ markPaid(id) {
417
+ const t = known(id);
418
+ const now = iso();
419
+ t.status = 'completed';
420
+ t.billed_at ??= now;
421
+ t.updated_at = now;
422
+ t.details.totals.balance = '0';
423
+ t.details.adjusted_totals.balance = '0';
424
+ t.payments.unshift({
425
+ payment_attempt_id: randomBytes(16).toString('hex'),
426
+ stored_payment_method_id: randomBytes(16).toString('hex'),
427
+ amount: t.details.totals.grand_total,
428
+ status: 'captured',
429
+ error_code: null,
430
+ method_details: { type: 'card', card: { type: 'visa', last4: '4242' } },
431
+ created_at: now,
432
+ captured_at: now,
433
+ });
434
+ },
435
+ setQuantity(id, quantity, line = 0) {
436
+ const t = known(id);
437
+ const li = t.details.line_items[line];
438
+ const range = obj(obj(obj(t.items[line]).price).quantity);
439
+ if (!li ||
440
+ !Number.isInteger(quantity) ||
441
+ quantity < Number(range.minimum) ||
442
+ quantity > Number(range.maximum)) {
443
+ throw new Error(`quantity ${quantity} is outside the price's quantity range`);
444
+ }
445
+ const unit = Number(obj(li.unit_totals).total);
446
+ const rate = Number(li.tax_rate);
447
+ const sub = unit * quantity;
448
+ const tax = Math.round(sub * rate);
449
+ li.quantity = quantity;
450
+ li.totals = { subtotal: String(sub), discount: '0', tax: String(tax), total: String(sub + tax) };
451
+ const sum = (k) => String(t.details.line_items.reduce((n, x) => n + Number(x.totals[k]), 0));
452
+ const totals = { subtotal: sum('subtotal'), tax: sum('tax'), total: sum('total') };
453
+ Object.assign(t.details.totals, totals, { grand_total: totals.total, balance: totals.total });
454
+ Object.assign(t.details.adjusted_totals, totals, { grand_total: totals.total, balance: totals.total });
455
+ obj(t.items[line]).quantity = quantity;
456
+ t.updated_at = iso();
457
+ },
458
+ decline(id) {
459
+ const t = known(id);
460
+ t.payments.unshift({
461
+ payment_attempt_id: randomBytes(16).toString('hex'),
462
+ stored_payment_method_id: null,
463
+ amount: t.details.totals.grand_total,
464
+ status: 'error',
465
+ error_code: 'declined',
466
+ method_details: { type: 'card', card: { type: 'visa', last4: '0002' } },
467
+ created_at: iso(),
468
+ captured_at: null,
469
+ });
470
+ },
471
+ approveRefunds() {
472
+ for (const a of adjustments.values()) {
473
+ if (a.status !== 'pending_approval')
474
+ continue;
475
+ a.status = 'approved';
476
+ a.updated_at = iso();
477
+ const t = transactions.get(a.transaction_id);
478
+ if (!t)
479
+ continue;
480
+ const adjusted = t.details.adjusted_totals;
481
+ const refunded = Number(a.totals.total);
482
+ for (const k of ['subtotal', 'total', 'grand_total'])
483
+ adjusted[k] = String(Number(adjusted[k]) - refunded);
484
+ }
485
+ },
486
+ /**
487
+ * A `transaction.completed` notification claiming payment (even before `markPaid`; the fake's record stays
488
+ * unpaid). `override` changes fields of `data` before signing; the key `event_type` changes the event instead.
489
+ */
490
+ callbackFor(id, override = {}) {
491
+ const { event_type, ...fields } = override;
492
+ const t = known(id);
493
+ const event = {
494
+ event_id: paddleId('evt'),
495
+ event_type: event_type ?? 'transaction.completed',
496
+ occurred_at: iso(),
497
+ notification_id: paddleId('ntf'),
498
+ data: { ...t, status: 'completed', ...fields },
499
+ };
500
+ // Indented, so a handler that re-serialises the parsed JSON gets different bytes and the signature fails.
501
+ const rawBody = JSON.stringify(event, null, 2);
502
+ return {
503
+ fields: {},
504
+ rawBody,
505
+ headers: {
506
+ 'content-type': 'application/json',
507
+ 'paddle-signature': paddleSignature(opts.webhookSecret, rawBody, Math.floor(Date.now() / 1000)),
508
+ },
509
+ };
510
+ },
511
+ tamper: (cb) => ({
512
+ ...cb,
513
+ headers: {
514
+ ...cb.headers,
515
+ 'paddle-signature': (cb.headers['paddle-signature'] ?? '').replace(/h1=([0-9a-f]+)/, (_m, hex) => `h1=${flip(hex)}`),
516
+ },
517
+ }),
518
+ close: () => new Promise((r) => server.close(() => r())),
519
+ };
520
+ }
521
+ //# sourceMappingURL=paddle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paddle.js","sourceRoot":"","sources":["../../src/fakes/paddle.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,71 @@
1
+ import { type FakeGateway } from './types.js';
2
+ /** The headers PayPal sends with every webhook; all five go into the postback check [§5]. */
3
+ export declare const PAYPAL_HEADERS: readonly ['paypal-transmission-id', 'paypal-transmission-time', 'paypal-transmission-sig', 'paypal-cert-url', 'paypal-auth-algo'];
4
+ type Body = Record<string, unknown>;
5
+ type Money = {
6
+ currency_code: string;
7
+ value: string;
8
+ };
9
+ type Link = {
10
+ href: string;
11
+ rel: string;
12
+ method: string;
13
+ };
14
+ export interface PayPalCapture extends Body {
15
+ id: string;
16
+ status: 'COMPLETED' | 'PENDING' | 'DECLINED' | 'FAILED' | 'PARTIALLY_REFUNDED' | 'REFUNDED';
17
+ amount: Money;
18
+ custom_id?: string;
19
+ invoice_id?: string;
20
+ }
21
+ export interface PayPalRefund extends Body {
22
+ id: string;
23
+ status: 'COMPLETED' | 'PENDING' | 'FAILED' | 'CANCELLED';
24
+ amount: Money;
25
+ }
26
+ export interface PayPalOrder extends Body {
27
+ id: string;
28
+ intent: 'CAPTURE';
29
+ status: 'CREATED' | 'PAYER_ACTION_REQUIRED' | 'APPROVED' | 'VOIDED' | 'COMPLETED';
30
+ purchase_units: (Body & {
31
+ reference_id: string;
32
+ amount: Money;
33
+ custom_id?: string;
34
+ invoice_id?: string;
35
+ payments?: {
36
+ captures: PayPalCapture[];
37
+ refunds?: PayPalRefund[];
38
+ };
39
+ })[];
40
+ links: Link[];
41
+ }
42
+ export interface FakePayPal extends FakeGateway {
43
+ requests: {
44
+ method: string;
45
+ path: string;
46
+ body: unknown;
47
+ headers: Record<string, string | string[] | undefined>;
48
+ }[];
49
+ /** The fake's own record of an order (what `GET /v2/checkout/orders/{id}` answers). */
50
+ order(id: string): PayPalOrder | undefined;
51
+ capture(id: string): PayPalCapture | undefined;
52
+ refund(id: string): PayPalRefund | undefined;
53
+ /** The buyer approves on PayPal: `APPROVED`, nothing captured yet [§3]. */
54
+ approve(id: string): void;
55
+ /** How the next capture of this order ends: a declined card or a payment held for review [§3]. */
56
+ nextCapture(id: string, status: 'DECLINED' | 'PENDING'): void;
57
+ /** How the next refund of this capture ends (UNCONFIRMED #7) [§6]. */
58
+ nextRefund(captureId: string, status: 'PENDING'): void;
59
+ /** End every access token issued so far, as if `expires_in` ran out. */
60
+ expireTokens(): void;
61
+ }
62
+ export declare function startFakePayPal(opts: {
63
+ clientId: string;
64
+ clientSecret: string;
65
+ /** The id PayPal gives the webhook (listener) of this app; every verification must name it [§5]. */
66
+ webhookId: string;
67
+ /** `expires_in` of a new token; the docs' sample is 31668 seconds [§1]. */
68
+ tokenTtlSeconds?: number;
69
+ }): Promise<FakePayPal>;
70
+ export {};
71
+ //# sourceMappingURL=paypal.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paypal.d.ts","sourceRoot":"","sources":["../../src/fakes/paypal.ts"],"names":[],"mappings":"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"}