import { fireEvent, render, screen, waitFor } from '@testing-library/react';
import { type Mock, beforeEach, describe, expect, it, vi } from 'vitest';
import { useAppchainBridgeContext } from './AppchainBridgeProvider';
import { AppchainBridgeResumeTransaction } from './AppchainBridgeResumeTransaction';
vi.mock('./AppchainBridgeProvider', () => ({
useAppchainBridgeContext: vi.fn(),
}));
describe('AppchainBridgeResumeTransaction', () => {
const mockHandleResumeTransaction = vi.fn();
const mockSetIsResumeTransactionModalOpen = vi.fn();
beforeEach(() => {
vi.resetAllMocks();
(useAppchainBridgeContext as Mock).mockReturnValue({
handleResumeTransaction: mockHandleResumeTransaction,
setIsResumeTransactionModalOpen: mockSetIsResumeTransactionModalOpen,
});
});
it('renders the component with initial state', () => {
render();
expect(
screen.getByRole('heading', { name: 'Resume Transaction' }),
).toBeInTheDocument();
expect(screen.getByText('Transaction hash')).toBeInTheDocument();
expect(screen.getByPlaceholderText('0x...')).toBeInTheDocument();
});
it('handles back button click', () => {
render();
const backButton = screen.getByLabelText('Back button');
fireEvent.click(backButton);
expect(mockSetIsResumeTransactionModalOpen).toHaveBeenCalledWith(false);
});
it('updates transaction hash input value', () => {
render();
const input = screen.getByPlaceholderText('0x...');
fireEvent.change(input, {
target: {
value:
'0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef',
},
});
expect(input).toHaveValue(
'0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef',
);
});
it('shows validation message when transaction hash is invalid', async () => {
(useAppchainBridgeContext as Mock).mockReturnValue({
handleResumeTransaction: mockHandleResumeTransaction,
setIsResumeTransactionModalOpen: mockSetIsResumeTransactionModalOpen,
});
render();
const input = screen.getByPlaceholderText('0x...');
fireEvent.change(input, { target: { value: '0xinvalid' } });
const resumeButton = screen.getByText('Resume Transaction', {
selector: 'div',
});
fireEvent.click(resumeButton);
await waitFor(() => {
expect(
screen.getByText('Please enter a valid transaction hash'),
).toBeInTheDocument();
});
});
it('handles resume transaction with valid hash', () => {
render();
const input = screen.getByPlaceholderText('0x...');
fireEvent.change(input, {
target: {
value:
'0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef',
},
});
const resumeButton = screen.getByText('Resume Transaction', {
selector: 'div',
});
fireEvent.click(resumeButton);
expect(mockHandleResumeTransaction).toHaveBeenCalledWith(
'0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef',
);
});
it('applies correct styles to input field', () => {
render();
const input = screen.getByPlaceholderText('0x...');
expect(input).toHaveClass(
'w-full',
'border-none',
'focus:border-none',
'focus:outline-none',
'focus:ring-0',
);
});
});