import {Fragment} from 'react'; import { render, renderGlobalModal, screen, userEvent, } from 'sentry-test/reactTestingLibrary'; import ModalStore from 'sentry/stores/modalStore'; import AdminConfirmationModal from 'admin/components/adminConfirmationModal'; describe('Admin confirmation modal', function () { const mockOnConfirm = jest.fn(); const mockOnCancel = jest.fn(); beforeEach(() => { ModalStore.reset(); jest.clearAllMocks(); }); const setTicketURL = async (url: string) => { await userEvent.clear(screen.getByRole('textbox', {name: 'TicketURL'})); await userEvent.type(screen.getByRole('textbox', {name: 'TicketURL'}), url); }; const setNotes = async (notes: string) => { await userEvent.clear(screen.getByRole('textbox', {name: 'Notes'})); await userEvent.type(screen.getByRole('textbox', {name: 'Notes'}), notes); }; it('renders default fields', async function () { render( ); await userEvent.click(screen.getByRole('button')); renderGlobalModal(); expect(screen.getByRole('textbox', {name: 'TicketURL'})).toBeInTheDocument(); expect(screen.getByRole('textbox', {name: 'Notes'})).toBeInTheDocument(); }); it('obeys showAuditFields prop', async function () { render( ); await userEvent.click(screen.getByRole('button')); renderGlobalModal(); expect(screen.queryByRole('textbox', {name: 'TicketURL'})).not.toBeInTheDocument(); expect(screen.queryByRole('textbox', {name: 'Notes'})).not.toBeInTheDocument(); }); it('renders text content', async function () { render( ); await userEvent.click(screen.getByRole('button')); renderGlobalModal(); expect(screen.getByRole('dialog')).toHaveTextContent('random text'); }); it('renders jsx content', async function () { render( Hello} > ); await userEvent.click(screen.getByRole('button')); renderGlobalModal(); expect(screen.getByTestId('top-half-div')).toBeInTheDocument(); }); it('renders content given by a function', async function () { const testFunc = (handlers: any) => ( ); render( ); await userEvent.click(screen.getByRole('button')); const {waitForModalToHide} = renderGlobalModal(); // check that confirm works await userEvent.click(screen.getByRole('button', {name: 'confirm'})); expect(mockOnConfirm).toHaveBeenCalled(); await waitForModalToHide(); // re-open the modal await userEvent.click(screen.getByRole('button')); // check that close works await userEvent.click(screen.getByRole('button', {name: 'close'})); await waitForModalToHide(); }); it('passes notes and ticket url to parent', async function () { render( ); await userEvent.click(screen.getByRole('button')); renderGlobalModal(); await setTicketURL('http://im.a.cool.website'); await setNotes('notes'); await userEvent.click(screen.getByRole('button', {name: 'Confirm'})); expect(mockOnConfirm).toHaveBeenCalledWith({ ticketURL: 'http://im.a.cool.website', notes: 'notes', }); }); // TODO: adapt this for custom renderer including a confirm button (click on that button instead) // eslint-disable-next-line jest/no-commented-out-tests // it('no-ops on URL error', function() { // render( // //
// // ); // const instance = wrapper.instance(); // const spy = jest.spyOn(instance, 'handleConfirm'); // instance.forceUpdate(); // wrapper.find('div[id="testing"]').simulate('click'); // setTicketURL(wrapper, 'ttp://im.missing.the.h'); // wrapper.find('button[data-test-id="confirm-button"]').simulate('click'); // expect(spy).toHaveBeenCalled(); // expect(mockOnConfirm).not.toHaveBeenCalled(); // }); it('disables confirm button on initial render', async function () { render( ); await userEvent.click(screen.getByRole('button')); renderGlobalModal(); expect(screen.getByRole('button', {name: 'Confirm'})).toBeEnabled(); }); it('disables confirm button on URL error', async function () { render( ); await userEvent.click(screen.getByRole('button')); renderGlobalModal(); await setTicketURL('1invalid'); // Trigger blur validity check await userEvent.click(screen.getByRole('textbox', {name: 'Notes'})); expect(screen.getByRole('button', {name: 'Confirm'})).toBeDisabled(); }); it('enables confirm button on valid URL input', async function () { render( ); await userEvent.click(screen.getByRole('button')); renderGlobalModal(); await setTicketURL('http://www.goodwebsite.com'); expect(screen.getByRole('button', {name: 'Confirm'})).toBeEnabled(); }); it('handles url change', async function () { render( ); await userEvent.click(screen.getByRole('button')); renderGlobalModal(); await setTicketURL('1invalid'); // Trigger blur validity check await userEvent.click(screen.getByRole('textbox', {name: 'Notes'})); expect(screen.getByText('Invalid ticket URL')).toBeInTheDocument(); await setTicketURL('https://sentry.zendesk.com/agent/tickets/1234'); // Trigger blur validity check await userEvent.click(screen.getByRole('textbox', {name: 'Notes'})); expect(screen.queryByText('Invalid ticket URL')).not.toBeInTheDocument(); }); });