<!DOCTYPE html>
<!--
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-group-members</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-group-members.html">

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

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

<script>
  suite('gr-group-members tests', () => {
    let element;
    let sandbox;
    let groups;
    let groupMembers;
    let includedGroups;

    setup(() => {
      sandbox = sinon.sandbox.create();
      groups = {
        name: 'Administrators',
        owner: 'Administrators',
        group_id: 1,
      };

      groupMembers = [
        {
          _account_id: 1000097,
          name: 'Jane Roe',
          email: 'jane.roe@example.com',
          username: 'jane',
        },
        {
          _account_id: 1000096,
          name: 'Test User',
          email: 'john.doe@example.com',
        },
        {
          _account_id: 1000095,
          name: 'Gerrit',
        },
        {
          _account_id: 1000098,
        },
      ];

      includedGroups = [{
        url: 'https://group/url',
        options: {},
        id: 'testId',
        name: 'testName',
      },
      {
        url: '/group/url',
        options: {},
        id: 'testId2',
        name: 'testName2',
      },
      {
        url: '#/group/url',
        options: {},
        id: 'testId3',
        name: 'testName3',
      },
      ];

      stub('gr-rest-api-interface', {
        getSuggestedAccounts(input) {
          if (input.startsWith('test')) {
            return Promise.resolve([
              {
                _account_id: 1000096,
                name: 'test-account',
                email: 'test.account@example.com',
                username: 'test123',
              },
              {
                _account_id: 1001439,
                name: 'test-admin',
                email: 'test.admin@example.com',
                username: 'test_admin',
              },
              {
                _account_id: 1001439,
                name: 'test-git',
                username: 'test_git',
              },
            ]);
          } else {
            return Promise.resolve({});
          }
        },
        getSuggestedGroups(input) {
          if (input.startsWith('test')) {
            return Promise.resolve({
              'test-admin': {
                id: '1ce023d3fb4e4260776fb92cd08b52bbd21ce70a',
              },
              'test/Administrator (admin)': {
                id: 'test%3Aadmin',
              },
            });
          } else {
            return Promise.resolve({});
          }
        },
        getLoggedIn() { return Promise.resolve(true); },
        getConfig() {
          return Promise.resolve();
        },
        getGroupConfig() {
          return Promise.resolve(groups);
        },
        getGroupMembers() {
          return Promise.resolve(groupMembers);
        },
        getIsGroupOwner() {
          return Promise.resolve(true);
        },
        getIncludedGroup() {
          return Promise.resolve(includedGroups);
        },
        getAccountCapabilities() {
          return Promise.resolve();
        },
      });
      element = fixture('basic');
      sandbox.stub(element, 'getBaseUrl').returns('https://test/site');
      element.groupId = 1;
      return element._loadGroupDetails();
    });

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

    test('_includedGroups', () => {
      assert.equal(element._includedGroups.length, 3);
      assert.equal(Polymer.dom(element.root)
          .querySelectorAll('.nameColumn a')[0].href, includedGroups[0].url);
      assert.equal(Polymer.dom(element.root)
          .querySelectorAll('.nameColumn a')[1].href,
          'https://test/site/group/url');
      assert.equal(Polymer.dom(element.root)
          .querySelectorAll('.nameColumn a')[2].href,
          'https://test/site/group/url');
    });

    test('save members correctly', () => {
      element._groupOwner = true;

      const memberName = 'test-admin';

      const saveStub = sandbox.stub(element.$.restAPI, 'saveGroupMembers',
          () => {
            return Promise.resolve({});
          });

      const button = element.$.saveGroupMember;

      assert.isTrue(button.hasAttribute('disabled'));

      element.$.groupMemberSearchInput.text = memberName;
      element.$.groupMemberSearchInput.value = 1234;

      assert.isFalse(button.hasAttribute('disabled'));

      return element._handleSavingGroupMember().then(() => {
        assert.isTrue(button.hasAttribute('disabled'));
        assert.isFalse(element.$.Title.classList.contains('edited'));
        assert.isTrue(saveStub.lastCall.calledWithExactly('Administrators',
            1234));
      });
    });

    test('save included groups correctly', () => {
      element._groupOwner = true;

      const includedGroupName = 'testName';

      const saveIncludedGroupStub = sandbox.stub(
          element.$.restAPI, 'saveIncludedGroup', () => {
            return Promise.resolve({});
          });

      const button = element.$.saveIncludedGroups;

      assert.isTrue(button.hasAttribute('disabled'));

      element.$.includedGroupSearchInput.text = includedGroupName;
      element.$.includedGroupSearchInput.value = 'testId';

      assert.isFalse(button.hasAttribute('disabled'));

      return element._handleSavingIncludedGroups().then(() => {
        assert.isTrue(button.hasAttribute('disabled'));
        assert.isFalse(element.$.Title.classList.contains('edited'));
        assert.equal(saveIncludedGroupStub.lastCall.args[0], 'Administrators');
        assert.equal(saveIncludedGroupStub.lastCall.args[1], 'testId');
      });
    });

    test('add included group 404 shows helpful error text', () => {
      element._groupOwner = true;

      const memberName = 'bad-name';
      const alertStub = sandbox.stub();
      element.addEventListener('show-alert', alertStub);

      sandbox.stub(element.$.restAPI, 'saveGroupMembers',
          () => Promise.reject({status: 404}));

      element.$.groupMemberSearchInput.text = memberName;
      element.$.groupMemberSearchInput.value = 1234;

      return element._handleSavingIncludedGroups().then(() => {
        assert.isTrue(alertStub.called);
      });
    });

    test('_getAccountSuggestions empty', () => {
      return element._getAccountSuggestions('nonexistent').then(accounts => {
        assert.equal(accounts.length, 0);
      });
    });

    test('_getAccountSuggestions non-empty', () => {
      return element._getAccountSuggestions('test-').then(accounts => {
        assert.equal(accounts.length, 3);
        assert.equal(accounts[0].name,
            'test-account <test.account@example.com>');
        assert.equal(accounts[1].name, 'test-admin <test.admin@example.com>');
        assert.equal(accounts[2].name, 'test-git');
      });
    });

    test('_getGroupSuggestions empty', () => {
      return element._getGroupSuggestions('nonexistent').then(groups => {
        assert.equal(groups.length, 0);
      });
    });

    test('_getGroupSuggestions non-empty', () => {
      return element._getGroupSuggestions('test').then(groups => {
        assert.equal(groups.length, 2);
        assert.equal(groups[0].name, 'test-admin');
        assert.equal(groups[1].name, 'test/Administrator (admin)');
      });
    });

    test('_computeHideItemClass returns string for admin', () => {
      const admin = true;
      const owner = false;
      assert.equal(element._computeHideItemClass(owner, admin), '');
    });

    test('_computeHideItemClass returns hideItem for admin and owner', () => {
      const admin = false;
      const owner = false;
      assert.equal(element._computeHideItemClass(owner, admin), 'canModify');
    });

    test('_computeHideItemClass returns string for owner', () => {
      const admin = false;
      const owner = true;
      assert.equal(element._computeHideItemClass(owner, admin), '');
    });

    test('delete member', () => {
      const deletelBtns = Polymer.dom(element.root)
          .querySelectorAll('.deleteMembersButton');
      MockInteractions.tap(deletelBtns[0]);
      assert.equal(element._itemId, '1000097');
      assert.equal(element._itemName, 'jane');
      MockInteractions.tap(deletelBtns[1]);
      assert.equal(element._itemId, '1000096');
      assert.equal(element._itemName, 'Test User');
      MockInteractions.tap(deletelBtns[2]);
      assert.equal(element._itemId, '1000095');
      assert.equal(element._itemName, 'Gerrit');
      MockInteractions.tap(deletelBtns[3]);
      assert.equal(element._itemId, '1000098');
      assert.equal(element._itemName, '1000098');
    });

    test('delete included groups', () => {
      const deletelBtns = Polymer.dom(element.root)
          .querySelectorAll('.deleteIncludedGroupButton');
      MockInteractions.tap(deletelBtns[0]);
      assert.equal(element._itemId, 'testId');
      assert.equal(element._itemName, 'testName');
      MockInteractions.tap(deletelBtns[1]);
      assert.equal(element._itemId, 'testId2');
      assert.equal(element._itemName, 'testName2');
      MockInteractions.tap(deletelBtns[2]);
      assert.equal(element._itemId, 'testId3');
      assert.equal(element._itemName, 'testName3');
    });

    test('_computeGroupUrl', () => {
      assert.isUndefined(element._computeGroupUrl(undefined));

      assert.isUndefined(element._computeGroupUrl(false));

      let url = '#/admin/groups/uuid-529b3c2605bb1029c8146f9de4a91c776fe64498';
      assert.equal(element._computeGroupUrl(url),
          'https://test/site/admin/groups/' +
          'uuid-529b3c2605bb1029c8146f9de4a91c776fe64498');

      url = 'https://gerrit.local/admin/groups/' +
          'uuid-529b3c2605bb1029c8146f9de4a91c776fe64498';
      assert.equal(element._computeGroupUrl(url), url);
    });
  });
</script>
