<!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>

<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', {
        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>
