import {Fragment} from 'react'; import {render, screen, userEvent} from 'sentry-test/reactTestingLibrary'; import GlobalModal from 'sentry/components/globalModal'; import FeatureTourModal from 'sentry/components/modals/featureTourModal'; const steps = [ { title: 'First', body: 'First step', image: Image, actions: ( additional action ), }, {title: 'Second', body: 'Second step'}, ]; describe('FeatureTourModal', function () { let onAdvance, onCloseModal; const createWrapper = (props = {}) => render( {({showModal}) => ( Open )} ); const showModal = () => { userEvent.click(screen.getByTestId('reveal')); }; beforeEach(function () { onAdvance = jest.fn(); onCloseModal = jest.fn(); }); it('shows the modal on click', function () { createWrapper(); // No modal showing expect(screen.queryByTestId('feature-tour')).not.toBeInTheDocument(); showModal(); // Modal is now showing expect(screen.getByTestId('feature-tour')).toBeInTheDocument(); }); it('advances on click', function () { createWrapper(); showModal(); // Should start on the first step. expect(screen.getByRole('heading')).toHaveTextContent(steps[0].title); // Advance to the next step. userEvent.click(screen.getByRole('button', {name: 'Next'})); // Should move to next step. expect(screen.getByRole('heading')).toHaveTextContent(steps[1].title); expect(onAdvance).toHaveBeenCalled(); }); it('shows step content', function () { createWrapper(); showModal(); // Should show title, image and actions expect(screen.getByRole('heading')).toHaveTextContent(steps[0].title); expect(screen.getByTestId('step-image')).toBeInTheDocument(); expect(screen.getByTestId('step-action')).toBeInTheDocument(); expect(screen.getByText('1 of 2')).toBeInTheDocument(); }); it('last step shows done', function () { createWrapper(); showModal(); // Advance to the the last step. userEvent.click(screen.getByRole('button', {name: 'Next'})); // Click the done userEvent.click(screen.getByRole('button', {name: 'Complete tour'})); // Wait for the ModalStore action to propagate. expect(onAdvance).toHaveBeenCalledTimes(1); expect(onCloseModal).toHaveBeenCalledTimes(1); }); it('last step shows doneText and uses doneUrl', function () { const props = {doneText: 'Finished', doneUrl: 'http://example.org'}; createWrapper(props); showModal(); // Advance to the the last step. userEvent.click(screen.getByRole('button', {name: 'Next'})); // Ensure button looks right const button = screen.getByRole('button', {name: 'Complete tour'}); expect(button).toHaveTextContent(props.doneText); expect(button).toHaveAttribute('href', props.doneUrl); // Click the done userEvent.click(button); // Wait for the ModalStore action to propagate. expect(onCloseModal).toHaveBeenCalledTimes(1); }); it('close button dismisses modal', function () { createWrapper(); showModal(); userEvent.click(screen.getByRole('button', {name: 'Close tour'})); // Wait for the ModalStore action to propagate. expect(onCloseModal).toHaveBeenCalled(); }); });