/**
 * @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';
import {dom} from '@polymer/polymer/lib/legacy/polymer.dom.js';

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

suite('gr-identities tests', () => {
  let element;
  let sandbox;
  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 => {
    sandbox = sinon.sandbox.create();

    stub('gr-rest-api-interface', {
      getExternalIds() { return Promise.resolve(ids); },
    });

    element = basicFixture.instantiate();

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

  teardown(() => {
    sandbox.restore();
  });

  test('renders', () => {
    const rows = Array.from(
        dom(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(
        dom(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 = sandbox.stub(element, 'loadData');
    element._handleDeleteItemConfirm().then(() => {
      assert.isTrue(loadDataStub.called);
      done();
    });
  });

  test('_handleDeleteItem opens modal', () => {
    const deleteBtn =
        dom(element.root).querySelector('.deleteButton');
    const deleteItem = sandbox.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);
  });
});

