import '@testing-library/jest-dom'; import { useNFTContext } from '@/nft/components/NFTProvider'; import { fireEvent, render } from '@testing-library/react'; import { type Mock, afterEach, beforeEach, describe, expect, it, vi, } from 'vitest'; import { NFTVideo } from './NFTVideo'; vi.mock('@/nft/components/NFTProvider', () => ({ useNFTContext: vi.fn(), })); const mockAnimationUrl = 'http://example.com/video.mp4'; const mockImageUrl = 'http://example.com/image.jpg'; describe('NFTVideo', () => { beforeEach(() => { (useNFTContext as Mock).mockReturnValue({ animationUrl: mockAnimationUrl, imageUrl: mockImageUrl, }); }); afterEach(() => { vi.clearAllMocks(); }); it('should render default SVG when no animationUrl is provided', () => { (useNFTContext as Mock).mockReturnValue({ animationUrl: null, imageUrl: mockImageUrl, }); const { getByRole } = render(); expect(getByRole('img')).toBeInTheDocument(); }); it('should render video element when animationUrl is provided', () => { const { getByTestId } = render(); expect(getByTestId('ockNFTVideo')).toBeInTheDocument(); }); it('should call onLoading when video starts loading', () => { const onLoading = vi.fn(); const { getByTestId } = render(); fireEvent.loadStart(getByTestId('ockNFTVideo')); expect(onLoading).toHaveBeenCalledWith(mockAnimationUrl); }); it('should call onLoaded when video has loaded', () => { const onLoaded = vi.fn(); const { getByTestId } = render(); fireEvent.loadedData(getByTestId('ockNFTVideo')); expect(onLoaded).toHaveBeenCalled(); }); it('should handle error when video fails to load', () => { const onError = vi.fn(); const { getByTestId } = render(); fireEvent.error(getByTestId('ockNFTVideo')); expect(onError).toHaveBeenCalledWith({ error: 'error', code: 'NmNVc01', message: 'Error loading video', }); }); it('should handle string error when video fails to load', () => { const onError = vi.fn(); const { getByTestId } = render(); getByTestId('ockNFTVideo').onerror?.('string error'); expect(onError).toHaveBeenCalledWith({ error: 'string error', code: 'NmNVc01', message: 'Error loading video', }); }); it('should not propagate click event on video', () => { const parentClick = vi.fn(); const { getByTestId } = render( , ); fireEvent.click(getByTestId('ockNFTVideo')); expect(parentClick).not.toHaveBeenCalled(); }); });