/**
 * @license
 * Copyright (C) 2017 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

import '../../../test/common-test-setup-karma.js';
import './gr-identities.js';

const basicFixture = fixtureFromElement('gr-identities');

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

  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(done => {
    stub('gr-rest-api-interface', {
      getExternalIds() { return Promise.resolve(ids); },
    });

    element = basicFixture.instantiate();

    element.loadData().then(() => { flush(done); });
  });

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

    assert.equal(rows.length, 2);

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

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

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

    assert.equal(rows.length, 2);

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

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

  test('_computeIdentity', () => {
    assert.equal(
        element._computeIdentity(ids[0].identity), 'username:john');
    assert.equal(element._computeIdentity(ids[2].identity), '');
  });

  test('filterIdentities', () => {
    assert.isFalse(element.filterIdentities(ids[0]));

    assert.isTrue(element.filterIdentities(ids[1]));
  });

  test('delete id', done => {
    element._idName = 'mailto:gerrit2@example.com';
    const loadDataStub = sinon.stub(element, 'loadData');
    element._handleDeleteItemConfirm().then(() => {
      assert.isTrue(loadDataStub.called);
      done();
    });
  });

  test('_handleDeleteItem opens modal', () => {
    const deleteBtn =
        element.root.querySelector('.deleteButton');
    const deleteItem = sinon.stub(element, '_handleDeleteItem');
    MockInteractions.tap(deleteBtn);
    assert.isTrue(deleteItem.called);
  });

  test('_computeShowLinkAnotherIdentity', () => {
    let serverConfig;

    serverConfig = {
      auth: {
        git_basic_auth_policy: 'OAUTH',
      },
    };
    assert.isTrue(element._computeShowLinkAnotherIdentity(serverConfig));

    serverConfig = {
      auth: {
        git_basic_auth_policy: 'OpenID',
      },
    };
    assert.isTrue(element._computeShowLinkAnotherIdentity(serverConfig));

    serverConfig = {
      auth: {
        git_basic_auth_policy: 'HTTP_LDAP',
      },
    };
    assert.isFalse(element._computeShowLinkAnotherIdentity(serverConfig));

    serverConfig = {
      auth: {
        git_basic_auth_policy: 'LDAP',
      },
    };
    assert.isFalse(element._computeShowLinkAnotherIdentity(serverConfig));

    serverConfig = {
      auth: {
        git_basic_auth_policy: 'HTTP',
      },
    };
    assert.isFalse(element._computeShowLinkAnotherIdentity(serverConfig));

    serverConfig = {};
    assert.isFalse(element._computeShowLinkAnotherIdentity(serverConfig));
  });

  test('_showLinkAnotherIdentity', () => {
    element.serverConfig = {
      auth: {
        git_basic_auth_policy: 'OAUTH',
      },
    };

    assert.isTrue(element._showLinkAnotherIdentity);

    element.serverConfig = {
      auth: {
        git_basic_auth_policy: 'LDAP',
      },
    };

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

