Skip to content

Commit

Permalink
[SFI-260] Increased unit test coverage (#1030)
Browse files Browse the repository at this point in the history
* test: increased unit test coverage

* chore: skipping one test + linting

* chore: skipping makepartialpayments tests

* fix: refactored makePartialPayment function and fixed the corresponding tests

* fix: fixed also the unit tests to comply the error messages

* fix: fixed adding mocks for github actions

* fix: awaiting the promise to be resolved to remove flakiness in e2e
  • Loading branch information
zenit2001 committed Dec 28, 2023
1 parent 58965ba commit 0795ef6
Show file tree
Hide file tree
Showing 11 changed files with 779 additions and 46 deletions.
24 changes: 23 additions & 1 deletion jest/sfccCartridgeMocks.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
// mocks for all cartridge paths containing asterisk (*) symbol

// cartridge/models mocks
jest.mock('*/cartridge/models/order', () => {
return jest.fn();
Expand All @@ -10,6 +9,13 @@ jest.mock('*/cartridge/models/cart', () => {
}, {virtual: true});

jest.mock('*/cartridge/scripts/checkout/shippingHelpers', () => {
return {
getShipmentByUUID: jest.fn(() => 'mocked_uuid'),
selectShippingMethod : jest.fn(),
};
}, {virtual: true});

jest.mock('*/cartridge/models/cart', () => {
return jest.fn();
}, {virtual: true});

Expand Down Expand Up @@ -287,6 +293,15 @@ jest.mock('*/cartridge/scripts/util/adyenConfigs', () => {
};
}, {virtual: true});

jest.mock('*/cartridge/client/default/js/adyen_checkout/renderGiftcardComponent', () => {
return {
removeGiftCards : jest.fn(),
showGiftCardWarningMessage : jest.fn(),
clearGiftCardsContainer : jest.fn(),
renderAddedGiftCard : jest.fn(),
};
}, {virtual: true});

jest.mock('*/cartridge/scripts/util/array', () => {
return { find: jest.fn((array, callback) => array.find(callback))};
}, {virtual: true});
Expand All @@ -301,3 +316,10 @@ jest.mock('*/cartridge/controllers/middlewares/checkout_services/adyenCheckoutSe
isNotAdyen: jest.fn(() => false),
};
}, {virtual: true});

jest.mock('*/cartridge/controllers/middlewares/checkout_services/adyenCheckoutServices', () => {
return {
processPayment: jest.fn(),
isNotAdyen: jest.fn(() => false),
};
}, {virtual: true});
4 changes: 4 additions & 0 deletions jest/sfccPathSetup.js
Original file line number Diff line number Diff line change
Expand Up @@ -220,6 +220,10 @@ jest.mock('*/cartridge/scripts/checkout/shippingHelpers', () => {
return require('../src/cartridges/int_adyen_SFRA/cartridge/scripts/checkout/shippingHelpers');
}, {virtual: true});

jest.mock('*/cartridge/client/default/js/adyen_checkout/renderGiftcardComponent', () => {
return require('../src/cartridges/int_adyen_SFRA/client/default/js/adyen_checkout/renderGiftcardComponent');
}, {virtual: true});

// scripts/hooks/payment/processor/middlewares/authorize subclasses
jest.mock('*/cartridge/scripts/hooks/payment/processor/middlewares/authorize/paymentResponse', () => {
return require('../src/cartridges/int_adyen_SFRA/cartridge/scripts/hooks/payment/processor/middlewares/authorize/paymentResponse');
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,10 @@ const {
getPaypalConfig,
getGooglePayConfig,
getAmazonpayConfig,
getGiftCardConfig,
getCashAppConfig,
getApplePayConfig,
getKlarnaConfig,
setCheckoutConfiguration,
} = require('../checkoutConfiguration');
const store = require('../../../../../store');
Expand All @@ -14,14 +18,27 @@ let card;
let paypal;
let paywithgoogle;
let amazonpay;
let giftcardconfig;
let cashapp;
let applepay;
let klarna;
let querySelector;

beforeEach(() => {
jest.clearAllMocks();
querySelector = document.querySelector;
window.Configuration = { environment: 'TEST' };
window.klarnaWidgetEnabled = true;
store.checkoutConfiguration = {};
setCheckoutConfiguration()
card = getCardConfig();
paypal = getPaypalConfig();
paywithgoogle = getGooglePayConfig();
amazonpay = getAmazonpayConfig();
cashapp = getCashAppConfig();
applepay = getApplePayConfig();
klarna = getKlarnaConfig();
giftcardconfig = getGiftCardConfig();
});

describe('Checkout Configuration', () => {
Expand All @@ -33,6 +50,7 @@ describe('Checkout Configuration', () => {
card.onChange({ isValid: true, data });
expect(store.selectedPayment.isValid).toBeTruthy();
});

it('handles onFieldValid', () => {
const mockedInput = "<input id='cardNumber' />";
document.body.innerHTML = mockedInput;
Expand All @@ -41,6 +59,7 @@ describe('Checkout Configuration', () => {
const cardNumber = document.querySelector('#cardNumber');
expect(cardNumber.value).toEqual('************4444');
});

it('handles onBrand', () => {
const mockedInput = "<input id='cardType' />";
document.body.innerHTML = mockedInput;
Expand All @@ -49,6 +68,25 @@ describe('Checkout Configuration', () => {
const cardType = document.querySelector('#cardType');
expect(cardType.value).toEqual('visa');
});

it('handles onSubmit', () => {
document.body.innerHTML = `
<div id="lb_scheme">Cards</div>
<div id="adyenPaymentMethodName"></div>
<button value="submit-payment"></button>
`;
const spy = jest.fn();
const submitButton = document.querySelector(
'button[value="submit-payment"]',
);
submitButton.addEventListener('click', () => {
spy();
});
store.selectedMethod = 'scheme';
card.onSubmit({ data: {} });
expect(spy).toBeCalledTimes(1);
expect(submitButton.disabled).toBeFalsy();
});
});
describe('PayPal', () => {
it('handles onSubmit', () => {
Expand All @@ -64,9 +102,50 @@ describe('Checkout Configuration', () => {
JSON.stringify(store.selectedPayment.stateData),
);
});
});

describe('PayPal Fail', () => {
it('handles onCancel', () => {
document.body.innerHTML = `
<div id="merchantReference"></div>
<div id="adyenPaymentMethodName"></div>
<div id="orderToken"></div>
`;
store.paypalTerminatedEarly = true;
paypal.onCancel({}, {});
expect(store.paypalTerminatedEarly).toBe(false);
});

it('handles onError', () => {
document.body.innerHTML = `
<div id="showConfirmationForm"></div>
`;
document.querySelector = jest.fn();
document.querySelector.mockReturnValue({
value: '',
submit: jest.fn(),
});
store.paypalTerminatedEarly = true;
const error = new Error('Test error');
const component = { setStatus: jest.fn() };
paypal.onError(error, component);
expect(store.paypalTerminatedEarly).toBe(false);
expect(component.setStatus).toBeCalledWith('ready');
expect(document.querySelector('#showConfirmationForm').submit).toBeCalled();
document.querySelector = querySelector;
});

it('handles onClick when paypalTerminatedEarly is set to true', () => {
document.body.innerHTML = `
<div id="lb_paypal">PayPal</div>
<div id="adyenPaymentMethodName"></div>
<div id="merchantReference"></div>
`;
store.selectedMethod = 'paypal';
store.paypalTerminatedEarly = true;
const actions = { resolve: jest.fn() };
paypal.onClick({}, actions);
expect(actions.resolve).toBeCalledTimes(1);
});

it('handles onClick fail', () => {
document.body.innerHTML = `
<div id="lb_paypal">PayPal</div>
Expand All @@ -76,14 +155,31 @@ describe('Checkout Configuration', () => {
store.selectedMethod = 'paypal';
store.formErrorsExist = true;
store.componentsObj = { paypal: { stateData: { foo: 'bar' } } };
const resolve = jest.fn();
const reject = jest.fn();
amazonpay.onClick(resolve, reject);
expect(resolve).toBeCalledTimes(0);
expect(reject).toBeCalledTimes(1);
const actions = { resolve: jest.fn(), reject: jest.fn() };
paypal.onClick({}, actions);
expect(actions.resolve).toBeCalledTimes(0);
expect(actions.reject).toBeCalledTimes(1);
});

it('handles onAdditionalDetails', () => {
document.body.innerHTML = `
<div id="lb_paypal">PayPal</div>
<div id="additionalDetailsHidden"></div>
<div id="showConfirmationForm"></div>
`;
document.querySelector = jest.fn();
document.querySelector.mockReturnValue({
value: '',
submit: jest.fn(),
});
store.selectedMethod = 'paypal';
paypal.onAdditionalDetails({});
expect(document.querySelector).toHaveBeenCalledWith('#additionalDetailsHidden');
expect(document.querySelector).toHaveBeenCalledWith('#showConfirmationForm');
document.querySelector = querySelector;
});
});

describe('GooglePay', () => {
it('handles onSubmit', () => {
document.body.innerHTML = `
Expand Down Expand Up @@ -121,9 +217,7 @@ describe('Checkout Configuration', () => {
expect(resolve).toBeCalledTimes(1);
expect(reject).toBeCalledTimes(0);
});
});

describe('AmazonPay Fail', () => {
it('handles onClick fail', () => {
document.body.innerHTML = `
<div id="lb_amazonpay">AmazonPay</div>
Expand All @@ -140,4 +234,150 @@ describe('Checkout Configuration', () => {
expect(reject).toBeCalledTimes(1);
});
});

describe('ApplePay', () => {
it('handles onSubmit', () => {
document.body.innerHTML = `
<div id="lb_applepay">ApplePay</div>
<div id="adyenPaymentMethodName"></div>
<div id="adyenStateData"></div>
`;
store.selectedMethod = 'applepay';
store.componentsObj = { applepay: { stateData: { foo: 'bar' } } };
applepay.onSubmit({ data: {} });
expect(document.getElementById('adyenPaymentMethodName').value).toBe('ApplePay');
});
});

describe('CashApp', () => {
it('handles onSubmit', () => {
document.body.innerHTML = `
<div id="lb_cashapp">CashApp</div>
<div id="adyenPaymentMethodName"></div>
`;
store.selectedMethod = 'cashapp';
store.componentsObj = { cashapp: { stateData: { foo: 'bar' } } };
cashapp.onSubmit({ data: {} });
expect(document.getElementById('adyenPaymentMethodName').value).toBe('CashApp');
});
});

describe('Giftcards', () => {
it('should update selected payment on change with valid state', () => {
store.updateSelectedPayment = jest.fn();
giftcardconfig.onChange({ isValid: true, data: 'testData' });
expect(store.updateSelectedPayment).toHaveBeenCalledWith("giftcard", "isValid", true);
expect(store.updateSelectedPayment).toHaveBeenCalledWith(
'giftcard',
'stateData',
'testData'
);
});

it('should call onBalanceCheck and resolve with valid data', async () => {
document.body.innerHTML = `
<button value="submit-payment" disabled></button>
<div id="cancelGiftCardButton"></div>
<div id="giftCardsInfoMessage"></div>
`;
store.partialPaymentsOrderObj = {};
const mockResolve = jest.fn();
const mockReject = jest.fn();
const requestData = {resultCode: 'success', remainingAmountFormatted: 50, totalAmountFormatted: 100};
store.checkout = {
options: {}
};
jest.spyOn($, 'ajax').mockImplementation((options) => {
options.success({ balance: 100, resultCode: 'Success'});
});
const config = giftcardconfig;
await config.onBalanceCheck(mockResolve, mockReject, requestData);
expect(mockResolve).toHaveBeenCalled();
expect(mockReject).not.toHaveBeenCalled();
});

it('should call onBalanceCheck and reject with invalid result code', async () => {
document.body.innerHTML = `
<button value="submit-payment" disabled></button>
<div id="cancelGiftCardButton"></div>
`;
store.partialPaymentsOrderObj = {};
const mockResolve = jest.fn();
const mockReject = jest.fn();
const requestData = {resultCode: 'invalid', remainingAmountFormatted: 50, totalAmountFormatted: 100};
jest.spyOn($, 'ajax').mockImplementation((options) => {
options.success({ balance: 100, resultCode: 'invalid'});
});
const config = giftcardconfig;
await config.onBalanceCheck(mockResolve, mockReject, requestData);
expect(mockReject).toHaveBeenCalled();
expect(mockResolve).not.toHaveBeenCalled();
});

it('should handle onSubmit correctly', () => {
document.body.innerHTML = `
<input name="brandCode">
<button value="submit-payment" disabled></button>
`;
const spy = jest.fn();
const submitButton = document.querySelector(
'button[value="submit-payment"]',
);
submitButton.addEventListener('click', () => {
spy();
});
const stateData = {
data: {
paymentMethod: {
type: 'giftcard',
},
},
};
const config = giftcardconfig;
config.onSubmit(stateData, {});
expect(document.querySelector('input[name="brandCode"]').checked).toBeFalsy();
expect(document.querySelector('button[value="submit-payment"]').disabled).toBeFalsy();
expect(spy).toBeCalledTimes(1);
});

it('should make gift card payment request on successful order request', () => {
});

it('should reject gift card payment request onOrderRequest if partialPaymentResponse contains error', () => {
});

it('should make payments call including giftcard data and order data', () => {
})
});

describe('Klarna', () => {
it('handles onSubmit', () => {
document.body.innerHTML = `
<div id="lb_klarna">Klarna</div>
<div id="adyenPaymentMethodName"></div>
<div id="adyenStateData"></div>
`;
store.selectedMethod = 'klarna';
store.componentsObj = { klarna: { stateData: { foo: 'bar' } } };
klarna.onSubmit({ data: {} });
expect(document.getElementById('adyenPaymentMethodName').value).toBe('Klarna');
});

it('handles onAdditionalDetails', () => {
document.body.innerHTML = `
<div id="additionalDetailsHidden"></div>
<div id="showConfirmationForm"></div>
`;
document.querySelector = jest.fn();
document.querySelector.mockReturnValue({
value: '',
submit: jest.fn(),
});
store.selectedMethod = 'klarna';
klarna.onAdditionalDetails({});
expect(document.querySelector).toHaveBeenCalledWith('#additionalDetailsHidden');
expect(document.querySelector).toHaveBeenCalledWith('#showConfirmationForm');
document.querySelector = querySelector;
});
});
});
Loading

0 comments on commit 0795ef6

Please sign in to comment.