<!DOCTYPE html>
<!--
Copyright (C) 2015 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-reviewer-list</title>

<script src="../../../bower_components/webcomponentsjs/webcomponents.min.js"></script>
<script src="../../../bower_components/web-component-tester/browser.js"></script>
<script src="../../../scripts/util.js"></script>

<link rel="import" href="../../../bower_components/iron-test-helpers/iron-test-helpers.html">
<link rel="import" href="gr-reviewer-list.html">

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

<script>
  suite('gr-reviewer-list tests', function() {
    var element;
    var sandbox;

    setup(function() {
      element = fixture('basic');
      sandbox = sinon.sandbox.create();
      stub('gr-rest-api-interface', {
        removeChangeReviewer: function() {
          return Promise.resolve({ok: true});
        },
      });
    });

    teardown(function() {
      sandbox.restore();
    });

    test('controls hidden on immutable element', function() {
      element.mutable = false;
      assert.isTrue(element.$$('.controlsContainer').hasAttribute('hidden'));
      element.mutable = true;
      assert.isFalse(element.$$('.controlsContainer').hasAttribute('hidden'));
    });

    test('add reviewer button opens reply dialog', function(done) {
      element.addEventListener('show-reply-dialog', function() {
        done();
      });
      MockInteractions.tap(element.$$('.addReviewer'));
    });

    test('only show remove for removable reviewers', function() {
      element.mutable = true;
      element.change = {
        owner: {
          _account_id: 1,
        },
        reviewers: {
          'REVIEWER': [
            {
              _account_id: 2,
              name: 'Bojack Horseman',
              email: 'SecretariatRulez96@hotmail.com',
            },
            {
              _account_id: 3,
              name: 'Pinky Penguin',
            },
          ],
          'CC': [
            {
              _account_id: 4,
              name: 'Diane Nguyen',
              email: 'macarthurfellow2B@juno.com',
            },
          ]
        },
        removable_reviewers: [
          {
            _account_id: 3,
            name: 'Pinky Penguin',
          },
          {
            _account_id: 4,
            name: 'Diane Nguyen',
            email: 'macarthurfellow2B@juno.com',
          },
        ]
      };
      flushAsynchronousOperations();
      var chips =
          Polymer.dom(element.root).querySelectorAll('gr-account-chip');
      assert.equal(chips.length, 3);
      Array.from(chips).forEach(function(el) {
        var accountID = parseInt(el.getAttribute('data-account-id'), 10);
        assert.ok(accountID);

        var buttonEl = el.$$('gr-button');
        assert.isNotNull(buttonEl);
        if (accountID == 2) {
          assert.isTrue(buttonEl.hasAttribute('hidden'));
        } else {
          assert.isFalse(buttonEl.hasAttribute('hidden'));
        }
      });
    });

    test('tracking reviewers and ccs', function() {
      var counter = 0;
      function makeAccount() {
        return {_account_id: counter++};
      }

      var owner = makeAccount();
      var reviewer = makeAccount();
      var cc = makeAccount();
      var reviewers = {
        REMOVED: [makeAccount()],
        REVIEWER: [owner, reviewer],
        CC: [owner, cc],
      };

      element.ccsOnly = false;
      element.reviewersOnly = false;
      element.change = {
        owner: owner,
        reviewers: reviewers,
      };
      assert.deepEqual(element._reviewers, [reviewer, cc]);

      element.reviewersOnly = true;
      element.change = {
        owner: owner,
        reviewers: reviewers,
      };
      assert.deepEqual(element._reviewers, [reviewer]);

      element.ccsOnly = true;
      element.reviewersOnly = false;
      element.change = {
        owner: owner,
        reviewers: reviewers,
      };
      assert.deepEqual(element._reviewers, [cc]);
    });

    test('_handleAddTap passes mode with event', function() {
      var fireStub = sandbox.stub(element, 'fire');
      var e = {preventDefault: function() {}};

      element.ccsOnly = false;
      element.reviewersOnly = false;
      element._handleAddTap(e);
      assert.isTrue(fireStub.calledWith('show-reply-dialog', {value: {}}));

      element.reviewersOnly = true;
      element._handleAddTap(e);
      assert.isTrue(fireStub.lastCall.calledWith('show-reply-dialog',
          {value: {reviewersOnly: true}}));

      element.ccsOnly = true;
      element.reviewersOnly = false;
      element._handleAddTap(e);
      assert.isTrue(fireStub.lastCall.calledWith('show-reply-dialog',
          {value: {ccsOnly: true}}));
    });
  });
</script>
