import React from 'react';
import configureMockStore from 'redux-mock-store';
import thunk from 'redux-thunk';
import { waitFor } from '@testing-library/react';
import { TransactionStatus } from '../../../../shared/constants/transaction';
import { GAS_LIMITS } from '../../../../shared/constants/gas';
import { renderWithProvider } from '../../../../test/lib/render-helpers';
import mockState from '../../../../test/data/mock-state.json';
import TransactionListItemDetails from '.';
jest.mock('../../../store/actions.ts', () => ({
tryReverseResolveAddress: () => jest.fn(),
getGasFeeEstimatesAndStartPolling: jest.fn().mockResolvedValue(),
addPollingTokenToAppState: jest.fn(),
}));
let mockGetCustodianTransactionDeepLink = jest.fn();
jest.mock('../../../store/institutional/institution-background', () => ({
mmiActionsFactory: () => ({
getCustodianTransactionDeepLink: () => mockGetCustodianTransactionDeepLink,
}),
}));
describe('TransactionListItemDetails Component', () => {
const transaction = {
history: [],
id: 1,
status: TransactionStatus.confirmed,
txParams: {
from: '0x1',
gas: GAS_LIMITS.SIMPLE,
gasPrice: '0x3b9aca00',
nonce: '0xa4',
to: '0x2',
value: '0x2386f26fc10000',
},
metadata: {
note: 'some note',
},
custodyId: '1',
};
const transactionGroup = {
transactions: [transaction],
primaryTransaction: transaction,
initialTransaction: transaction,
nonce: '0xa4',
hasRetried: false,
hasCancelled: false,
};
const rpcPrefs = {
blockExplorerUrl: 'https://customblockexplorer.com/',
};
const blockExplorerLinkText = {
firstPart: 'addBlockExplorer',
secondPart: '',
};
const props = {
onClose: jest.fn(),
title: 'Test Transaction Details',
recipientAddress: '0xAddress',
senderAddress: '0x0dcd5d886577d5081b0c52e242ef29e70be3e7bc',
tryReverseResolveAddress: jest.fn(),
transactionGroup,
transactionStatus: () =>
,
blockExplorerLinkText,
rpcPrefs,
};
it('should render title with title prop', async () => {
const mockStore = configureMockStore([thunk])(mockState);
const { queryByText } = renderWithProvider(
,
mockStore,
);
await waitFor(() => {
expect(queryByText(props.title)).toBeInTheDocument();
});
});
describe('Retry button', () => {
it('should render retry button with showRetry prop', () => {
const retryProps = {
...props,
showRetry: true,
};
const mockStore = configureMockStore([thunk])(mockState);
const { queryByTestId } = renderWithProvider(
,
mockStore,
);
expect(queryByTestId('rety-button')).toBeInTheDocument();
});
});
describe('Cancel button', () => {
it('should render cancel button with showCancel prop', () => {
const retryProps = {
...props,
showCancel: true,
};
const mockStore = configureMockStore([thunk])(mockState);
const { queryByTestId } = renderWithProvider(
,
mockStore,
);
expect(queryByTestId('cancel-button')).toBeInTheDocument();
});
});
describe('Speedup button', () => {
it('should render speedup button with showSpeedUp prop', () => {
const retryProps = {
...props,
showSpeedUp: true,
};
const mockStore = configureMockStore([thunk])(mockState);
const { queryByTestId } = renderWithProvider(
,
mockStore,
);
expect(queryByTestId('speedup-button')).toBeInTheDocument();
});
});
describe('Institutional', () => {
it('should render correctly if custodyTransactionDeepLink has a url', async () => {
mockGetCustodianTransactionDeepLink = jest
.fn()
.mockReturnValue({ url: 'https://url.com' });
const mockStore = configureMockStore([thunk])(mockState);
renderWithProvider(, mockStore);
await waitFor(() => {
const custodianViewButton = document.querySelector(
'[data-original-title="View in custodian app"]',
);
// Assert that the custodian view button is rendered
expect(custodianViewButton).toBeInTheDocument();
});
});
it('should render correctly if transactionNote is provided', async () => {
const newTransaction = {
...transaction,
metadata: {
note: 'some note',
},
custodyId: '1',
};
const newTransactionGroup = {
...transactionGroup,
transactions: [newTransaction],
primaryTransaction: newTransaction,
initialTransaction: newTransaction,
};
const mockStore = configureMockStore([thunk])(mockState);
const { queryByText } = renderWithProvider(
,
mockStore,
);
await waitFor(() => {
expect(queryByText('some note')).toBeInTheDocument();
});
});
});
});