import React, { ReactElement } from 'react'; import { render } from '@testing-library/react-native'; import { IN_APP_MESSAGING_TEST_ID } from '../../../constants'; import CarouselMessage from '../CarouselMessage'; import { defaultStyle } from '../styles'; import { ReactTestRendererJSON } from 'react-test-renderer'; jest.mock('../../../../primitives', () => ({ Carousel: 'Carousel' })); jest.mock('../../MessageWrapper', () => ({ MessageWrapper: 'MessageWrapper' })); jest.mock('../CarouselMessageItem', () => 'CarouselMessageItem'); const baseProps = { layout: 'CAROUSEL' as const, data: [], }; describe('CarouselMessage', () => { it('renders as expected', () => { const { toJSON, getByTestId } = render(); expect(toJSON()).toMatchSnapshot(); const carousel = getByTestId(IN_APP_MESSAGING_TEST_ID.CAROUSEL); expect(carousel).toBeDefined(); expect(carousel.props.data).toStrictEqual(baseProps.data); expect(carousel.props.indicatorActiveStyle).toContain( defaultStyle.pageIndicatorActive ); expect(carousel.props.indicatorInactiveStyle).toContain( defaultStyle.pageIndicatorInactive ); }); it('renders as expected with minimal props', () => { const { toJSON, getByTestId } = render( ); expect(toJSON()).toMatchSnapshot(); const carousel = getByTestId(IN_APP_MESSAGING_TEST_ID.CAROUSEL); expect(carousel).toBeDefined(); expect(carousel.props.data).toEqual([]); expect(carousel.props.indicatorActiveStyle).toContain( defaultStyle.pageIndicatorActive ); expect(carousel.props.indicatorInactiveStyle).toContain( defaultStyle.pageIndicatorInactive ); }); it('allows style overrides', () => { const overrides = { pageIndicatorActive: { backgroundColor: 'red' }, pageIndicatorInactive: { backgroundColor: 'blue' }, }; const { toJSON, getByTestId } = render( ); expect(toJSON()).toMatchSnapshot(); const carousel = getByTestId(IN_APP_MESSAGING_TEST_ID.CAROUSEL); expect(carousel.props.indicatorActiveStyle).toContain( overrides.pageIndicatorActive ); expect(carousel.props.indicatorInactiveStyle).toContain( overrides.pageIndicatorInactive ); }); it('renders items', () => { const { getByTestId } = render(); const carousel = getByTestId(IN_APP_MESSAGING_TEST_ID.CAROUSEL); const image = { src: 'image-src' }; const Item = () => ( carousel.props as { renderItem: (data: any) => ReactElement } ).renderItem({ item: { image }, }); const { toJSON } = render(); const carouselMessageItem = toJSON(); expect(carouselMessageItem).toMatchSnapshot(); const { props } = toJSON() as ReactTestRendererJSON; expect(props.layout).toEqual(baseProps.layout); expect(props.image).toEqual({ src: 'image-src' }); }); });