From 408e0eb53ac4deb28e660584d443a492c8dd8ee4 Mon Sep 17 00:00:00 2001 From: Zenit Shkreli <69572953+zenit2001@users.noreply.github.com> Date: Wed, 12 Jun 2024 11:10:51 +0200 Subject: [PATCH] Consistently populating Adyen_paymentMethod (#1088) --- jest/__mocks__/dw/crypto/Encoding.js | 1 + jest/__mocks__/dw/crypto/MessageDigest.js | 1 + jest/__mocks__/dw/svc/LocalServiceRegistry.js | 1 + jest/__mocks__/dw/util/Bytes.js | 1 + jest/__mocks__/dw/util/Currency.js | 1 + jest/__mocks__/dw/util/UUIDUtils.js | 1 + jest/sfccCartridgeMocks.js | 4 +- .../adyen/scripts/payments/adyenCheckout.js | 5 -- .../adyen/utils/__tests__/adyenHelper.test.js | 69 +++++++++++++++++++ .../cartridge/adyen/utils/adyenHelper.js | 14 ++-- 10 files changed, 87 insertions(+), 11 deletions(-) create mode 100644 jest/__mocks__/dw/crypto/Encoding.js create mode 100644 jest/__mocks__/dw/crypto/MessageDigest.js create mode 100644 jest/__mocks__/dw/svc/LocalServiceRegistry.js create mode 100644 jest/__mocks__/dw/util/Bytes.js create mode 100644 jest/__mocks__/dw/util/Currency.js create mode 100644 jest/__mocks__/dw/util/UUIDUtils.js create mode 100644 src/cartridges/int_adyen_SFRA/cartridge/adyen/utils/__tests__/adyenHelper.test.js diff --git a/jest/__mocks__/dw/crypto/Encoding.js b/jest/__mocks__/dw/crypto/Encoding.js new file mode 100644 index 000000000..f4730ab8a --- /dev/null +++ b/jest/__mocks__/dw/crypto/Encoding.js @@ -0,0 +1 @@ +export const Encoding = jest.fn(); diff --git a/jest/__mocks__/dw/crypto/MessageDigest.js b/jest/__mocks__/dw/crypto/MessageDigest.js new file mode 100644 index 000000000..bbfbf0f80 --- /dev/null +++ b/jest/__mocks__/dw/crypto/MessageDigest.js @@ -0,0 +1 @@ +export const MessageDigest = jest.fn(); diff --git a/jest/__mocks__/dw/svc/LocalServiceRegistry.js b/jest/__mocks__/dw/svc/LocalServiceRegistry.js new file mode 100644 index 000000000..d2a245baf --- /dev/null +++ b/jest/__mocks__/dw/svc/LocalServiceRegistry.js @@ -0,0 +1 @@ +export const createService = jest.fn(); diff --git a/jest/__mocks__/dw/util/Bytes.js b/jest/__mocks__/dw/util/Bytes.js new file mode 100644 index 000000000..26a7f040e --- /dev/null +++ b/jest/__mocks__/dw/util/Bytes.js @@ -0,0 +1 @@ +export const Bytes = jest.fn(); diff --git a/jest/__mocks__/dw/util/Currency.js b/jest/__mocks__/dw/util/Currency.js new file mode 100644 index 000000000..0fcc8b358 --- /dev/null +++ b/jest/__mocks__/dw/util/Currency.js @@ -0,0 +1 @@ +export const getCurrency = jest.fn(); diff --git a/jest/__mocks__/dw/util/UUIDUtils.js b/jest/__mocks__/dw/util/UUIDUtils.js new file mode 100644 index 000000000..2d1ac18e7 --- /dev/null +++ b/jest/__mocks__/dw/util/UUIDUtils.js @@ -0,0 +1 @@ +export const createUUID = jest.fn(); diff --git a/jest/sfccCartridgeMocks.js b/jest/sfccCartridgeMocks.js index 162b335f5..4c5be1f95 100644 --- a/jest/sfccCartridgeMocks.js +++ b/jest/sfccCartridgeMocks.js @@ -389,4 +389,6 @@ jest.mock( getAllLineItems: jest.fn((lineItem) => lineItem), }), { virtual: true }, - ); \ No newline at end of file + ); + +jest.mock('*/cartridge/models/shipping/shippingMethod', () => jest.fn(), { virtual: true }); diff --git a/src/cartridges/int_adyen_SFRA/cartridge/adyen/scripts/payments/adyenCheckout.js b/src/cartridges/int_adyen_SFRA/cartridge/adyen/scripts/payments/adyenCheckout.js index c2ffd5a42..d9f9e36f8 100644 --- a/src/cartridges/int_adyen_SFRA/cartridge/adyen/scripts/payments/adyenCheckout.js +++ b/src/cartridges/int_adyen_SFRA/cartridge/adyen/scripts/payments/adyenCheckout.js @@ -51,11 +51,6 @@ function doPaymentsCall(order, paymentInstrument, paymentRequest) { if (!order) { return responseObject; } - // set custom payment method field to sync with OMS. - // for card payments (scheme) we will store the brand - order.custom.Adyen_paymentMethod = - paymentRequest?.paymentMethod?.brand || - paymentRequest?.paymentMethod?.type; paymentResponse.fullResponse = responseObject; paymentResponse.redirectObject = responseObject.action ? responseObject.action diff --git a/src/cartridges/int_adyen_SFRA/cartridge/adyen/utils/__tests__/adyenHelper.test.js b/src/cartridges/int_adyen_SFRA/cartridge/adyen/utils/__tests__/adyenHelper.test.js new file mode 100644 index 000000000..e178dd8c6 --- /dev/null +++ b/src/cartridges/int_adyen_SFRA/cartridge/adyen/utils/__tests__/adyenHelper.test.js @@ -0,0 +1,69 @@ +/* eslint-disable global-require */ +const savePaymentDetails = require('../adyenHelper').savePaymentDetails; +describe('savePaymentDetails', () => { + let paymentInstrument; + let order; + let result; + + beforeEach(() => { + paymentInstrument = { + paymentTransaction: { + custom: {} + }, + getCreditCardToken: jest.fn(), + setCreditCardToken: jest.fn() + }; + order = { + custom: {} + }; + result = {}; + }); + + it('should set the transactionID and Adyen_pspReference', () => { + result.pspReference = 'testReference'; + savePaymentDetails(paymentInstrument, order, result); + expect(paymentInstrument.paymentTransaction.transactionID).toBe('testReference'); + expect(paymentInstrument.paymentTransaction.custom.Adyen_pspReference).toBe('testReference'); + }); + + it('should set Adyen_paymentMethod from additionalData', () => { + result.additionalData = { paymentMethod: 'visa' }; + savePaymentDetails(paymentInstrument, order, result); + expect(paymentInstrument.paymentTransaction.custom.Adyen_paymentMethod).toBe('visa'); + expect(order.custom.Adyen_paymentMethod).toBe('visa'); + }); + + it('should set Adyen_paymentMethod from paymentMethod', () => { + result.paymentMethod = { type: 'mc' }; + savePaymentDetails(paymentInstrument, order, result); + expect(paymentInstrument.paymentTransaction.custom.Adyen_paymentMethod).toBe(JSON.stringify('mc')); + expect(order.custom.Adyen_paymentMethod).toBe(JSON.stringify('mc')); + }); + + it('should set the credit card token if not already exists', () => { + result.additionalData = { 'recurring.recurringDetailReference': 'token123' }; + paymentInstrument.getCreditCardToken.mockReturnValue(null); + savePaymentDetails(paymentInstrument, order, result); + expect(paymentInstrument.setCreditCardToken).toHaveBeenCalledWith('token123'); + }); + + it('should not set the credit card token if already exists', () => { + result.additionalData = { 'recurring.recurringDetailReference': 'token123' }; + paymentInstrument.getCreditCardToken.mockReturnValue('existingToken'); + savePaymentDetails(paymentInstrument, order, result); + expect(paymentInstrument.setCreditCardToken).not.toHaveBeenCalled(); + }); + + it('should set the authCode and Adyen_value', () => { + result.resultCode = 'Authorised'; + savePaymentDetails(paymentInstrument, order, result); + expect(paymentInstrument.paymentTransaction.custom.authCode).toBe('Authorised'); + expect(order.custom.Adyen_value).toBe('0'); + }); + + it('should set Adyen_donationToken if present', () => { + result.donationToken = 'donation-token-123'; + savePaymentDetails(paymentInstrument, order, result); + expect(paymentInstrument.paymentTransaction.custom.Adyen_donationToken).toBe('donation-token-123'); + }); +}); diff --git a/src/cartridges/int_adyen_SFRA/cartridge/adyen/utils/adyenHelper.js b/src/cartridges/int_adyen_SFRA/cartridge/adyen/utils/adyenHelper.js index 44a7e601b..ce53e913c 100644 --- a/src/cartridges/int_adyen_SFRA/cartridge/adyen/utils/adyenHelper.js +++ b/src/cartridges/int_adyen_SFRA/cartridge/adyen/utils/adyenHelper.js @@ -16,9 +16,8 @@ * This file is open source and available under the MIT license. * See the LICENSE file for more info. */ -const dwsvc = require('dw/svc'); -const dwsystem = require('dw/system'); -const dwutil = require('dw/util'); +const LocalServiceRegistry = require('dw/svc/LocalServiceRegistry'); +const Currency = require('dw/util/Currency'); const URLUtils = require('dw/web/URLUtils'); const Bytes = require('dw/util/Bytes'); const MessageDigest = require('dw/crypto/MessageDigest'); @@ -44,7 +43,7 @@ let adyenHelperObj = { let adyenService = null; try { - adyenService = dwsvc.LocalServiceRegistry.createService(service, { + adyenService = LocalServiceRegistry.createService(service, { createRequest(svc, args) { svc.setRequestMethod('POST'); if (args) { @@ -652,6 +651,7 @@ let adyenHelperObj = { }, // saves the payment details in the paymentInstrument's custom object + // set custom payment method field to sync with OMS savePaymentDetails(paymentInstrument, order, result) { paymentInstrument.paymentTransaction.transactionID = result.pspReference; paymentInstrument.paymentTransaction.custom.Adyen_pspReference = @@ -660,10 +660,14 @@ let adyenHelperObj = { if (result.additionalData?.paymentMethod) { paymentInstrument.paymentTransaction.custom.Adyen_paymentMethod = result.additionalData.paymentMethod; + order.custom.Adyen_paymentMethod = result.additionalData.paymentMethod; } else if (result.paymentMethod) { paymentInstrument.paymentTransaction.custom.Adyen_paymentMethod = JSON.stringify( result.paymentMethod.type, ); + order.custom.Adyen_paymentMethod = JSON.stringify( + result.paymentMethod.type, + ); } // For authenticated shoppers we are setting the token on other place already @@ -695,7 +699,7 @@ let adyenHelperObj = { // converts the currency value for the Adyen Checkout API getCurrencyValueForApi(amount) { - const currencyCode = dwutil.Currency.getCurrency(amount.currencyCode) || session.currency.currencyCode; + const currencyCode = Currency.getCurrency(amount.currencyCode) || session.currency.currencyCode; const digitsNumber = adyenHelperObj.getFractionDigits( currencyCode.toString(), );