<!DOCTYPE html>
<!--
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">
<title>gr-cla-view</title>

<script src="../../../bower_components/webcomponentsjs/webcomponents-lite.min.js"></script>
<script src="../../../bower_components/web-component-tester/browser.js"></script>
<link rel="import" href="../../../test/common-test-setup.html"/>
<link rel="import" href="gr-cla-view.html">

<script>void(0);</script>

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

<script>
  suite('gr-cla-view tests', () => {
    let element;
    let agreements;
    const auth = {
      name: 'Individual',
      description: 'test-description',
      url: 'static/cla_individual.html',
      auto_verify_group: {
        url: '#/admin/groups/uuid-bc53f2738ef8ad0b3a4f53846ff59b05822caecb',
        options: {
          visible_to_all: true,
        },
        group_id: 20,
        owner: 'CLA Accepted - Individual',
        owner_id: 'bc53f2738ef8ad0b3a4f53846ff59b05822caecb',
        created_on: '2017-07-31 15:11:04.000000000',
        id: 'bc53f2738ef8ad0b3a4f53846ff59b05822caecb',
        name: 'CLA Accepted - Individual',
      },
    };
    const auth2 = {
      name: 'Individual2',
      description: 'test-description2',
      url: 'static/cla_individual2.html',
      auto_verify_group: {
        url: '#/admin/groups/uuid-e9aaddc47f305be7661ad4db9b66f9b707bd19a0',
        options: {},
        group_id: 21,
        owner: 'CLA Accepted - Individual2',
        owner_id: 'e9aaddc47f305be7661ad4db9b66f9b707bd19a0',
        created_on: '2017-07-31 15:25:42.000000000',
        id: 'e9aaddc47f305be7661ad4db9b66f9b707bd19a0',
        name: 'CLA Accepted - Individual2',
      },
    };
    const config = {
      auth: {
        use_contributor_agreements: true,
        contributor_agreements: [
          {
            name: 'Individual',
            description: 'test-description',
            url: 'static/cla_individual.html',
          },
        ],
      },
    };
    const config2 = {
      auth: {
        use_contributor_agreements: true,
        contributor_agreements: [
          {
            name: 'Individual2',
            description: 'test-description2',
            url: 'static/cla_individual2.html',
          },
        ],
      },
    };
    const groups = [
      {
        url: 'some url',
        options: {},
        description: 'Group 1 description',
        group_id: 1,
        owner: 'Administrators',
        owner_id: '123',
        id: 'abc',
        name: 'Individual',
      },
      {
        options: {visible_to_all: true},
        id: '456',
        group_id: 2,
        name: 'Individual 2',
      },
      {
        options: {visible_to_all: true},
        id: '457',
        group_id: 3,
        name: 'CLA Accepted - Individual',
      },
    ];

    setup(done => {
      agreements = [{
        url: 'test-agreements.html',
        description: 'Agreements 1 description',
        name: 'Agreements 1',
      }];

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

      element = fixture('basic');

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

    test('_disableAggreements equals true', () => {
      assert.isTrue(element._disableAggreements(auth, groups));
    });

    test('_disableAggreements equals false', () => {
      assert.isFalse(element._disableAggreements(auth2, groups));
    });

    test('_hideAggreements equals string', () => {
      assert.equal(element._hideAggreements(auth, groups), '');
    });

    test('_hideAggreements equals agreementsSubmitted', () => {
      assert.equal(element._hideAggreements(auth2, groups),
          'agreementsSubmitted');
    });

    test('_disableAgreementsText equals true', () => {
      assert.isFalse(element._disableAgreementsText('I AGREE'));
    });

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

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

    test('_computeHideAgreementClass returns undefined', () => {
      assert.isUndefined(
          element._computeHideAgreementClass(
              auth.name, config2.auth.contributor_agreements));
    });

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

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