import React from 'react';
import {mount} from 'enzyme';

import TeamStore from 'app/stores/teamStore';
import TeamSettings from 'app/views/settings/organizationTeams/teamSettings';

describe('TeamSettings', function() {
  beforeEach(function() {
    MockApiClient.clearMockResponses();
    sinon.stub(window.location, 'assign');
  });

  afterEach(function() {
    window.location.assign.restore();
  });

  it('can change name and slug', async function() {
    let team = TestStubs.Team();
    let putMock = MockApiClient.addMockResponse({
      url: `/teams/org/${team.slug}/`,
      method: 'PUT',
    });
    let mountOptions = TestStubs.routerContext();
    let {router} = mountOptions.context;

    let wrapper = mount(
      <TeamSettings
        routes={[]}
        router={router}
        params={{orgId: 'org', teamId: team.slug}}
        team={team}
        onTeamChange={() => {}}
      />,
      mountOptions
    );

    wrapper
      .find('input[name="name"]')
      .simulate('change', {target: {value: 'New Name'}})
      .simulate('blur');

    expect(putMock).toHaveBeenCalledWith(
      `/teams/org/${team.slug}/`,
      expect.objectContaining({
        data: {
          name: 'New Name',
        },
      })
    );

    wrapper
      .find('input[name="slug"]')
      .simulate('change', {target: {value: 'NEW SLUG'}})
      .simulate('blur');

    wrapper.find('SaveButton').simulate('click');

    expect(putMock).toHaveBeenCalledWith(
      `/teams/org/${team.slug}/`,
      expect.objectContaining({
        data: {
          slug: 'new-slug',
        },
      })
    );

    await tick();
    expect(router.push).toHaveBeenCalledWith('/settings/org/teams/new-slug/settings/');
  });

  it('needs team:admin in order to see an enabled Remove Team button', function() {
    let team = TestStubs.Team();

    let wrapper = mount(
      <TeamSettings
        routes={[]}
        params={{orgId: 'org', teamId: team.slug}}
        team={team}
        onTeamChange={() => {}}
      />,
      TestStubs.routerContext([{organization: TestStubs.Organization({access: []})}])
    );
    expect(
      wrapper
        .find('Panel')
        .last()
        .find('Button')
        .prop('disabled')
    ).toBe(true);
  });

  it('can remove team', async function() {
    let team = TestStubs.Team();
    let deleteMock = MockApiClient.addMockResponse({
      url: `/teams/org/${team.slug}/`,
      method: 'DELETE',
    });
    let routerPushMock = jest.fn();
    let teamStoreTriggerMock = jest.fn();
    sinon.stub(TeamStore, 'trigger', teamStoreTriggerMock);
    TeamStore.loadInitialData([
      {
        slug: 'team-slug',
      },
    ]);

    let wrapper = mount(
      <TeamSettings
        router={{push: routerPushMock}}
        routes={[]}
        params={{orgId: 'org', teamId: team.slug}}
        team={team}
        onTeamChange={() => {}}
      />,
      TestStubs.routerContext()
    );

    // Click "Remove Team button
    wrapper.find('Button[priority="danger"]').simulate('click');

    TeamStore.trigger.reset();

    // Wait for modal
    wrapper.find('ModalDialog Button[priority="danger"]').simulate('click');
    expect(deleteMock).toHaveBeenCalledWith(
      `/teams/org/${team.slug}/`,
      expect.objectContaining({
        method: 'DELETE',
      })
    );

    await tick();
    await tick();
    expect(routerPushMock).toHaveBeenCalledWith('/settings/org/teams/');

    expect(TeamStore.items).toEqual([]);

    TeamStore.trigger.restore();
  });
});