/**
 * @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.
 */

import '../../../test/common-test-setup-karma.js';
import './gr-cla-view.js';
import {dom} from '@polymer/polymer/lib/legacy/polymer.dom.js';

const basicFixture = fixtureFromElement('gr-cla-view');

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 = basicFixture.instantiate();
    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');
  });
});

