diff --git a/packages/account/src/Components/icon-message-list/__tests__/icon-message-list.spec.tsx b/packages/account/src/Components/icon-message-list/__tests__/icon-message-list.spec.tsx index 2591e61a77ff..ef1733cf3e76 100644 --- a/packages/account/src/Components/icon-message-list/__tests__/icon-message-list.spec.tsx +++ b/packages/account/src/Components/icon-message-list/__tests__/icon-message-list.spec.tsx @@ -1,6 +1,8 @@ import React from 'react'; -import { fireEvent, render, screen } from '@testing-library/react'; +import { render, screen } from '@testing-library/react'; +import userEvent from '@testing-library/user-event'; import { Icon } from '@deriv/components'; +import { StoreProvider, mockStore } from '@deriv/stores'; import IconMessageList from '../icon-message-list'; jest.mock('@deriv/components', () => { @@ -11,67 +13,61 @@ jest.mock('@deriv/components', () => { }; }); describe('', () => { - const messages_list = ['Sample Text1', 'Sample Text2', 'Sample Text3', 'Sample Text4']; + const messages_list = ['DataComparisonDocumentNumbers', 'CompromisedDocument', 'VisualAuthenticityFonts']; + + const mock_props: React.ComponentProps = { + icon: , + message: 'Lorem Ipsom', + message_list: messages_list, + onContinue: jest.fn(), + }; + + const store_config = mockStore({ ui: { is_desktop: true } }); + + const renderComponent = ({ props = mock_props, store = store_config }) => + render( + + + + ); + it('should render IconMessageList component', () => { - render(); + renderComponent({}); expect(screen.getByTestId('dt_icon_message_list')).toBeInTheDocument(); }); it('should render icon passed to the component', () => { - render(} />); - expect(screen.getByTestId('mocked_icon')).toBeInTheDocument(); + renderComponent({}); + expect(screen.getByText('sampleIcon')).toBeInTheDocument(); + expect(screen.getByText('IcAlertDanger')).toBeInTheDocument(); }); + it('should show message passed to the component', () => { - render(); + renderComponent({}); expect(screen.getByText(/lorem ipsom/i)).toBeInTheDocument(); }); - it('when the length of message_list is less than 3, it should show messages with icons ', () => { - render(); - expect(screen.getByText(/Sample Text1/i)).toBeInTheDocument(); - expect(screen.getByText(/Sample Text2/i)).toBeInTheDocument(); - expect(screen.getAllByText(/icclosecircle/i).length).toBe(2); - }); - - it('should show first 3 msgs and show_more_btn when the message_list is more than 3', () => { - render(); - expect(screen.getByText(/sample text1/i)).toBeInTheDocument(); - expect(screen.getByText(/sample text2/i)).toBeInTheDocument(); - expect(screen.getByText(/sample text3/i)).toBeInTheDocument(); - expect(screen.queryByText(/sample text4/i)).not.toBeInTheDocument(); - expect( - screen.getByRole('button', { - name: /show more/i, - }) - ).toBeInTheDocument(); - expect( - screen.queryByRole('button', { - name: /show less/i, - }) - ).not.toBeInTheDocument(); - }); - - it('should show all messages and show_less_btn when show_more btn is clicked', () => { - render(); - - const show_more_btn = screen.getByRole('button', { - name: /show more/i, - }); - fireEvent.click(show_more_btn); - expect(screen.getByText(/sample text1/i)).toBeInTheDocument(); - expect(screen.getByText(/sample text2/i)).toBeInTheDocument(); - expect(screen.getByText(/sample text3/i)).toBeInTheDocument(); - expect(screen.getByText(/sample text4/i)).toBeInTheDocument(); - expect(screen.queryByRole('button', { name: /show less/i })).toBeInTheDocument(); - expect(screen.queryByRole('button', { name: /show more/i })).not.toBeInTheDocument(); + it('should render the messages based on Onfido Error codes', () => { + const new_props = { + ...mock_props, + message_list: ['DataComparisonDocumentNumbers', 'CompromisedDocument'], + }; + renderComponent({ props: new_props }); + expect(screen.getByText('Your document appears to be invalid.')).toBeInTheDocument(); + expect(screen.getByText('Your document failed our verification checks.')).toBeInTheDocument(); }); it('should show continue_btn if OnContinue is passed', () => { const onContinuefn = jest.fn(); - render(); - const upload_btn = screen.queryByRole('button', { name: /upload document/i }); + const new_props = { + ...mock_props, + messages_list: ['DataComparisonDocumentNumbers'], + onContinue: onContinuefn, + }; + renderComponent({ props: new_props }); + const upload_btn = screen.queryByRole('button', { name: /verify again/i }); expect(upload_btn).toBeInTheDocument(); - fireEvent.click(upload_btn); + userEvent.click(upload_btn); expect(onContinuefn).toHaveBeenCalled(); }); }); diff --git a/packages/account/src/Components/icon-message-list/__tests__/list-item.spec.tsx b/packages/account/src/Components/icon-message-list/__tests__/list-item.spec.tsx new file mode 100644 index 000000000000..5eae8fece439 --- /dev/null +++ b/packages/account/src/Components/icon-message-list/__tests__/list-item.spec.tsx @@ -0,0 +1,26 @@ +import React from 'react'; +import { render, screen } from '@testing-library/react'; +import ListItem from '../list-item'; +import { StoreProvider, mockStore } from '@deriv/stores'; + +describe('', () => { + const store_config = mockStore({}); + + const renderComponent = (props: React.ComponentProps) => + render( + + + + ); + + it('should render ListItem component', () => { + renderComponent({ text: 'test' }); + expect(screen.getByText('test')).toBeInTheDocument(); + }); + + it('should render ListItem component with index', () => { + renderComponent({ text: 'test', index: 1 }); + expect(screen.getByText('1.')).toBeInTheDocument(); + expect(screen.getByText('test')).toBeInTheDocument(); + }); +}); diff --git a/packages/account/src/Components/icon-message-list/icon-message-list.tsx b/packages/account/src/Components/icon-message-list/icon-message-list.tsx index 495c9e6a34e8..ea2a6ba997fd 100644 --- a/packages/account/src/Components/icon-message-list/icon-message-list.tsx +++ b/packages/account/src/Components/icon-message-list/icon-message-list.tsx @@ -1,44 +1,27 @@ import React from 'react'; import classNames from 'classnames'; -import { localize } from '@deriv/translations'; -import { Div100vhContainer, Text, Button, Icon, ThemedScrollbars } from '@deriv/components'; -import { isDesktop, isMobile } from '@deriv/shared'; +import { Div100vhContainer, Text, Button, ThemedScrollbars, Icon } from '@deriv/components'; +import { getOnfidoError } from '@deriv/shared'; +import { observer, useStore } from '@deriv/stores'; +import { Localize } from '@deriv/translations'; +import ListItem from './list-item'; -type TListItem = { - text?: string; -}; - -type TMessage_list = { - message_list?: string[]; -}; - -type TIconMessageList = TMessage_list & { - className: string; +type TIconMessageList = { + className?: string; icon: React.ReactElement; message: string; + message_list: Array; onContinue: () => void; }; -const ListItem = ({ text }: TListItem) => ( -
-
- -
-
- - {text} - -
-
-); - -const IconMessageList = ({ className, icon, message, message_list = [], onContinue }: Partial) => { - const has_maximum_list = message_list.length > 3; +const IconMessageList = observer(({ className, icon, message, message_list = [], onContinue }: TIconMessageList) => { + const { ui } = useStore(); + const { is_mobile, is_desktop } = ui; return ( - +
{message} {message_list && (
- {has_maximum_list ? ( - - ) : ( - message_list.map((text, idx) => ) - )} +
+
+ +
+
+ {message_list.length < 2 ? ( + + ) : ( + message_list.map((text, idx) => ( + + )) + )} +
+
)} {onContinue && ( @@ -81,49 +78,15 @@ const IconMessageList = ({ className, icon, message, message_list = [], onContin className='account-management__continue' onClick={onContinue} large - text={localize('Upload Document')} primary - /> + > + + )}
); -}; - -const MaximumList = ({ message_list }: TMessage_list) => { - const [show_more, setShowMore] = React.useState(false); - const maximum_list = message_list.slice(0, 3); - - return show_more ? ( - - {message_list.map(text => ( - - ))} -