import React from 'react';
import {mountWithTheme} from 'sentry-test/enzyme';
import $ from 'jquery';
import ResolveActions from 'app/components/actions/resolve';
describe('ResolveActions', function() {
describe('disabled', function() {
let component, button;
const spy = jest.fn();
beforeEach(function() {
component = mountWithTheme(
,
TestStubs.routerContext()
);
button = component.find('a.btn.btn-default').first();
});
it('has disabled prop', function() {
expect(button.prop('disabled')).toBe(true);
});
it('does not call onUpdate when clicked', function() {
button.simulate('click');
expect(spy).not.toHaveBeenCalled();
});
});
describe('disableDropdown', function() {
let component, button;
const spy = jest.fn();
beforeEach(function() {
component = mountWithTheme(
,
TestStubs.routerContext()
);
});
it('main button is enabled', function() {
button = component.find('ActionLink[title="Resolve"]');
expect(button.prop('disabled')).toBeFalsy();
});
it('main button calls onUpdate when clicked', function() {
button = component.find('ActionLink[title="Resolve"]');
button.simulate('click');
expect(spy).toHaveBeenCalled();
});
it('dropdown menu is disabled', function() {
button = component.find('DropdownLink');
expect(button.prop('disabled')).toBe(true);
});
});
describe('resolved', function() {
let component;
const spy = jest.fn();
beforeEach(function() {
component = mountWithTheme(
,
TestStubs.routerContext()
);
});
it('displays resolved view', function() {
const button = component.find('a.btn.active');
expect(button).toHaveLength(1);
expect(button.text()).toBe('');
});
it('calls onUpdate with unresolved status when clicked', function() {
component.find('a.btn.active').simulate('click');
expect(spy).toHaveBeenCalledWith({status: 'unresolved'});
});
});
describe('auto resolved', function() {
it('cannot be unresolved manually', function() {
const spy = jest.fn();
const component = mountWithTheme(
,
TestStubs.routerContext()
);
component.find('a.btn').simulate('click');
expect(spy).not.toHaveBeenCalled();
});
});
describe('without confirmation', function() {
let component;
const spy = jest.fn();
beforeEach(function() {
component = mountWithTheme(
,
TestStubs.routerContext()
);
});
it('renders', function() {
expect(component).toMatchSnapshot();
});
it('calls spy with resolved status when clicked', function() {
const button = component.find('a.btn.btn-default').first();
button.simulate('click');
expect(spy).toHaveBeenCalledTimes(1);
expect(spy).toHaveBeenCalledWith({status: 'resolved'});
});
});
describe('with confirmation step', function() {
let component, button;
const spy = jest.fn();
beforeEach(function() {
component = mountWithTheme(
,
TestStubs.routerContext()
);
button = component.find('a.btn.btn-default').first();
});
it('renders', function() {
expect(component).toMatchSnapshot();
});
it('displays confirmation modal with message provided', function() {
button.simulate('click');
const modal = $(document.body).find('.modal');
expect(modal.text()).toContain('Are you sure???');
expect(spy).not.toHaveBeenCalled();
$(document.body)
.find('.modal button:contains("Resolve")')
.click();
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()],
});
const wrapper = mountWithTheme(
,
TestStubs.routerContext()
);
wrapper
.find('ActionLink')
.last()
.simulate('click');
await tick();
wrapper.update();
expect(wrapper.find('CustomResolutionModal Select').prop('options')).toEqual([
expect.objectContaining({
value: '92eccef279d966b2319f0802fa4b22b430a5f72b',
label: expect.anything(),
}),
]);
wrapper.find('input[id="version"]').simulate('change', {target: {value: '9'}});
await tick();
wrapper.update();
wrapper.find('input[id="version"]').simulate('keyDown', {keyCode: 13});
wrapper.find('CustomResolutionModal form').simulate('submit');
expect(onUpdate).toHaveBeenCalledWith({
status: 'resolved',
statusDetails: {
inRelease: '92eccef279d966b2319f0802fa4b22b430a5f72b',
},
});
});
});