import React, { useEffect, useState } from 'react'; import type { SharedValue } from 'react-native-reanimated'; import { render, screen, userEvent, waitFor } from '@testing-library/react-native'; import { LocalMessage } from 'stream-chat'; import { ImageGalleryHeader as ImageGalleryHeaderDefault } from '../../../components/ImageGallery/components/ImageGalleryHeader'; import { ImageGalleryContext, ImageGalleryContextValue, } from '../../../contexts/imageGalleryContext/ImageGalleryContext'; import * as overlayContext from '../../../contexts/overlayContext/OverlayContext'; import { OverlayProvider } from '../../../contexts/overlayContext/OverlayProvider'; import { generateImageAttachment } from '../../../mock-builders/generator/attachment'; import { generateMessage } from '../../../mock-builders/generator/message'; import { ImageGalleryStateStore } from '../../../state-store/image-gallery-state-store'; import { ImageGallery, ImageGalleryProps } from '../ImageGallery'; jest.mock('../../../native.ts', () => { const { View } = require('react-native'); return { isFileSystemAvailable: jest.fn(() => true), isImageMediaLibraryAvailable: jest.fn(() => true), isShareImageAvailable: jest.fn(() => true), isVideoPlayerAvailable: jest.fn(() => true), NativeHandlers: { Video: View, }, }; }); const ImageGalleryComponent = (props: ImageGalleryProps) => { const [imageGalleryStateStore] = useState(() => new ImageGalleryStateStore()); const attachment = generateImageAttachment(); imageGalleryStateStore.openImageGallery({ messages: [generateMessage({ attachments: [attachment] }) as unknown as LocalMessage], selectedAttachmentUrl: attachment.image_url, }); useEffect(() => { const unsubscribe = imageGalleryStateStore.registerSubscriptions(); return () => { unsubscribe(); }; }, [imageGalleryStateStore]); return ( }}> ); }; describe('ImageGalleryHeader', () => { it('render image gallery header component with default header elements', async () => { render(); await waitFor(() => { expect(screen.getByLabelText('Hide Overlay')).toBeTruthy(); }); }); it('should trigger the hideOverlay function on button onPress', async () => { const setOverlayMock = jest.fn(); const user = userEvent.setup(); jest.spyOn(overlayContext, 'useOverlayContext').mockImplementation(() => ({ setOverlay: setOverlayMock, })); render(); await waitFor(() => { expect(screen.getByLabelText('Hide Overlay')).toBeTruthy(); }); await user.press(screen.getByLabelText('Hide Overlay')); await waitFor(() => { expect(setOverlayMock).toHaveBeenCalledWith('none'); }); }); });