import selectEvent from 'react-select-event';
import {
act,
render,
renderGlobalModal,
screen,
userEvent,
} from 'sentry-test/reactTestingLibrary';
import ResolveActions from 'sentry/components/actions/resolve';
import ModalStore from 'sentry/stores/modalStore';
describe('ResolveActions', function () {
const spy = jest.fn();
beforeEach(() => {
ModalStore.reset();
});
afterEach(() => {
spy.mockClear();
MockApiClient.clearMockResponses();
ModalStore.teardown();
});
describe('disabled', function () {
it('does not call onUpdate when clicked', function () {
render(
);
const button = screen.getByRole('button', {name: 'Resolve'});
expect(button).toBeDisabled();
userEvent.click(button);
expect(spy).not.toHaveBeenCalled();
});
});
describe('disableDropdown', function () {
it('main button calls onUpdate when clicked and dropdown menu disabled', function () {
render(
);
const button = screen.getByRole('button', {name: 'Resolve'});
expect(button).toBeEnabled();
userEvent.click(button);
expect(spy).toHaveBeenCalled();
// Dropdown menu is disabled
expect(screen.getByRole('button', {name: 'More resolve options'})).toBeDisabled();
});
});
describe('resolved', function () {
it('calls onUpdate with unresolved status when clicked', function () {
render(
);
const button = screen.getByRole('button', {name: 'Unresolve'});
expect(button).toBeInTheDocument();
expect(button).toHaveTextContent('');
userEvent.click(button);
expect(spy).toHaveBeenCalledWith({status: 'unresolved'});
});
});
describe('auto resolved', function () {
it('cannot be unresolved manually', function () {
render(
);
userEvent.click(screen.getByRole('button', {name: 'Unresolve'}));
expect(spy).not.toHaveBeenCalled();
});
});
describe('without confirmation', function () {
it('calls spy with resolved status when clicked', function () {
render(
);
userEvent.click(screen.getByRole('button', {name: 'Resolve'}));
expect(spy).toHaveBeenCalledTimes(1);
expect(spy).toHaveBeenCalledWith({status: 'resolved'});
});
});
describe('with confirmation step', function () {
it('displays confirmation modal with message provided', function () {
render(
);
renderGlobalModal();
const button = screen.getByRole('button', {name: 'Resolve'});
userEvent.click(button);
const confirmButton = screen.getByTestId('confirm-button');
expect(confirmButton).toBeInTheDocument();
expect(spy).not.toHaveBeenCalled();
userEvent.click(confirmButton);
expect(spy).toHaveBeenCalled();
});
});
it('can resolve in "another version"', async function () {
const onUpdate = jest.fn();
MockApiClient.addMockResponse({
url: '/projects/org-slug/project-slug/releases/',
body: [TestStubs.Release()],
});
render(
);
renderGlobalModal();
userEvent.click(screen.getByLabelText('More resolve options'));
act(() => userEvent.click(screen.getByText('Another existing releaseā¦')));
selectEvent.openMenu(screen.getByText('e.g. 1.0.4'));
expect(await screen.findByText('1.2.0')).toBeInTheDocument();
userEvent.click(screen.getByText('1.2.0'));
userEvent.click(screen.getByRole('button', {name: 'Save Changes'}));
expect(onUpdate).toHaveBeenCalledWith({
status: 'resolved',
statusDetails: {
inRelease: 'sentry-android-shop@1.2.0',
},
});
});
});