import {mountWithTheme} from 'sentry-test/enzyme';
import {changeInputValue, openMenu} from 'sentry-test/select-new';

import {Form, SelectCreatableField} from 'app/components/forms';

describe('SelectCreatableField', function () {
  it('can add user input into select field when using options', function () {
    const wrapper = mountWithTheme(
      <SelectCreatableField options={[{value: 'foo', label: 'Foo'}]} name="fieldName" />
    );

    const input = wrapper.find('SelectControl input[type="text"]');
    changeInputValue(input, 'bar');
    wrapper.update();

    // Text is in input
    expect(wrapper.find('SelectControl input[type="text"]').props().value).toBe('bar');

    // Click on create option
    openMenu(wrapper, {control: true});
    wrapper.find('SelectControl Option div').simulate('click');

    // Is active hidden input value
    expect(wrapper.find('SelectControl input[type="hidden"]').props().value).toEqual(
      'bar'
    );
  });

  it('can add user input into select field when using choices', function () {
    const wrapper = mountWithTheme(
      <SelectCreatableField choices={['foo']} name="fieldName" />
    );

    const input = wrapper.find('SelectControl input[type="text"]');
    changeInputValue(input, 'bar');
    wrapper.update();

    // Text is in input
    expect(wrapper.find('SelectControl input[type="text"]').props().value).toBe('bar');

    // Click on create option
    openMenu(wrapper, {control: true});
    wrapper.find('SelectControl Option div').simulate('click');

    // Is active hidden input value
    expect(wrapper.find('SelectControl input[type="hidden"]').props().value).toEqual(
      'bar'
    );
  });

  it('can add user input into select field when using paired choices', function () {
    const wrapper = mountWithTheme(
      <SelectCreatableField choices={[['foo', 'foo']]} name="fieldName" />
    );

    const input = wrapper.find('SelectControl input[type="text"]');
    changeInputValue(input, 'bar');
    wrapper.update();

    // Text is in input
    expect(wrapper.find('SelectControl input[type="text"]').props().value).toBe('bar');

    // Click on create option
    openMenu(wrapper, {control: true});
    wrapper.find('SelectControl Option div').simulate('click');

    // Is active hidden input value
    expect(wrapper.find('SelectControl input[type="hidden"]').props().value).toEqual(
      'bar'
    );
  });

  it('with Form context', function () {
    const submitMock = jest.fn();
    const wrapper = mountWithTheme(
      <Form onSubmit={submitMock}>
        <SelectCreatableField choices={[['foo', 'foo']]} name="fieldName" />
      </Form>,
      {}
    );

    const input = wrapper.find('SelectControl input[type="text"]');
    changeInputValue(input, 'bar');
    wrapper.update();

    // Text is in input
    expect(wrapper.find('SelectControl input[type="text"]').props().value).toBe('bar');

    // Click on create option
    openMenu(wrapper, {control: true});
    wrapper.find('SelectControl Option div').simulate('click');

    wrapper.find('Form').simulate('submit');
    expect(submitMock).toHaveBeenCalledWith(
      {
        fieldName: 'bar',
      },
      expect.anything(),
      expect.anything()
    );
  });
});