import { render, screen } from '@testing-library/react'; import '@testing-library/jest-dom'; import { type Mock, beforeEach, describe, expect, it, vi } from 'vitest'; import { getSwapMessage } from '../utils/getSwapMessage'; import { SwapMessage } from './SwapMessage'; import { useSwapContext } from './SwapProvider'; vi.mock('./SwapProvider', () => ({ useSwapContext: vi.fn(), })); vi.mock('../utils/getSwapMessage', () => ({ getSwapMessage: vi.fn(), })); const useSwapContextMock = useSwapContext as Mock; describe('SwapMessage', () => { const mockGetSwapMessage = getSwapMessage as Mock; beforeEach(() => { mockGetSwapMessage.mockClear(); }); it('should render message returned by getSwapMessage', () => { const mockMessage = 'Swap message'; const mockContext = { to: {}, from: {}, lifecycleStatus: { statusName: 'init', statusData: null }, }; useSwapContextMock.mockReturnValue(mockContext); mockGetSwapMessage.mockReturnValue(mockMessage); render(); const messageDiv = screen.getByTestId('ockSwapMessage_Message'); expect(messageDiv).toHaveTextContent(mockMessage); expect(messageDiv).toHaveClass('test-class'); }); it('should render with error message', () => { const mockMessage = 'Error occurred'; const mockContext = { to: {}, from: {}, lifecycleStatus: { statusName: 'error', statusData: { message: 'Error occurred' }, }, }; useSwapContextMock.mockReturnValue(mockContext); mockGetSwapMessage.mockReturnValue(mockMessage); render(); const messageDiv = screen.getByTestId('ockSwapMessage_Message'); expect(messageDiv).toHaveTextContent(mockMessage); }); it('should render with loading message in transactionPending status', () => { const mockMessage = 'Loading...'; const mockContext = { to: {}, from: {}, lifecycleStatus: { statusName: 'transactionPending', statusData: null }, }; useSwapContextMock.mockReturnValue(mockContext); mockGetSwapMessage.mockReturnValue(mockMessage); render(); const messageDiv = screen.getByTestId('ockSwapMessage_Message'); expect(messageDiv).toHaveTextContent(mockMessage); }); it('should render with loading message in transactionApproved status', () => { const mockMessage = 'Loading...'; const mockContext = { to: {}, from: {}, lifecycleStatus: { statusName: 'transactionApproved', statusData: null }, }; useSwapContextMock.mockReturnValue(mockContext); mockGetSwapMessage.mockReturnValue(mockMessage); render(); const messageDiv = screen.getByTestId('ockSwapMessage_Message'); expect(messageDiv).toHaveTextContent(mockMessage); }); it('should apply additional className correctly', () => { const mockContext = { to: {}, from: {}, lifecycleStatus: { statusName: 'init', statusData: null }, }; useSwapContextMock.mockReturnValue(mockContext); mockGetSwapMessage.mockReturnValue(''); const customClass = 'custom-class'; render(); const messageDiv = screen.getByTestId('ockSwapMessage_Message'); expect(messageDiv).toHaveClass(customClass); }); it('should set isMissingRequiredFields to true when reflected in statusData', () => { const mockLifecycleStatus = { statusName: 'init', statusData: { isMissingRequiredField: true }, }; const mockContext = { to: { amount: 1, token: 'ETH' }, from: { amount: null, token: 'DAI' }, address: '0x123', lifecycleStatus: mockLifecycleStatus, }; useSwapContextMock.mockReturnValue(mockContext); render(); expect(mockGetSwapMessage).toHaveBeenCalledWith({ address: '0x123', from: { amount: null, token: 'DAI' }, lifecycleStatus: mockLifecycleStatus, to: { amount: 1, token: 'ETH' }, }); }); it('should handle custom render', () => { const mockContext = { to: {}, from: {}, lifecycleStatus: { statusName: 'init', statusData: null }, }; useSwapContextMock.mockReturnValue(mockContext); mockGetSwapMessage.mockReturnValue(''); render(
Custom Render
} />); expect(screen.getByText('Custom Render')).toBeInTheDocument(); }); });