diff --git a/packages/paypal-payments-pro-integration/src/PayPalPaymentsProPaymentMethod.test.tsx b/packages/paypal-payments-pro-integration/src/PayPalPaymentsProPaymentMethod.test.tsx new file mode 100644 index 0000000000..98479a6391 --- /dev/null +++ b/packages/paypal-payments-pro-integration/src/PayPalPaymentsProPaymentMethod.test.tsx @@ -0,0 +1,97 @@ +import { + type CheckoutSelectors, + type CheckoutService, + createCheckoutService, + createLanguageService, +} from '@bigcommerce/checkout-sdk'; +import { screen } from '@testing-library/react'; +import React from 'react'; + +import type { + PaymentFormService, + PaymentMethodProps, +} from '@bigcommerce/checkout/payment-integration-api'; +import { + getCart, + getCustomer, + getPaymentFormServiceMock, + getPaymentMethod, + getStoreConfig, +} from '@bigcommerce/checkout/test-mocks'; +import { render } from '@bigcommerce/checkout/test-utils'; + +import PaypalPaymentsProPaymentMethod from './PayPalPaymentsProPaymentMethod'; + +const hostedPaymentMethodText = 'Hosted Payment Component rendered successfully'; +const hostedCreditCardPaymentMethodText = + 'Hosted Credit Card Payment Component rendered successfully'; + +// eslint-disable-next-line @typescript-eslint/no-unsafe-return +jest.mock('@bigcommerce/checkout/hosted-payment-integration', () => ({ + ...jest.requireActual('@bigcommerce/checkout/hosted-payment-integration'), + HostedPaymentComponent: () =>
{hostedPaymentMethodText}
, +})); + +// eslint-disable-next-line @typescript-eslint/no-unsafe-return +jest.mock('@bigcommerce/checkout/hosted-credit-card-integration', () => ({ + ...jest.requireActual('@bigcommerce/checkout/hosted-credit-card-integration'), + HostedCreditCardComponent: () =>
{hostedCreditCardPaymentMethodText}
, +})); + +describe('PaypalPaymentsProPaymentMethod', () => { + let checkoutService: CheckoutService; + let checkoutState: CheckoutSelectors; + let defaultProps: Omit; + let paymentForm: PaymentFormService; + let paymentMethod: PaymentMethodProps['method']; + + beforeEach(() => { + checkoutService = createCheckoutService(); + checkoutState = checkoutService.getState(); + paymentForm = getPaymentFormServiceMock(); + paymentMethod = { + ...getPaymentMethod(), + id: 'paypalpaymentsprous', + gateway: 'paypal', + }; + + jest.spyOn(checkoutState.data, 'getConfig').mockReturnValue(getStoreConfig()); + jest.spyOn(checkoutState.data, 'getCart').mockReturnValue(getCart()); + jest.spyOn(checkoutState.data, 'getCustomer').mockReturnValue(getCustomer()); + jest.spyOn(checkoutService, 'deinitializePayment').mockResolvedValue(checkoutState); + + defaultProps = { + checkoutService, + checkoutState, + paymentForm, + language: createLanguageService(), + onUnhandledError: jest.fn(), + }; + }); + + afterEach(() => { + jest.clearAllMocks(); + }); + + it('renders HostedPaymentMethod when PaypalPaymentsPro payment method has PAYMENT_TYPE_HOSTED type', () => { + const method = { + ...paymentMethod, + type: 'PAYMENT_TYPE_HOSTED', + }; + + render(); + + expect(screen.getByText(hostedPaymentMethodText)).toBeInTheDocument(); + }); + + it('renders HostedCreditCardPaymentMethod when PaypalPaymentsPro payment method has PAYMENT_TYPE_HOSTED type', () => { + const method = { + ...paymentMethod, + type: 'PAYMENT_TYPE_API', + }; + + render(); + + expect(screen.getByText(hostedCreditCardPaymentMethodText)).toBeInTheDocument(); + }); +}); diff --git a/packages/paypal-payments-pro-integration/src/PayPalPaymentsProPaymentMethod.tsx b/packages/paypal-payments-pro-integration/src/PayPalPaymentsProPaymentMethod.tsx new file mode 100644 index 0000000000..9778256610 --- /dev/null +++ b/packages/paypal-payments-pro-integration/src/PayPalPaymentsProPaymentMethod.tsx @@ -0,0 +1,49 @@ +import React, { type FunctionComponent } from 'react'; + +import { HostedCreditCardComponent } from '@bigcommerce/checkout/hosted-credit-card-integration'; +import { HostedPaymentComponent } from '@bigcommerce/checkout/hosted-payment-integration'; +import { + type PaymentMethodProps, + type PaymentMethodResolveId, + toResolvableComponent, +} from '@bigcommerce/checkout/payment-integration-api'; + +const PayPalPaymentsProPaymentMethod: FunctionComponent = ({ + method, + checkoutService, + checkoutState, + paymentForm, + language, + onUnhandledError, +}) => { + if (method.type === 'PAYMENT_TYPE_HOSTED') { + return ( + + ); + } + + return ( + + ); +}; + +export default toResolvableComponent( + PayPalPaymentsProPaymentMethod, + [{ id: 'paypal' }], +); diff --git a/packages/paypal-payments-pro-integration/src/index.ts b/packages/paypal-payments-pro-integration/src/index.ts index e69de29bb2..d542e94756 100644 --- a/packages/paypal-payments-pro-integration/src/index.ts +++ b/packages/paypal-payments-pro-integration/src/index.ts @@ -0,0 +1 @@ +export { default as PayPalPaymentsProPaymentMethod } from './PayPalPaymentsProPaymentMethod';