UNPKG

@setu/upi-deep-links

Version:

NPM package to connect to Setu's UPI Deep Link APIs

212 lines 15.9 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); /* eslint-disable functional/immutable-data */ const ava_1 = __importDefault(require("ava")); const deeplinks_1 = require("./deeplinks"); const merchantAccount = { id: "987654321", ifsc: "KKBK0000001", }; const primaryAccount = { id: "123456789", ifsc: "KKBK0000001", }; const sleep = (ms) => { return new Promise((resolve) => { setTimeout(resolve, ms); }); }; // eslint-disable-next-line functional/prefer-readonly-type const test = ava_1.default; test.before((t) => { const upiDL = (0, deeplinks_1.SetuUPIDeepLink)({ schemeID: "c4f57443-dc1e-428f-8c4e-e5fd531057d2", secret: "5b288618-473f-4193-ae1b-8c42f223798e", productInstanceID: "861023031961584801", mode: "SANDBOX", authType: "OAUTH", }); t.context.upiDL = upiDL; const v1UPIDL = (0, deeplinks_1.SetuUPIDeepLink)({ schemeID: "5bf4376b-6008-43c8-8ce0-a5ea196e3091", secret: "9975fd99-d5ed-416a-9963-5d113dc80582", productInstanceID: "861023031961584801", mode: "SANDBOX", authType: "JWT", }); t.context.v1UPIDL = v1UPIDL; }); test("Create and make payment for DL", async (t) => { const { upiDL } = t.context; const paymentLinkBody = { amountValue: 20000, billerBillID: "918147077472", amountExactness: "EXACT", }; const createPaymentLinkResponse = await upiDL.createPaymentLink(paymentLinkBody); t.is(createPaymentLinkResponse.paymentLink.upiID, "refundtest@kaypay"); const { platformBillID } = createPaymentLinkResponse; const paymentStatusResponse = await upiDL.getPaymentStatus(platformBillID); t.is(paymentStatusResponse.status, "BILL_CREATED"); await upiDL.triggerMockPayment({ amountValue: 200, platformBillID: platformBillID, vpa: "refundtest@kaypay", }); await sleep(3000); const newPaymentStatusResponse = await upiDL.getPaymentStatus(platformBillID); t.is(newPaymentStatusResponse.status, "PAYMENT_SUCCESSFUL"); }); test("Make payment for DL and initiate refund", async (t) => { const { upiDL } = t.context; const paymentLinkBody = { amountValue: 20000, billerBillID: "918147077472", amountExactness: "EXACT", settlement: { parts: [ { account: merchantAccount, remarks: "EXACT sample split", split: { unit: "INR", value: 10000, }, }, ], primaryAccount, }, }; const createPaymentLinkResponse = await upiDL.createPaymentLink(paymentLinkBody); t.is(createPaymentLinkResponse.paymentLink.upiID, "refundtest@kaypay"); const { platformBillID } = createPaymentLinkResponse; await upiDL.triggerMockPayment({ amountValue: 200, platformBillID: platformBillID, vpa: "refundtest@kaypay", }); await sleep(3000); const initiateRefundResponse = await upiDL.initiateRefund({ refunds: [ { identifier: platformBillID, identifierType: "BILL_ID", refundType: "PARTIAL", refundAmount: 10000, deductions: [ { account: merchantAccount, split: { unit: "INR", value: 5000, }, }, { account: primaryAccount, split: { unit: "INR", value: 5000, }, }, ], }, ], }); t.true(initiateRefundResponse.refunds[0].success === true && initiateRefundResponse.refunds[0].status === "Created"); const getRefundBatchStatusResponse = await upiDL.getRefundBatchStatus(initiateRefundResponse.batchID); t.is(getRefundBatchStatusResponse.refunds[0].billID, platformBillID); const getRefundStatusByBatchResponse = await upiDL.getRefundStatusByIdentifier("batch", initiateRefundResponse.batchID); t.is(getRefundStatusByBatchResponse.refunds[0].billID, platformBillID); const getRefundStatusByBillResponse = await upiDL.getRefundStatusByIdentifier("bill", platformBillID); t.is(getRefundStatusByBillResponse.refunds[0].status, "Created"); const getRefundStatusResponse = await upiDL.getRefundStatus(getRefundBatchStatusResponse.refunds[0].id); t.is(getRefundStatusResponse.billID, platformBillID); const newInitiateRefundResponse = await upiDL.initiateRefund({ refunds: [ { identifier: platformBillID, identifierType: "BILL_ID", refundType: "FULL", deductions: [ { account: merchantAccount, split: { unit: "INR", value: 10000, }, }, { account: primaryAccount, split: { unit: "INR", value: 10000, }, }, ], }, ], }); t.true(newInitiateRefundResponse.refunds[0].success === false); }); test("Create and expire DL using V1 auth", async (t) => { const { v1UPIDL: upiDL } = t.context; const paymentLinkBody = { amountValue: 20000, billerBillID: "918147077472", amountExactness: "EXACT", }; const createPaymentLinkResponse = await upiDL.createPaymentLink(paymentLinkBody); t.is(createPaymentLinkResponse.paymentLink.upiID, "refundtest@kaypay"); const newPlatformBillID = createPaymentLinkResponse.platformBillID; await upiDL.expireBill(newPlatformBillID); const paymentStatusResponse = await upiDL.getPaymentStatus(newPlatformBillID); t.is(paymentStatusResponse.status, "BILL_EXPIRED"); }); test("Create DL using invalid keys", async (t) => { const upiDL = (0, deeplinks_1.SetuUPIDeepLink)({ schemeID: "invalid-scheme-id", secret: "invalid-secret", productInstanceID: "861023031961584801", mode: "SANDBOX", authType: "OAUTH", }); try { const paymentLinkBody = { amountValue: 20000, billerBillID: "918147077472", amountExactness: "EXACT", }; await upiDL.createPaymentLink(paymentLinkBody); } catch (err) { if (upiDL.isSetuError(err)) { t.is(err.code, "invalid-api-key"); } } }); test.skip("Refresh keys automatically", async (t) => { const { upiDL } = t.context; t.plan(5); // eslint-disable-next-line functional/no-loop-statement, functional/no-let for (let i = 0; i < 5; ++i) { try { const paymentLinkBody = { amountValue: 20000, billerBillID: "918147077472", amountExactness: "EXACT", }; const createPaymentLinkResponse = await upiDL.createPaymentLink(paymentLinkBody); t.is(createPaymentLinkResponse.paymentLink.upiID, "refundtest@kaypay"); await sleep(15000); } catch (err) { if (upiDL.isSetuError(err)) { t.log("This should not happen"); } } } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVlcGxpbmtzLnNwZWMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL2RlZXBsaW5rcy5zcGVjLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsOENBQThDO0FBQzlDLDhDQUE2QztBQUU3QywyQ0FBOEM7QUFHOUMsTUFBTSxlQUFlLEdBQUc7SUFDcEIsRUFBRSxFQUFFLFdBQVc7SUFDZixJQUFJLEVBQUUsYUFBYTtDQUN0QixDQUFDO0FBRUYsTUFBTSxjQUFjLEdBQUc7SUFDbkIsRUFBRSxFQUFFLFdBQVc7SUFDZixJQUFJLEVBQUUsYUFBYTtDQUN0QixDQUFDO0FBRUYsTUFBTSxLQUFLLEdBQUcsQ0FBQyxFQUFVLEVBQUUsRUFBRTtJQUN6QixPQUFPLElBQUksT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUU7UUFDM0IsVUFBVSxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsQ0FBQztJQUM1QixDQUFDLENBQUMsQ0FBQztBQUNQLENBQUMsQ0FBQztBQUVGLDJEQUEyRDtBQUMzRCxNQUFNLElBQUksR0FBRyxhQUE4RixDQUFDO0FBRTVHLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRTtJQUNkLE1BQU0sS0FBSyxHQUFHLElBQUEsMkJBQWUsRUFBQztRQUMxQixRQUFRLEVBQUUsc0NBQXNDO1FBQ2hELE1BQU0sRUFBRSxzQ0FBc0M7UUFDOUMsaUJBQWlCLEVBQUUsb0JBQW9CO1FBQ3ZDLElBQUksRUFBRSxTQUFTO1FBQ2YsUUFBUSxFQUFFLE9BQU87S0FDcEIsQ0FBQyxDQUFDO0lBQ0gsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO0lBRXhCLE1BQU0sT0FBTyxHQUFHLElBQUEsMkJBQWUsRUFBQztRQUM1QixRQUFRLEVBQUUsc0NBQXNDO1FBQ2hELE1BQU0sRUFBRSxzQ0FBc0M7UUFDOUMsaUJBQWlCLEVBQUUsb0JBQW9CO1FBQ3ZDLElBQUksRUFB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