import {initializeOrg} from 'sentry-test/initializeOrg';
import {
render,
screen,
userEvent,
waitForElementToBeRemoved,
} from 'sentry-test/reactTestingLibrary';
import * as indicators from 'sentry/actionCreators/indicator';
import {FeatureFeedback, FeatureFeedbackProps} from 'sentry/components/featureFeedback';
import GlobalModal from 'sentry/components/globalModal';
import ModalStore from 'sentry/stores/modalStore';
import {RouteContext} from 'sentry/views/routeContext';
describe('FeatureFeedback', function () {
const {router} = initializeOrg();
function TestComponent({
feedbackTypes,
}: {
feedbackTypes?: FeatureFeedbackProps['feedbackTypes'];
}) {
return (
);
}
beforeAll(async function () {
// transpile the modal upfront so the test runs fast
await import('sentry/components/featureFeedback/feedbackModal');
});
async function openModal() {
expect(screen.getByText('Give Feedback')).toBeInTheDocument();
userEvent.click(screen.getByText('Give Feedback'));
expect(await screen.findByText('Select type of feedback')).toBeInTheDocument();
}
it('shows the modal on click', async function () {
render();
await openModal();
expect(
await screen.findByRole('heading', {name: 'Submit Feedback'})
).toBeInTheDocument();
});
it('submits modal on click', async function () {
jest.spyOn(indicators, 'addSuccessMessage');
render();
await openModal();
// Form fields
expect(screen.getByText('Select type of feedback')).toBeInTheDocument();
expect(screen.getByPlaceholderText('What did you expect?')).toBeInTheDocument();
// Form actions
expect(screen.getByRole('button', {name: 'Cancel'})).toBeInTheDocument();
expect(screen.getByRole('button', {name: 'Submit Feedback'})).toBeDisabled();
// User enters additional feedback message
userEvent.paste(
screen.getByPlaceholderText('What did you expect?'),
'this is a feedback message'
);
userEvent.keyboard('{enter}');
// Submit button is still disabled
expect(screen.getByRole('button', {name: 'Submit Feedback'})).toBeDisabled();
userEvent.click(screen.getByText('Select type of feedback'));
// Available feedback types
expect(screen.getByText("I don't like this feature")).toBeInTheDocument();
expect(screen.getByText('Other reason')).toBeInTheDocument();
expect(screen.getByText('I like this feature')).toBeInTheDocument();
// Select feedback type
userEvent.click(screen.getByText('I like this feature'));
// Submit button is now enabled because the required field was selected
expect(screen.getByRole('button', {name: 'Submit Feedback'})).toBeEnabled();
userEvent.click(screen.getByRole('button', {name: 'Submit Feedback'}));
expect(indicators.addSuccessMessage).toHaveBeenCalledWith(
'Thanks for taking the time to provide us feedback!'
);
});
it('renders provided feedbackTypes', async function () {
render(
);
await openModal();
userEvent.click(screen.getByText('Select type of feedback'));
// Available feedback types
expect(screen.getByText('Custom feedback type A')).toBeInTheDocument();
expect(screen.getByText('Custom feedback type B')).toBeInTheDocument();
});
it('Close modal on click', async function () {
render();
await openModal();
userEvent.click(screen.getByRole('button', {name: 'Cancel'}));
ModalStore.reset();
await waitForElementToBeRemoved(() =>
screen.queryByRole('heading', {name: 'Submit Feedback'})
);
});
});