Skip to main content
Glama

Dodo Payments

Official
by dodopayments
webhooks.test.ts5.64 kB
// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. import { Webhook } from 'standardwebhooks'; import DodoPayments from 'dodopayments'; const client = new DodoPayments({ bearerToken: 'My Bearer Token', baseURL: process.env['TEST_API_BASE_URL'] ?? 'http://127.0.0.1:4010', }); describe('resource webhooks', () => { test('create: only required params', async () => { const responsePromise = client.webhooks.create({ url: 'url' }); const rawResponse = await responsePromise.asResponse(); expect(rawResponse).toBeInstanceOf(Response); const response = await responsePromise; expect(response).not.toBeInstanceOf(Response); const dataAndResponse = await responsePromise.withResponse(); expect(dataAndResponse.data).toBe(response); expect(dataAndResponse.response).toBe(rawResponse); }); test('create: required and optional params', async () => { const response = await client.webhooks.create({ url: 'url', description: 'description', disabled: true, filter_types: ['payment.succeeded'], headers: { foo: 'string' }, idempotency_key: 'idempotency_key', metadata: { foo: 'string' }, rate_limit: 0, }); }); test('retrieve', async () => { const responsePromise = client.webhooks.retrieve('webhook_id'); const rawResponse = await responsePromise.asResponse(); expect(rawResponse).toBeInstanceOf(Response); const response = await responsePromise; expect(response).not.toBeInstanceOf(Response); const dataAndResponse = await responsePromise.withResponse(); expect(dataAndResponse.data).toBe(response); expect(dataAndResponse.response).toBe(rawResponse); }); test('update', async () => { const responsePromise = client.webhooks.update('webhook_id', {}); const rawResponse = await responsePromise.asResponse(); expect(rawResponse).toBeInstanceOf(Response); const response = await responsePromise; expect(response).not.toBeInstanceOf(Response); const dataAndResponse = await responsePromise.withResponse(); expect(dataAndResponse.data).toBe(response); expect(dataAndResponse.response).toBe(rawResponse); }); test('list', async () => { const responsePromise = client.webhooks.list(); const rawResponse = await responsePromise.asResponse(); expect(rawResponse).toBeInstanceOf(Response); const response = await responsePromise; expect(response).not.toBeInstanceOf(Response); const dataAndResponse = await responsePromise.withResponse(); expect(dataAndResponse.data).toBe(response); expect(dataAndResponse.response).toBe(rawResponse); }); test('list: request options and params are passed correctly', async () => { // ensure the request options are being passed correctly by passing an invalid HTTP method in order to cause an error await expect( client.webhooks.list({ iterator: 'iterator', limit: 0 }, { path: '/_stainless_unknown_path' }), ).rejects.toThrow(DodoPayments.NotFoundError); }); test('delete', async () => { const responsePromise = client.webhooks.delete('webhook_id'); const rawResponse = await responsePromise.asResponse(); expect(rawResponse).toBeInstanceOf(Response); const response = await responsePromise; expect(response).not.toBeInstanceOf(Response); const dataAndResponse = await responsePromise.withResponse(); expect(dataAndResponse.data).toBe(response); expect(dataAndResponse.response).toBe(rawResponse); }); test('retrieveSecret', async () => { const responsePromise = client.webhooks.retrieveSecret('webhook_id'); const rawResponse = await responsePromise.asResponse(); expect(rawResponse).toBeInstanceOf(Response); const response = await responsePromise; expect(response).not.toBeInstanceOf(Response); const dataAndResponse = await responsePromise.withResponse(); expect(dataAndResponse.data).toBe(response); expect(dataAndResponse.response).toBe(rawResponse); }); test('unwrap', async () => { const key = 'whsec_c2VjcmV0Cg=='; const payload = '{"business_id":"business_id","data":{"amount":"amount","business_id":"business_id","created_at":"2019-12-27T18:11:19.117Z","currency":"currency","dispute_id":"dispute_id","dispute_stage":"pre_dispute","dispute_status":"dispute_opened","payment_id":"payment_id","remarks":"remarks","payload_type":"Dispute"},"timestamp":"2019-12-27T18:11:19.117Z","type":"dispute.accepted"}'; const msgID = '1'; const timestamp = new Date(); const wh = new Webhook(key); const signature = wh.sign(msgID, timestamp, payload); const headers: Record<string, string> = { 'webhook-signature': signature, 'webhook-id': msgID, 'webhook-timestamp': String(Math.floor(timestamp.getTime() / 1000)), }; client.webhooks.unwrap(payload, { headers, key }); expect(() => { const wrongKey = 'whsec_aaaaaaaaaa=='; client.webhooks.unwrap(payload, { headers, key: wrongKey }); }).toThrow('No matching signature found'); expect(() => { const badSig = wh.sign(msgID, timestamp, 'some other payload'); client.webhooks.unwrap(payload, { headers: { ...headers, 'webhook-signature': badSig }, key }); }).toThrow('No matching signature found'); expect(() => { client.webhooks.unwrap(payload, { headers: { ...headers, 'webhook-timestamp': '5' }, key }); }).toThrow('Message timestamp too old'); expect(() => { client.webhooks.unwrap(payload, { headers: { ...headers, 'webhook-id': 'wrong' }, key }); }).toThrow('No matching signature found'); }); });

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/dodopayments/dodopayments-node'

If you have feedback or need assistance with the MCP directory API, please join our Discord server