import { toChecksumHexAddress } from '@metamask/controller-utils'; import { fireEvent, screen } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; import React from 'react'; import { showPrivateKey } from '../../../../app/_locales/en/messages.json'; import mockState from '../../../../test/data/mock-state.json'; import { renderWithProvider } from '../../../../test/jest'; import { shortenAddress } from '../../../helpers/utils/util'; import { clearAccountDetails, exportAccount, hideWarning, setAccountDetailsAddress, } from '../../../store/actions'; import configureStore from '../../../store/store'; import { AccountDetailsKey } from './account-details-key'; import { AccountDetails } from '.'; jest.mock('../../../store/actions.ts'); describe('AccountDetails', () => { const address = '0x0dcd5d886577d5081b0c52e242ef29e70be3e7bc'; const mockClearAccountDetails = jest.fn(); const mockExportAccount = jest.fn().mockResolvedValue(true); const mockHideWarning = jest.fn(); const mockSetAccountDetailsAddress = jest.fn(); beforeEach(() => { clearAccountDetails.mockReturnValue(mockClearAccountDetails); exportAccount.mockReturnValue(mockExportAccount); hideWarning.mockReturnValue(mockHideWarning); setAccountDetailsAddress.mockReturnValue(mockSetAccountDetailsAddress); }); afterEach(() => jest.clearAllMocks()); function render(props = {}, storeModifications = {}) { const store = configureStore({ metamask: { ...mockState.metamask, }, ...storeModifications, }); const allProps = { address, ...props }; return renderWithProvider(, store); } it('should set account label when changing default account label', () => { render(); const editButton = screen.getByTestId('editable-label-button'); fireEvent.click(editButton); const editableInput = screen.getByPlaceholderText('Account name'); const newAccountLabel = 'New Label'; fireEvent.change(editableInput, { target: { value: newAccountLabel } }); expect(editableInput).toHaveAttribute('value', newAccountLabel); }); it('shows export private key contents and password field when clicked', () => { const { queryByText, queryByPlaceholderText } = render(); const exportPrivateKeyButton = queryByText(showPrivateKey.message); fireEvent.click(exportPrivateKeyButton); expect( queryByText(shortenAddress(toChecksumHexAddress(address))), ).toBeInTheDocument(); expect(queryByText('Show private key')).toBeInTheDocument(); expect(queryByPlaceholderText('Password')).toBeInTheDocument(); }); it('attempts to validate password when submitted', async () => { const password = 'password'; const { queryByPlaceholderText, queryByText } = render(); const exportPrivateKeyButton = queryByText(showPrivateKey.message); fireEvent.click(exportPrivateKeyButton); queryByPlaceholderText('Password').focus(); await userEvent.keyboard(password); fireEvent.click(queryByText('Confirm')); expect(exportAccount).toHaveBeenCalledWith( password, address, expect.any(Function), expect.any(Function), ); }); it('displays the private key when sent in props', () => { const samplePrivateKey = '8675309'; const { queryByText } = renderWithProvider( , ); expect(queryByText(samplePrivateKey)).toBeInTheDocument(); }); it('should call AccountDetails.onClose()', () => { render(); fireEvent.click(screen.getByLabelText('Close')); expect(screen.queryByText('Account 1')).toBeNull(); }); });