/**
 * @license
 * Copyright 2017 Google LLC
 * SPDX-License-Identifier: Apache-2.0
 */
import '../../../test/common-test-setup';
import './gr-identities';
import {GrIdentities} from './gr-identities';
import {AuthType} from '../../../constants/constants';
import {stubRestApi, waitUntilVisible} from '../../../test/test-utils';
import {ServerInfo} from '../../../types/common';
import {createServerInfo} from '../../../test/test-data-generators';
import {queryAll, queryAndAssert} from '../../../test/test-utils';
import {GrButton} from '../../shared/gr-button/gr-button';
import {fixture, html, assert} from '@open-wc/testing';

suite('gr-identities tests', () => {
  let element: GrIdentities;

  const ids = [
    {
      identity: 'username:john',
      email_address: 'john.doe@example.com',
      trusted: true,
    },
    {
      identity: 'gerrit:gerrit',
      email_address: 'gerrit@example.com',
    },
    {
      identity: 'mailto:gerrit2@example.com',
      email_address: 'gerrit2@example.com',
      trusted: true,
      can_delete: true,
    },
  ];

  setup(async () => {
    stubRestApi('getExternalIds').returns(Promise.resolve(ids));

    element = await fixture<GrIdentities>(
      html`<gr-identities></gr-identities>`
    );
    await element.loadData();
    await element.updateComplete;
  });

  test('renders', () => {
    assert.shadowDom.equal(
      element,
      /* HTML */ `<div class="gr-form-styles">
          <fieldset class="space">
            <table>
              <thead>
                <tr>
                  <th class="statusHeader">Status</th>
                  <th class="emailAddressHeader">Email Address</th>
                  <th class="identityHeader">Identity</th>
                  <th class="deleteHeader"></th>
                </tr>
              </thead>
              <tbody>
                <tr>
                  <td class="statusColumn">Untrusted</td>
                  <td class="emailAddressColumn">gerrit@example.com</td>
                  <td class="identityColumn">gerrit:gerrit</td>
                  <td class="deleteColumn">
                    <gr-button
                      aria-disabled="false"
                      class="deleteButton"
                      data-index="0"
                      role="button"
                      tabindex="0"
                    >
                      Delete
                    </gr-button>
                  </td>
                </tr>
                <tr>
                  <td class="statusColumn"></td>
                  <td class="emailAddressColumn">gerrit2@example.com</td>
                  <td class="identityColumn"></td>
                  <td class="deleteColumn">
                    <gr-button
                      aria-disabled="false"
                      class="deleteButton show"
                      data-index="1"
                      role="button"
                      tabindex="0"
                    >
                      Delete
                    </gr-button>
                  </td>
                </tr>
              </tbody>
            </table>
          </fieldset>
        </div>
        <dialog id="modal" tabindex="-1">
          <gr-confirm-delete-item-dialog
            class="confirmDialog"
            itemtypename="ID"
          >
          </gr-confirm-delete-item-dialog>
        </dialog>`
    );
  });

  test('renders', () => {
    const rows = Array.from(queryAll(element, 'tbody tr'));

    assert.equal(rows.length, 2);

    const nameCells = rows.map(row => queryAll(row, 'td')[2].textContent);

    assert.equal(nameCells[0]!.trim(), 'gerrit:gerrit');
    assert.equal(nameCells[1]!.trim(), '');
  });

  test('renders email', () => {
    const rows = Array.from(queryAll(element, 'tbody tr'));

    assert.equal(rows.length, 2);

    const nameCells = rows.map(row => queryAll(row, 'td')[1]!.textContent);

    assert.equal(nameCells[0]!, 'gerrit@example.com');
    assert.equal(nameCells[1]!, 'gerrit2@example.com');
  });

  test('filterIdentities', () => {
    assert.notInclude(element.getIdentities(), ids[0]);
    assert.include(element.getIdentities(), ids[1]);
  });

  test('delete id', async () => {
    element.idName = 'mailto:gerrit2@example.com';
    const loadDataStub = sinon.stub(element, 'loadData');
    await element.handleDeleteItemConfirm();
    assert.isTrue(loadDataStub.called);
  });

  test('handleDeleteItem opens modal', async () => {
    const deleteBtn = queryAndAssert<GrButton>(element, '.deleteButton');
    deleteBtn.click();
    await element.updateComplete;
    await waitUntilVisible(element.modal!);
  });

  test('computeShowLinkAnotherIdentity', () => {
    const config: ServerInfo = {
      ...createServerInfo(),
    };

    config.auth.auth_type = AuthType.OAUTH;
    element.serverConfig = config;
    assert.isTrue(element.computeShowLinkAnotherIdentity());

    config.auth.auth_type = AuthType.OPENID;
    element.serverConfig = config;
    assert.isTrue(element.computeShowLinkAnotherIdentity());

    config.auth.auth_type = AuthType.HTTP_LDAP;
    element.serverConfig = config;
    assert.isFalse(element.computeShowLinkAnotherIdentity());

    config.auth.auth_type = AuthType.LDAP;
    element.serverConfig = config;
    assert.isFalse(element.computeShowLinkAnotherIdentity());

    config.auth.auth_type = AuthType.HTTP;
    element.serverConfig = config;
    assert.isFalse(element.computeShowLinkAnotherIdentity());

    element.serverConfig = undefined;
    assert.isFalse(element.computeShowLinkAnotherIdentity());
  });

  test('showLinkAnotherIdentity', async () => {
    let config: ServerInfo = {
      ...createServerInfo(),
    };
    config.auth.auth_type = AuthType.OAUTH;
    element.serverConfig = config;
    await element.updateComplete;

    assert.isTrue(element.showLinkAnotherIdentity);

    config = {
      ...createServerInfo(),
    };
    config.auth.auth_type = AuthType.LDAP;
    element.serverConfig = config;
    await element.updateComplete;

    assert.isFalse(element.showLinkAnotherIdentity);
  });
});
