<!DOCTYPE html>
<!--
@license
Copyright (C) 2018 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">
<meta charset="utf-8">
<title>gr-cla-view</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-cla-view></gr-cla-view>
  </template>
</test-fixture>

<script type="module">
import '../../../test/common-test-setup.js';
import './gr-cla-view.js';
import {dom} from '@polymer/polymer/lib/legacy/polymer.dom.js';
suite('gr-cla-view tests', () => {
  let element;
  const signedAgreements = [{
    name: 'CLA',
    description: 'Contributor License Agreement',
    url: 'static/cla.html',
  }];
  const auth = {
    name: 'Individual',
    description: 'test-description',
    url: 'static/cla_individual.html',
    auto_verify_group: {
      url: '#/admin/groups/uuid-e9aaddc47f305be7661ad4db9b66f9b707bd19a0',
      options: {
        visible_to_all: true,
      },
      group_id: 20,
      owner: 'CLA Accepted - Individual',
      owner_id: 'e9aaddc47f305be7661ad4db9b66f9b707bd19a0',
      created_on: '2017-07-31 15:11:04.000000000',
      id: 'e9aaddc47f305be7661ad4db9b66f9b707bd19a0',
      name: 'CLA Accepted - Individual',
    },
  };

  const auth2 = {
    name: 'Individual2',
    description: 'test-description2',
    url: 'static/cla_individual2.html',
    auto_verify_group: {
      url: '#/admin/groups/uuid-bc53f2738ef8ad0b3a4f53846ff59b05822caecb',
      options: {},
      group_id: 21,
      owner: 'CLA Accepted - Individual2',
      owner_id: 'bc53f2738ef8ad0b3a4f53846ff59b05822caecb',
      created_on: '2017-07-31 15:25:42.000000000',
      id: 'bc53f2738ef8ad0b3a4f53846ff59b05822caecb',
      name: 'CLA Accepted - Individual2',
    },
  };

  const auth3 = {
    name: 'CLA',
    description: 'Contributor License Agreement',
    url: 'static/cla_individual.html',
  };

  const config = {
    auth: {
      use_contributor_agreements: true,
      contributor_agreements: [
        {
          name: 'Individual',
          description: 'test-description',
          url: 'static/cla_individual.html',
        },
        {
          name: 'CLA',
          description: 'Contributor License Agreement',
          url: 'static/cla.html',
        }],
    },
  };
  const config2 = {
    auth: {
      use_contributor_agreements: true,
      contributor_agreements: [
        {
          name: 'Individual2',
          description: 'test-description2',
          url: 'static/cla_individual2.html',
        },
      ],
    },
  };
  const groups = [{
    options: {visible_to_all: true},
    id: 'e9aaddc47f305be7661ad4db9b66f9b707bd19a0',
    group_id: 3,
    name: 'CLA Accepted - Individual',
  },
  ];

  setup(done => {
    stub('gr-rest-api-interface', {
      getConfig() { return Promise.resolve(config); },
      getAccountGroups() { return Promise.resolve(groups); },
      getAccountAgreements() { return Promise.resolve(signedAgreements); },
    });
    element = fixture('basic');
    element.loadData().then(() => { flush(done); });
  });

  test('renders as expected with signed agreement', () => {
    const agreementSections = dom(element.root)
        .querySelectorAll('.contributorAgreementButton');
    const agreementSubmittedTexts = dom(element.root)
        .querySelectorAll('.alreadySubmittedText');
    assert.equal(agreementSections.length, 2);
    assert.isFalse(agreementSections[0].querySelector('input').disabled);
    assert.equal(getComputedStyle(agreementSubmittedTexts[0]).display,
        'none');
    assert.isTrue(agreementSections[1].querySelector('input').disabled);
    assert.notEqual(getComputedStyle(agreementSubmittedTexts[1]).display,
        'none');
  });

  test('_disableAgreements', () => {
    // In the auto verify group and have not yet signed agreement
    assert.isTrue(
        element._disableAgreements(auth, groups, signedAgreements));
    // Not in the auto verify group and have not yet signed agreement
    assert.isFalse(
        element._disableAgreements(auth2, groups, signedAgreements));
    // Not in the auto verify group, have signed agreement
    assert.isTrue(
        element._disableAgreements(auth3, groups, signedAgreements));
    // Make sure the undefined check works
    assert.isFalse(
        element._disableAgreements(auth, undefined, signedAgreements));
  });

  test('_hideAgreements', () => {
    // Not in the auto verify group and have not yet signed agreement
    assert.equal(
        element._hideAgreements(auth, groups, signedAgreements), '');
    // In the auto verify group
    assert.equal(
        element._hideAgreements(auth2, groups, signedAgreements), 'hide');
    // Not in the auto verify group, have signed agreement
    assert.equal(
        element._hideAgreements(auth3, groups, signedAgreements), '');
  });

  test('_disableAgreementsText', () => {
    assert.isFalse(element._disableAgreementsText('I AGREE'));
    assert.isTrue(element._disableAgreementsText('I DO NOT AGREE'));
  });

  test('_computeHideAgreementClass', () => {
    assert.equal(
        element._computeHideAgreementClass(
            auth.name, config.auth.contributor_agreements),
        'hideAgreementsTextBox');
    assert.isUndefined(
        element._computeHideAgreementClass(
            auth.name, config2.auth.contributor_agreements));
  });

  test('_getAgreementsUrl', () => {
    assert.equal(element._getAgreementsUrl(
        'http://test.org/test.html'), 'http://test.org/test.html');
    assert.equal(element._getAgreementsUrl(
        'test_cla.html'), '/test_cla.html');
  });
});
</script>
