diff --git a/src/disbursements.ts b/src/disbursements.ts index 4ecbdc1..355d2b6 100644 --- a/src/disbursements.ts +++ b/src/disbursements.ts @@ -12,6 +12,10 @@ import { } from "./common"; export interface TransferRequest { + /** + * Unique Transfer Reference (UUID v4), will be automatically generated if not explicitly supplied + */ + referenceId?: string; /** * Amount that will be debited from the payer account. */ @@ -114,10 +118,10 @@ export default class Disbursements { */ public transfer({ callbackUrl, + referenceId = uuid(), ...payoutRequest }: TransferRequest): Promise { - return validateTransfer(payoutRequest).then(() => { - const referenceId: string = uuid(); + return validateTransfer({ referenceId, ...payoutRequest }).then(() => { return this.client .post("/disbursement/v1_0/transfer", payoutRequest, { headers: { diff --git a/src/validate.ts b/src/validate.ts index fd97701..b875983 100644 --- a/src/validate.ts +++ b/src/validate.ts @@ -32,8 +32,10 @@ export function validateRequestToPay( export function validateTransfer( payoutRequest: TransferRequest ): Promise { - const { amount, currency, payee }: TransferRequest = payoutRequest || {}; + const { amount, currency, payee, referenceId }: TransferRequest = payoutRequest || {}; return Promise.resolve().then(() => { + strictEqual(isTruthy(referenceId), true, "referenceId is required"); + strictEqual(isUuid4(referenceId as string), true, "referenceId must be a valid uuid v4"); strictEqual(isTruthy(amount), true, "amount is required"); strictEqual(isNumeric(amount), true, "amount must be a number"); strictEqual(isTruthy(currency), true, "currency is required"); diff --git a/test/validate.test.ts b/test/validate.test.ts index d7163fd..8b74f5b 100644 --- a/test/validate.test.ts +++ b/test/validate.test.ts @@ -271,9 +271,27 @@ describe("Validate", function() { }); describe("validateTransfer", function() { - context("when the amount is missing", function() { + context("when the referenceId is missing", function() { it("throws an error", function() { const request = {} as TransferRequest; + return expect(validateTransfer(request)).to.be.rejectedWith( + "referenceId is required" + ); + }); + }); + + context("when referenceId is not a valid uuid", function() { + it("throws an error", function () { + const request = { referenceId: "test reference id" } as TransferRequest; + return expect(validateTransfer(request)).to.be.rejectedWith( + "referenceId must be a valid uuid v4" + ); + }); + }); + + context("when the amount is missing", function() { + it("throws an error", function() { + const request = { referenceId: uuid() } as TransferRequest; return expect(validateTransfer(request)).to.be.rejectedWith( "amount is required" ); @@ -282,7 +300,7 @@ describe("Validate", function() { context("when the amount is not numeric", function() { it("throws an error", function() { - const request = { amount: "alphabetic" } as TransferRequest; + const request = { referenceId: uuid(), amount: "alphabetic" } as TransferRequest; return expect(validateTransfer(request)).to.be.rejectedWith( "amount must be a number" ); @@ -292,6 +310,7 @@ describe("Validate", function() { context("when the currency is missing", function() { it("throws an error", function() { const request = { + referenceId: uuid(), amount: "1000" } as TransferRequest; return expect(validateTransfer(request)).to.be.rejectedWith( @@ -303,6 +322,7 @@ describe("Validate", function() { context("when the payee is missing", function() { it("throws an error", function() { const request = { + referenceId: uuid(), amount: "1000", currency: "UGX" } as TransferRequest; @@ -315,6 +335,7 @@ describe("Validate", function() { context("when the party id is missing", function() { it("throws an error", function() { const request = { + referenceId: uuid(), amount: "1000", currency: "UGX", payee: {} @@ -328,6 +349,7 @@ describe("Validate", function() { context("when the party id type is missing", function() { it("throws an error", function() { const request = { + referenceId: uuid(), amount: "1000", currency: "UGX", payee: { @@ -343,6 +365,7 @@ describe("Validate", function() { context("when the request is valid", function() { it("fulfills", function() { const request = { + referenceId: uuid(), amount: "1000", currency: "UGX", payee: {