import {createListeners} from 'sentry-test/createListeners';
import {mountWithTheme} from 'sentry-test/enzyme';
import {act} from 'sentry-test/reactTestingLibrary';
import EditableText from 'sentry/components/editableText';
const currentValue = 'foo';
function renderedComponent(onChange: () => void, newValue = 'bar', maxLength?: number) {
const wrapper = mountWithTheme(
);
let label = wrapper.find('Label');
expect(label.text()).toEqual(currentValue);
let inputWrapper = wrapper.find('InputWrapper');
expect(inputWrapper.length).toEqual(0);
const styledIconEdit = wrapper.find('IconEdit');
expect(styledIconEdit.length).toEqual(1);
label.simulate('click');
label = wrapper.find('Label');
expect(inputWrapper.length).toEqual(0);
inputWrapper = wrapper.find('InputWrapper');
expect(inputWrapper.length).toEqual(1);
const styledInput = wrapper.find('StyledInput');
expect(styledInput.length).toEqual(1);
styledInput.simulate('change', {target: {value: newValue}});
const inputLabel = wrapper.find('InputLabel');
expect(inputLabel.text()).toEqual(newValue);
return wrapper;
}
describe('EditableText', function () {
const newValue = 'bar';
it('edit value and click outside of the component', function () {
const fireEvent = createListeners('document');
const handleChange = jest.fn();
const wrapper = renderedComponent(handleChange);
act(() => {
// Click outside of the component
fireEvent.mouseDown(document.body);
});
expect(handleChange).toHaveBeenCalled();
wrapper.update();
const updatedLabel = wrapper.find('Label');
expect(updatedLabel.length).toEqual(1);
expect(updatedLabel.text()).toEqual(newValue);
});
it('edit value and press enter', function () {
const fireEvent = createListeners('window');
const handleChange = jest.fn();
const wrapper = renderedComponent(handleChange);
act(() => {
// Press enter
fireEvent.keyDown('Enter');
});
expect(handleChange).toHaveBeenCalled();
wrapper.update();
const updatedLabel = wrapper.find('Label');
expect(updatedLabel.length).toEqual(1);
expect(updatedLabel.text()).toEqual(newValue);
});
it('clear value and show error message', function () {
const fireEvent = createListeners('window');
const handleChange = jest.fn();
const wrapper = renderedComponent(handleChange, '');
act(() => {
// Press enter
fireEvent.keyDown('Enter');
});
expect(handleChange).toHaveBeenCalledTimes(0);
wrapper.update();
});
it('displays a disabled value', function () {
const handleChange = jest.fn();
const wrapper = mountWithTheme(
);
let label = wrapper.find('Label');
expect(label.text()).toEqual(currentValue);
label.simulate('click');
const inputWrapper = wrapper.find('InputWrapper');
expect(inputWrapper.length).toEqual(0);
label = wrapper.find('Label');
expect(label.length).toEqual(1);
});
describe('revert value and close editor', function () {
it('prop value changes', function () {
const handleChange = jest.fn();
const newPropValue = 'new-prop-value';
const wrapper = renderedComponent(handleChange, '');
wrapper.setProps({value: newPropValue});
wrapper.update();
const updatedLabel = wrapper.find('Label');
expect(updatedLabel.length).toEqual(1);
expect(updatedLabel.text()).toEqual(newPropValue);
});
it('prop isDisabled changes', function () {
const handleChange = jest.fn();
const wrapper = renderedComponent(handleChange, '');
wrapper.setProps({isDisabled: true});
wrapper.update();
const updatedLabel = wrapper.find('Label');
expect(updatedLabel.length).toEqual(1);
expect(updatedLabel.text()).toEqual(currentValue);
});
it('edit value and press escape', function () {
const fireEvent = createListeners('window');
const handleChange = jest.fn();
const wrapper = renderedComponent(handleChange);
act(() => {
// Press escape
fireEvent.keyDown('Escape');
});
expect(handleChange).toHaveBeenCalledTimes(0);
wrapper.update();
const updatedLabel = wrapper.find('Label');
expect(updatedLabel.length).toEqual(1);
expect(updatedLabel.text()).toEqual(currentValue);
});
it('enforces a max length if provided', function () {
const wrapper = renderedComponent(jest.fn(), '', 4);
const input = wrapper.find('input');
expect(input.prop('maxLength')).toBe(4);
});
});
});