<!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-lite.min.js"></script>
<script src="../../../bower_components/web-component-tester/browser.js"></script>

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

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

<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', {
        getConfig: function() { return Promise.resolve({}); },
        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>
