@codespar/sdk 0.16.16 → 0.16.18

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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=shop-purchases.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shop-purchases.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/shop-purchases.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,76 @@
1
+ /**
2
+ * Shop v0.2 delegated purchases facade (`session.purchases`, `session.instruments`):
3
+ * the wire it sends to `/v1/shop/agent/*`, what it returns, and that a refusal
4
+ * (a key without the delegated scope answers 403 `forbidden`) surfaces as an
5
+ * error, never as an empty success.
6
+ */
7
+ import { afterEach, describe, expect, it, vi } from "vitest";
8
+ import { CodesparApiError } from "../errors.js";
9
+ import { createSession } from "../session.js";
10
+ const originalFetch = globalThis.fetch;
11
+ afterEach(() => {
12
+ globalThis.fetch = originalFetch;
13
+ });
14
+ const PURCHASE = {
15
+ id: "prp_AbCdEfGhIjKlMnOp",
16
+ kind: "purchase",
17
+ state: "drafted",
18
+ run_state: "ready",
19
+ awaiting: null,
20
+ merchant: { id: "test-merchant", name: "Loja de teste CodeSpar" },
21
+ items: [{ sku_id: "cafe-especial-250g", name: "Café", quantity: 1, unit_price_minor: 4590 }],
22
+ total_minor: 4590,
23
+ currency: "BRL",
24
+ payment_method: "card",
25
+ order: null,
26
+ receipt: null,
27
+ failure: null,
28
+ next_action: "a person presses Pagar on the dashboard",
29
+ };
30
+ async function sessionWith(answer) {
31
+ const seen = [];
32
+ globalThis.fetch = vi.fn(async (url, init) => {
33
+ const json = (status, body) => new Response(JSON.stringify(body), { status, headers: { "content-type": "application/json" } });
34
+ if (url.endsWith("/v1/sessions")) {
35
+ return json(201, { id: "ses_k1", org_id: "org_t", user_id: "u", servers: [], status: "active", created_at: new Date().toISOString(), closed_at: null });
36
+ }
37
+ const s = { url, method: init?.method ?? "GET", body: init?.body ? JSON.parse(init.body) : null, auth: init?.headers?.Authorization };
38
+ seen.push(s);
39
+ const a = answer(s);
40
+ return json(a.status, a.body);
41
+ });
42
+ const session = await createSession("u", { servers: [] }, { baseUrl: "https://api.example.com", apiKey: "csk_test_k1", timeout: 10_000 });
43
+ return { session, seen };
44
+ }
45
+ describe("session.purchases", () => {
46
+ it("create proposes with the wire's snake_case and returns the purchase, never an order", async () => {
47
+ const { session, seen } = await sessionWith(() => ({ status: 201, body: { purchase: PURCHASE, proposal: null, idempotent_replay: false } }));
48
+ const made = await session.purchases.create({ agentId: "ag_1", merchant: "test-merchant", items: [{ skuId: "cafe-especial-250g", quantity: 1 }], idempotencyKey: "idem_k1_0001" });
49
+ expect(seen[0]).toMatchObject({
50
+ url: "https://api.example.com/v1/shop/agent/purchases",
51
+ method: "POST",
52
+ body: { agent_id: "ag_1", merchant: "test-merchant", items: [{ sku_id: "cafe-especial-250g", quantity: 1 }], payment_method: "card", idempotency_key: "idem_k1_0001" },
53
+ auth: "Bearer csk_test_k1",
54
+ });
55
+ expect(made.purchase).toMatchObject({ id: PURCHASE.id, state: "drafted", order: null });
56
+ });
57
+ it("get reads where the purchase stands", async () => {
58
+ const { session, seen } = await sessionWith(() => ({ status: 200, body: { purchase: { ...PURCHASE, state: "succeeded", run_state: "completed", receipt: { funding_origin: "external_card", wallet_debit: false } } } }));
59
+ const p = await session.purchases.get(PURCHASE.id);
60
+ expect(seen[0].url).toBe(`https://api.example.com/v1/shop/agent/purchases/${PURCHASE.id}`);
61
+ expect(p.receipt).toEqual({ funding_origin: "external_card", wallet_debit: false });
62
+ });
63
+ it("a key without the delegated scope gets an error, not an empty success", async () => {
64
+ const { session } = await sessionWith(() => ({ status: 403, body: { error: "forbidden", message: "missing scope shop:purchases:write", status: 403 } }));
65
+ await expect(session.purchases.create({ agentId: "ag_1", merchant: "test-merchant", items: [{ skuId: "x", quantity: 1 }], idempotencyKey: "idem_k1_0002" })).rejects.toBeInstanceOf(CodesparApiError);
66
+ });
67
+ });
68
+ describe("session.instruments", () => {
69
+ it("lists a person's cards masked", async () => {
70
+ const { session, seen } = await sessionWith(() => ({ status: 200, body: { instruments: [{ id: "cfs_AAAAAAAA", kind: "byo_card", brand: "visa", last4: "4242", status: "active" }] } }));
71
+ const list = await session.instruments.list({ owner: "user_ana" });
72
+ expect(seen[0].url).toBe("https://api.example.com/v1/shop/agent/instruments?owner=user_ana");
73
+ expect(list).toEqual([{ id: "cfs_AAAAAAAA", kind: "byo_card", brand: "visa", last4: "4242", status: "active" }]);
74
+ });
75
+ });
76
+ //# sourceMappingURL=shop-purchases.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shop-purchases.test.js","sourceRoot":"","sources":["../../src/__tests__/shop-purchases.test.ts"],"names":[],"mappings":"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"}