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

    setup(function() {
      element = fixture('basic');

      server = sinon.fakeServer.create();
      server.respondWith(
        'GET',
        /\/changes\/42\/suggest_reviewers\?n=10&q=andy(.*)/,
        [
          200,
          {'Content-Type': 'application/json'},
          ')]}\'\n' +
          JSON.stringify([
            {
              account: {
                _account_id: 1021482,
                name: 'Andrew Bonventre',
                email: 'andybons@chromium.org',
              }
            },
            {
              account: {
                _account_id: 1021863,
                name: 'Andrew Bonventre',
                email: 'andybons@google.com',
              }
            },
            {
              group: {
                id: 'c7af6dd375c092ff3b23c0937aa910693dc0c41b',
                name: 'andy',
              }
            }
          ]),
        ]
      );
      server.respondWith(
        'POST',
        '/changes/42/reviewers',
        [
          200,
          {'Content-Type': 'application/json'},
          ')]}\'\n' +
          JSON.stringify({
            reviewers: [{
              _account_id: 1021482,
              approvals: {
                'Code-Review': ' 0'
              },
              email: 'andybons@chromium.org',
              name: 'Andrew Bonventre',
            }]
          }),
        ]
      );
      server.respondWith(
        'DELETE',
        '/changes/42/reviewers/1021482',
        [
          204,
          {'Content-Type': 'application/json'},
          ')]}\'\n{}',
        ]
      );
    });

    teardown(function() {
      server.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'));
    });

    function getActiveElement() {
      return document.activeElement.shadowRoot ?
          document.activeElement.shadowRoot.activeElement :
          document.activeElement;
    }

    test('show/hide input', function() {
      element.mutable = true;
      assert.isFalse(element.$$('.addReviewer').hasAttribute('hidden'));
      assert.isTrue(
          element.$$('.autocompleteContainer').hasAttribute('hidden'));
      assert.notEqual(getActiveElement().id, 'input');
      MockInteractions.tap(element.$$('.addReviewer'));
      assert.isTrue(element.$$('.addReviewer').hasAttribute('hidden'));
      assert.isFalse(
          element.$$('.autocompleteContainer').hasAttribute('hidden'));
      assert.equal(getActiveElement().id, 'input');
      MockInteractions.pressAndReleaseKeyOn(element, 27); // 'esc'
      assert.isFalse(element.$$('.addReviewer').hasAttribute('hidden'));
      assert.isTrue(
          element.$$('.autocompleteContainer').hasAttribute('hidden'));
      assert.equal(getActiveElement().id, '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 removeEls =
          Polymer.dom(element.root).querySelectorAll('.reviewer > .remove');
      assert.equal(removeEls.length, 3);
      Array.from(removeEls).forEach(function(el) {
        var accountID = parseInt(el.getAttribute('data-account-id'), 10);
        assert.ok(accountID);
        if (accountID == 2) {
          assert.isTrue(el.hasAttribute('hidden'));
        } else {
          assert.isFalse(el.hasAttribute('hidden'));
        }
      });
    });

    test('autocomplete starts at >= 3 chars', function() {
      element._inputRequestTimeout = 0;
      element._mutable = true;
      var genRequestStub = sinon.stub(
        element.$.autocompleteXHR,
        'generateRequest',
        function() {
          assert(false, 'generateRequest should not be called for input ' +
              'lengths of less than 3 chars');
        }
      );
      element._inputVal = 'fo';
      flushAsynchronousOperations();
      genRequestStub.restore();
    });

    test('add/remove reviewer flow', function(done) {
      element.change = {
        _number: 42,
        reviewers: {},
        removable_reviewers: [],
        owner: {_account_id: 0},
      };
      element._inputRequestTimeout = 0;
      element._mutable = true;
      MockInteractions.tap(element.$$('.addReviewer'));
      flushAsynchronousOperations();
      element._inputVal = 'andy';
      server.respond();

      element._lastAutocompleteRequest.completes.then(function() {
        flushAsynchronousOperations();
        assert.isFalse(element.$$('.dropdown').hasAttribute('hidden'));
        var itemEls = Polymer.dom(element.root).querySelectorAll('.reviewer');
        assert.equal(itemEls.length, 3);
        assert.isTrue(itemEls[0].hasAttribute('selected'));
        assert.isFalse(itemEls[1].hasAttribute('selected'));

        MockInteractions.pressAndReleaseKeyOn(element, 40); // 'down'
        assert.isFalse(itemEls[0].hasAttribute('selected'));
        assert.isTrue(itemEls[1].hasAttribute('selected'));

        MockInteractions.pressAndReleaseKeyOn(element, 38); // 'up'
        assert.isTrue(itemEls[0].hasAttribute('selected'));
        assert.isFalse(itemEls[1].hasAttribute('selected'));

        MockInteractions.pressAndReleaseKeyOn(element, 27); // 'esc'
        assert.isTrue(element.$$('.dropdown').hasAttribute('hidden'));

        element._inputVal = 'andyb';
        server.respond();

        element._lastAutocompleteRequest.completes.then(function() {
          assert.isFalse(element.$$('.dropdown').hasAttribute('hidden'));
          var itemEls = Polymer.dom(element.root).querySelectorAll('.reviewer');
          assert.equal(itemEls.length, 3);
          assert.isTrue(itemEls[0].hasAttribute('selected'));
          assert.isFalse(itemEls[1].hasAttribute('selected'));
          MockInteractions.pressAndReleaseKeyOn(element, 13); // 'enter'
          assert.isTrue(element.disabled);
          server.respond();

          element._xhrPromise.then(function() {
            assert.isFalse(element.disabled);
            flushAsynchronousOperations();
            var reviewerEls =
                Polymer.dom(element.root).querySelectorAll('.reviewer');
            assert.equal(reviewerEls.length, 1);
            MockInteractions.tap(element.$$('.reviewer > .remove'));
            flushAsynchronousOperations();
            assert.isTrue(element.disabled);
            server.respond();

            element._xhrPromise.then(function() {
              flushAsynchronousOperations();
              assert.isFalse(element.disabled);
              var reviewerEls =
                Polymer.dom(element.root).querySelectorAll('.reviewer');
              assert.equal(reviewerEls.length, 0);
              done();
            });
          });
        });
      });
    });
  });
</script>
