import PropTypes from 'prop-types';
import React from 'react';

import {mount} from 'enzyme';
import ProjectKeys from 'app/views/settings/project/projectKeys';

describe('ProjectKeys', function() {
  let org, project, wrapper;
  let deleteMock;
  let projectKeys;

  beforeEach(function() {
    org = TestStubs.Organization();
    project = TestStubs.Project();
    projectKeys = TestStubs.ProjectKeys();

    MockApiClient.clearMockResponses();
    MockApiClient.addMockResponse({
      url: `/projects/${org.slug}/${project.slug}/keys/`,
      method: 'GET',
      body: projectKeys,
    });
    deleteMock = MockApiClient.addMockResponse({
      url: `/projects/${org.slug}/${project.slug}/keys/${projectKeys[0].id}/`,
      method: 'DELETE',
    });
    const routerContext = TestStubs.routerContext();

    wrapper = mount(
      <ProjectKeys routes={[]} params={{orgId: org.slug, projectId: project.slug}} />,
      {
        ...routerContext,
        context: {
          ...routerContext.context,
          project: TestStubs.Project(),
        },
        childContextTypes: {
          ...routerContext.childContextTypes,
          project: PropTypes.object,
        },
      }
    );
  });

  it('renders empty', function() {
    MockApiClient.clearMockResponses();
    MockApiClient.addMockResponse({
      url: `/projects/${org.slug}/${project.slug}/keys/`,
      method: 'GET',
      body: [],
    });

    wrapper = mount(
      <ProjectKeys routes={[]} params={{orgId: org.slug, projectId: project.slug}} />,
      TestStubs.routerContext()
    );

    expect(wrapper.find('EmptyMessage')).toHaveLength(1);
  });

  it('has clippable box', function() {
    expect(wrapper.find('.clip-fade Button')).toHaveLength(1);
    wrapper.find('.clip-fade Button').simulate('click');
    expect(wrapper.find('.clip-fade Button')).toHaveLength(0);
  });

  it('deletes key', function() {
    wrapper
      .find('PanelHeader Button')
      .last()
      .simulate('click');

    wrapper.find('ModalDialog Button[priority="danger"]').simulate('click');

    wrapper.update();

    expect(deleteMock).toHaveBeenCalled();
  });

  it('disable and enables key', function() {
    const enableMock = MockApiClient.addMockResponse({
      url: `/projects/${org.slug}/${project.slug}/keys/${projectKeys[0].id}/`,
      method: 'PUT',
    });

    wrapper
      .find('PanelHeader Button')
      .at(1)
      .simulate('click');

    expect(enableMock).toHaveBeenCalledWith(
      expect.anything(),
      expect.objectContaining({
        data: {isActive: false},
      })
    );

    wrapper
      .find('PanelHeader Button')
      .at(1)
      .simulate('click');

    expect(enableMock).toHaveBeenCalledWith(
      expect.anything(),
      expect.objectContaining({
        data: {isActive: true},
      })
    );
  });
});