@setu/upi-deep-links
Version:
NPM package to connect to Setu's UPI Deep Link APIs
212 lines • 15.9 kB
JavaScript
"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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