diff --git a/packages/cashier/src/Components/__tests__/on-ramp-provider-popup.spec.js b/packages/cashier/src/Components/__tests__/on-ramp-provider-popup.spec.js new file mode 100644 index 000000000000..4bb4a074a727 --- /dev/null +++ b/packages/cashier/src/Components/__tests__/on-ramp-provider-popup.spec.js @@ -0,0 +1,152 @@ +import React from 'react'; +import { fireEvent, getByTestId, render, screen } from '@testing-library/react'; +import OnRampProviderPopup from '../on-ramp-provider-popup'; + +jest.mock('Stores/connect', () => ({ + __esModule: true, + default: 'mockedDefaultExport', + connect: () => Component => Component, +})); + +jest.mock('@deriv/components', () => ({ + ...jest.requireActual('@deriv/components'), + Loading: () =>
Loading
, +})); + +describe('', () => { + const props = { + api_error: '', + deposit_address: 'tb1qhux20f7h42ya9nqdntl6r9p7p264a2ct8t3n6p', + is_deposit_address_loading: false, + is_deposit_address_popover_open: false, + is_requesting_widget_html: false, + selected_provider: { + name: 'Changelly', + should_show_deposit_address: true, + onMountWidgetContainer: jest.fn(), + }, + should_show_dialog: false, + should_show_widget: false, + widget_error: '', + widget_html: 'Widget HTML', + onClickCopyDepositAddress: jest.fn(), + onClickDisclaimerContinue: jest.fn(), + onClickGoToDepositPage: jest.fn(), + setIsOnRampModalOpen: jest.fn(), + }; + + it('should not render component', () => { + render(); + + expect(screen.queryByTestId('dti_on-ramp_popup')).not.toBeInTheDocument(); + }); + + it('should show loader', () => { + const { rerender } = render(); + + expect(screen.getByText('Loading')).toBeInTheDocument(); + + rerender(); + + expect(screen.getByText('Loading')).toBeInTheDocument(); + }); + + it('should show widget', () => { + const { rerender } = render(); + + expect(screen.getByText('Widget error')).toBeInTheDocument(); + + rerender(); + + expect(screen.getByText('Widget HTML')).toBeInTheDocument(); + }); + + it('should show dialog with proper messages and buttons', () => { + const { rerender } = render(); + + expect(screen.getByText('Please go to the Deposit page to get an address.')).toBeInTheDocument(); + + rerender(); + + expect( + screen.getByText( + 'Please go to the Deposit page to generate an address. Then come back here to continue with your transaction.' + ) + ).toBeInTheDocument(); + expect(screen.getByRole('button', { name: 'Cancel' })).toBeInTheDocument(); + expect(screen.getByRole('button', { name: 'Go to Deposit page' })).toBeInTheDocument(); + }); + + it('should trigger onClick callbacks in dialog when the user clicks "Cancel" and "Go to Deposit page" buttons', () => { + const { rerender } = render(); + const cancel_btn = screen.getByRole('button', { name: 'Cancel' }); + fireEvent.click(cancel_btn); + + expect(props.setIsOnRampModalOpen).toHaveBeenCalledTimes(1); + + rerender(); + const go_to_deposit_page_btn = screen.getByRole('button', { name: 'Go to Deposit page' }); + fireEvent.click(go_to_deposit_page_btn); + + expect(props.onClickGoToDepositPage).toHaveBeenCalledTimes(1); + }); + + it('should show proper messages and buttons', () => { + render(); + + expect( + screen.getByText( + "Please copy the crypto address you see below. You'll need it to deposit your cryptocurrency." + ) + ).toBeInTheDocument(); + expect( + screen.getByText('This address can only be used ONCE. Please copy a new one for your next transaction.') + ).toBeInTheDocument(); + expect(screen.getByText('Disclaimer')).toBeInTheDocument(); + expect( + screen.getByText( + "By clicking 'Continue' you will be redirected to Changelly, a third-party payment service provider. Please note that Deriv is not responsible for the content or services provided by Changelly. If you encounter any issues related to Changelly services, you must contact Changelly directly." + ) + ).toBeInTheDocument(); + expect(screen.getByRole('button', { name: 'Cancel' })).toBeInTheDocument(); + expect(screen.getByRole('button', { name: 'Continue' })).toBeInTheDocument(); + }); + + it('should trigger onClick callback when the user clicks on copy icon', () => { + render(); + + const copy_icon = screen.getByTestId('dti_deposit_address_icon'); + fireEvent.click(copy_icon); + + expect(props.onClickCopyDepositAddress).toHaveBeenCalledTimes(1); + }); + + it('should trigger onFocus method when the user clicks on deposit address field', () => { + render(); + + const deposit_address_input = screen.getByRole('textbox'); + expect(fireEvent.focus(deposit_address_input)).toBeTrue(); + }); + + it('should show "Copied!" message', () => { + render(); + + expect(screen.getByText('Copied!')).toBeInTheDocument(); + }); + + it('should trigger onClick calbacks when the user clicks on "Cancel" and "Continue" buttons', () => { + const { rerender } = render(); + + const cancel_btn = screen.getByRole('button', { name: 'Cancel' }); + fireEvent.click(cancel_btn); + + expect(props.setIsOnRampModalOpen).toHaveBeenCalledTimes(1); + + rerender(); + + const continue_btn = screen.getByRole('button', { name: 'Continue' }); + fireEvent.click(continue_btn); + + expect(props.onClickDisclaimerContinue).toHaveBeenCalledTimes(1); + }); +}); diff --git a/packages/cashier/src/Components/on-ramp-provider-popup.jsx b/packages/cashier/src/Components/on-ramp-provider-popup.jsx index 3f3a73598aad..5baea6c7622a 100644 --- a/packages/cashier/src/Components/on-ramp-provider-popup.jsx +++ b/packages/cashier/src/Components/on-ramp-provider-popup.jsx @@ -79,7 +79,7 @@ const OnRampProviderPopup = ({ } return ( -
+
{selected_provider.should_show_deposit_address && (
@@ -109,6 +109,7 @@ const OnRampProviderPopup = ({ /> { if (!icon) return null; @@ -37,6 +50,7 @@ const Icon = React.forwardRef( 'dc-icon--black': color === 'black', 'dc-icon--orange': color === 'orange', })} + data-testid={data_testid} height={height || size} id={id} width={width || size}