<!DOCTYPE html>
<!--
@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.
-->

<meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1.0, user-scalable=yes">
<title>gr-identities</title>

<script src="/node_modules/@webcomponents/webcomponentsjs/custom-elements-es5-adapter.js"></script>

<script src="/node_modules/@webcomponents/webcomponentsjs/webcomponents-lite.js"></script>
<script src="/components/wct-browser-legacy/browser.js"></script>

<test-fixture id="basic">
  <template>
    <gr-identities></gr-identities>
  </template>
</test-fixture>

<script type="module">
import '../../../test/common-test-setup.js';
import './gr-identities.js';
import {dom} from '@polymer/polymer/lib/legacy/polymer.dom.js';
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 = fixture('basic');

    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], 'gerrit:gerrit');
    assert.equal(nameCells[1], '');
  });

  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);
  });
});
</script>
