diff --git a/app/models/card.js b/app/models/card.js index a846fa34f..74306f2ad 100644 --- a/app/models/card.js +++ b/app/models/card.js @@ -17,7 +17,7 @@ const i18nConfig = require('../../config/i18n') i18n.configure(i18nConfig) -const checkCard = function (cardNo, allowed, language, correlationId, subSegment, loggingFields = {}) { +const checkCard = function (cardNo, allowed, blockPrepaidCards, language, correlationId, subSegment, loggingFields = {}) { return new Promise(function (resolve, reject) { const startTime = new Date() const data = { cardNumber: parseInt(cardNo) } @@ -79,6 +79,10 @@ const checkCard = function (cardNo, allowed, language, correlationId, subSegment } } + if(blockPrepaidCards && card.prepaid === 'PREPAID') { + return reject(new Error(i18n.__('fieldErrors.fields.cardNo.unsupportedPrepaidCard', changeCase.titleCase(card.brand)))) + } + resolve(card) }) .catch(error => { @@ -106,7 +110,7 @@ const normaliseCardType = function (cardType) { return undefined } -module.exports = function (allowedCards, correlationId) { +module.exports = function (allowedCards, blockPrepaidCards, correlationId) { const withdrawalTypes = [] const allowed = _.clone(allowedCards) correlationId = correlationId || '' @@ -118,7 +122,7 @@ module.exports = function (allowedCards, correlationId) { withdrawalTypes: withdrawalTypes, allowed: _.clone(allowed), checkCard: (cardNo, language, subSegment, loggingFields = {}) => { - return checkCard(cardNo, allowed, language, correlationId, subSegment, loggingFields) + return checkCard(cardNo, allowed, blockPrepaidCards, language, correlationId, subSegment, loggingFields) } } } diff --git a/locales/en.json b/locales/en.json index 676afa42d..62ffe5bdf 100644 --- a/locales/en.json +++ b/locales/en.json @@ -113,7 +113,8 @@ "nonNumeric": "Enter a valid card number", "unsupportedBrand": "%s is not supported", "unsupportedDebitCard": "%s debit cards are not supported", - "unsupportedCreditCard": "%s credit cards are not supported" + "unsupportedCreditCard": "%s credit cards are not supported", + "unsupportedPrepaidCard": "Prepaid card payments are not accepted" }, "cvc": { "name": "card security code", diff --git a/test/models/card_test.js b/test/models/card_test.js index cbe1a6839..55fb92ab0 100644 --- a/test/models/card_test.js +++ b/test/models/card_test.js @@ -8,6 +8,12 @@ const { unexpectedPromise } = require(path.join(__dirname, '/../test_helpers/tes const proxyquire = require('proxyquire') const AWSXRay = require('aws-xray-sdk') +const chai = require('chai') +const chaiAsPromised = require('chai-as-promised') +chai.use(chaiAsPromised) + +const { expect } = chai + // Local dependencies require(path.join(__dirname, '/../test_helpers/html_assertions.js')) @@ -97,6 +103,33 @@ describe('card', function () { }) }) + // public enum PrepaidStatus { PREPAID, NOT_PREPAID, UNKNOWN} + describe('a prepaid card', () => { + const gatewayAccountAllowCardsConfiguration = [{ brand: 'bar', label: 'bar', type: 'CREDIT', id: 'id-0' }] + + beforeEach(function () { + nock.cleanAll() + nock(process.env.CARDID_HOST) + .post('/v1/api/card') + .reply(200, { brand: 'bar', label: 'bar', prepaid: 'PREPAID', corporate: true }) + }) + + it('should reject if gateway account `block_prepaid_cards` is set to true', () => { + const gatewayAccountBlockedPrepaid = true + + const scenario = CardModel(gatewayAccountAllowCardsConfiguration, gatewayAccountBlockedPrepaid).checkCard(1234) + + return expect(scenario).to.be.rejectedWith('Prepaid card payments are not accepted') + }) + + it('should allow if gateway account `block_prepaid_cards` is set to false', async () => { + const gatewayAccountBlockedPrepaid = false + const card = await CardModel(gatewayAccountAllowCardsConfiguration, gatewayAccountBlockedPrepaid).checkCard(1234) + + expect(card.brand).is.equal.toString('bar') + }) + }) + describe('a card that is not allowed debit withdrawal type', function () { before(function () { nock.cleanAll()