import {Fragment} from 'react';
import {mountWithTheme} from 'sentry-test/enzyme';
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 = {}) =>
mountWithTheme(
{({showModal}) => (
Open
)}
);
const showModal = async wrapper => {
wrapper.find('[data-test-id="reveal"]').simulate('click');
await tick();
wrapper.update();
};
beforeEach(function () {
onAdvance = jest.fn();
onCloseModal = jest.fn();
});
it('shows the modal on click', async function () {
const wrapper = createWrapper();
// No modal showing
expect(wrapper.find('GlobalModal').props().visible).toEqual(false);
await showModal(wrapper);
// Modal is now showing
expect(wrapper.find('GlobalModal').props().visible).toEqual(true);
});
it('advances on click', async function () {
const wrapper = createWrapper();
await showModal(wrapper);
// Should start on the first step.
expect(wrapper.find('TourHeader h4').text()).toEqual(steps[0].title);
// Advance to the next step.
wrapper.find('Button[data-test-id="next-step"]').simulate('click');
// Should move to next step.
expect(wrapper.find('TourHeader h4').text()).toEqual(steps[1].title);
expect(onAdvance).toHaveBeenCalled();
});
it('shows step content', async function () {
const wrapper = createWrapper();
await showModal(wrapper);
// Should show title, image and actions
expect(wrapper.find('TourHeader h4').text()).toEqual(steps[0].title);
expect(wrapper.find('TourContent em[data-test-id="step-image"]')).toHaveLength(1);
expect(wrapper.find('TourContent a[data-test-id="step-action"]')).toHaveLength(1);
expect(wrapper.find('StepCounter').text()).toEqual('1 of 2');
});
it('last step shows done', async function () {
const wrapper = createWrapper();
await showModal(wrapper);
// Advance to the the last step.
wrapper.find('Button[data-test-id="next-step"]').simulate('click');
// Click the done
wrapper.find('Button[data-test-id="complete-tour"]').simulate('click');
// Wait for the ModalStore action to propagate.
await tick();
expect(onAdvance).toHaveBeenCalledTimes(1);
expect(onCloseModal).toHaveBeenCalledTimes(1);
});
it('last step shows doneText and uses doneUrl', async function () {
const props = {doneText: 'Finished', doneUrl: 'http://example.org'};
const wrapper = createWrapper(props);
await showModal(wrapper);
// Advance to the the last step.
wrapper.find('Button[data-test-id="next-step"]').simulate('click');
// Ensure button looks right
const button = wrapper.find('Button[data-test-id="complete-tour"]');
expect(button.text()).toEqual(props.doneText);
expect(button.props().href).toEqual(props.doneUrl);
// Click the done
button.simulate('click');
// Wait for the ModalStore action to propagate.
await tick();
expect(onCloseModal).toHaveBeenCalledTimes(1);
});
it('close button dismisses modal', async function () {
const wrapper = createWrapper();
await showModal(wrapper);
wrapper.find('CloseButton').simulate('click');
// Wait for the ModalStore action to propagate.
await tick();
expect(onCloseModal).toHaveBeenCalled();
});
});