<!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-change-view</title>

<script src="../../../bower_components/webcomponentsjs/webcomponents.min.js"></script>
<script src="../../../bower_components/web-component-tester/browser.js"></script>
<script src="../../../bower_components/page/page.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-change-view.html">

<test-fixture id="basic">
  <template>
    <gr-change-view></gr-change-view>
  </template>
</test-fixture>

<script>
  suite('gr-change-view tests', function() {
    var element;

    setup(function() {
      stub('gr-rest-api-interface', {
        getAccount: function() { return Promise.resolve(null); },
      });
      element = fixture('basic');
    });

    test('keyboard shortcuts', function() {
      var showStub = sinon.stub(page, 'show');

      MockInteractions.pressAndReleaseKeyOn(element, 85);  // 'U'
      assert(showStub.lastCall.calledWithExactly('/'),
          'Should navigate to /');
      showStub.restore();

      MockInteractions.pressAndReleaseKeyOn(element, 65);  // 'A'
      var overlayEl = element.$.replyOverlay;
      assert.isFalse(overlayEl.opened);
      element._loggedIn = true;

      MockInteractions.pressAndReleaseKeyOn(element, 65, 'shift');  // 'A'
      assert.isFalse(overlayEl.opened);

      MockInteractions.pressAndReleaseKeyOn(element, 65);  // 'A'
      assert.isTrue(overlayEl.opened);
      overlayEl.close();
      assert.isFalse(overlayEl.opened);
    });

    test('reply button is highlighted when there are drafts', function() {
      var replyButton = element.$$('gr-button.reply');
      assert.ok(replyButton);
      assert.isFalse(replyButton.hasAttribute('primary'));

      element._diffDrafts = null;
      assert.isFalse(replyButton.hasAttribute('primary'));

      element._diffDrafts = {};
      assert.isFalse(replyButton.hasAttribute('primary'));

      element._diffDrafts = {
        'file1.txt': [{}],
        'file2.txt': [{}, {}],
      };
      assert.isTrue(replyButton.hasAttribute('primary'));
      assert.equal(replyButton.textContent, 'Reply (3)');
    });

    test('comment events properly update diff drafts', function() {
      element._patchRange = {
        basePatchNum: 'PARENT',
        patchNum: 2,
      };
      var draft = {
        __draft: true,
        id: 'id1',
        path: '/foo/bar.txt',
        text: 'hello',
      };
      element._handleCommentSave({target: {comment: draft}});
      draft.patch_set = 2;
      assert.deepEqual(element._diffDrafts, {'/foo/bar.txt': [draft]});
      draft.patch_set = null;
      draft.text = 'hello, there';
      element._handleCommentSave({target: {comment: draft}});
      draft.patch_set = 2;
      assert.deepEqual(element._diffDrafts, {'/foo/bar.txt': [draft]});
      var draft2 = {
        __draft: true,
        id: 'id2',
        path: '/foo/bar.txt',
        text: 'hola',
      };
      element._handleCommentSave({target: {comment: draft2}});
      draft2.patch_set = 2;
      assert.deepEqual(element._diffDrafts, {'/foo/bar.txt': [draft, draft2]});
      draft.patch_set = null;
      element._handleCommentDiscard({target: {comment: draft}});
      draft.patch_set = 2;
      assert.deepEqual(element._diffDrafts, {'/foo/bar.txt': [draft2]});
      element._handleCommentDiscard({target: {comment: draft2}});
      assert.deepEqual(element._diffDrafts, {});
    });

    test('patch num change', function(done) {
      element._changeNum = '42';
      element._patchRange = {
        basePatchNum: 'PARENT',
        patchNum: 2,
      };
      element._change = {
        change_id: 'Iad9dc96274af6946f3632be53b106ef80f7ba6ca',
        revisions: {
          rev2: {_number: 2},
          rev1: {_number: 1},
          rev13: {_number: 13},
          rev3: {_number: 3},
        },
        current_revision: 'rev3',
        status: 'NEW',
        labels: {},
      };
      flushAsynchronousOperations();
      var selectEl = element.$$('.header select');
      assert.ok(selectEl);
      var optionEls =
          Polymer.dom(element.root).querySelectorAll('.header option');
      assert.equal(optionEls.length, 4);
      assert.isFalse(
          element.$$('.header option[value="1"]').hasAttribute('selected'));
      assert.isTrue(
          element.$$('.header option[value="2"]').hasAttribute('selected'));
      assert.isFalse(
          element.$$('.header option[value="3"]').hasAttribute('selected'));
      assert.equal(optionEls[3].value, 13);

      var showStub = sinon.stub(page, 'show');

      var numEvents = 0;
      selectEl.addEventListener('change', function(e) {
        numEvents++;
        if (numEvents == 1) {
          assert(showStub.lastCall.calledWithExactly('/c/42/1'),
              'Should navigate to /c/42/1');
          selectEl.value = '3';
          element.fire('change', {}, {node: selectEl});
        } else if (numEvents == 2) {
          assert(showStub.lastCall.calledWithExactly('/c/42'),
              'Should navigate to /c/42');
          showStub.restore();
          done();
        }
      });
      selectEl.value = '1';
      element.fire('change', {}, {node: selectEl});
    });

    test('patch num change with missing current_revision', function(done) {
      element._changeNum = '42';
      element._patchRange = {
        basePatchNum: 'PARENT',
        patchNum: 2,
      };
      element._change = {
        change_id: 'Iad9dc96274af6946f3632be53b106ef80f7ba6ca',
        revisions: {
          rev2: {_number: 2},
          rev1: {_number: 1},
          rev13: {_number: 13},
          rev3: {_number: 3},
        },
        status: 'NEW',
        labels: {},
      };
      flushAsynchronousOperations();
      var selectEl = element.$$('.header select');
      assert.ok(selectEl);
      var optionEls =
          Polymer.dom(element.root).querySelectorAll('.header option');
      assert.equal(optionEls.length, 4);
      assert.isFalse(
          element.$$('.header option[value="1"]').hasAttribute('selected'));
      assert.isTrue(
          element.$$('.header option[value="2"]').hasAttribute('selected'));
      assert.isFalse(
          element.$$('.header option[value="3"]').hasAttribute('selected'));
      assert.equal(optionEls[3].value, 13);

      var showStub = sinon.stub(page, 'show');

      var numEvents = 0;
      selectEl.addEventListener('change', function(e) {
        numEvents++;
        if (numEvents == 1) {
          assert(showStub.lastCall.calledWithExactly('/c/42/1'),
              'Should navigate to /c/42/1');
          selectEl.value = '3';
          element.fire('change', {}, {node: selectEl});
        } else if (numEvents == 2) {
          assert(showStub.lastCall.calledWithExactly('/c/42/3'),
              'Should navigate to /c/42/3');
          showStub.restore();
          done();
        }
      });
      selectEl.value = '1';
      element.fire('change', {}, {node: selectEl});
    });

    test('change status new', function() {
      element._changeNum = '1';
      element._patchRange = {
        basePatchNum: 'PARENT',
        patchNum: 1,
      };
      element._change = {
        change_id: 'Iad9dc96274af6946f3632be53b106ef80f7ba6ca',
        revisions: {
          rev1: {_number: 1},
        },
        current_revision: 'rev1',
        status: 'NEW',
        labels: {},
      };
      var status = element._computeChangeStatus(element._change, '1');
      assert.equal(status, '');
    });

    test('change status draft', function() {
      element._changeNum = '1';
      element._patchRange = {
        basePatchNum: 'PARENT',
        patchNum: 1,
      };
      element._change = {
        change_id: 'Iad9dc96274af6946f3632be53b106ef80f7ba6ca',
        revisions: {
          rev1: {_number: 1},
        },
        current_revision: 'rev1',
        status: 'DRAFT',
        labels: {},
      };
      var status = element._computeChangeStatus(element._change, '1');
      assert.equal(status, '(Draft)');
    });

    test('revision status draft', function() {
      element._changeNum = '1';
      element._patchRange = {
        basePatchNum: 'PARENT',
        patchNum: 1,
      };
      element._change = {
        change_id: 'Iad9dc96274af6946f3632be53b106ef80f7ba6ca',
        revisions: {
          rev1: {_number: 1},
          rev2: {
            _number: 2,
            draft: true,
          },
        },
        current_revision: 'rev1',
        status: 'NEW',
        labels: {},
      };
      var status = element._computeChangeStatus(element._change, '2');
      assert.equal(status, '(Draft)');
    });

    test('show commit message edit button', function() {
      var changeRecord = {
        base: {
          revisions: {
            rev1: {_number: 1},
            rev2: {_number: 2},
          },
          current_revision: 'rev2',
        },
      };
      assert.isTrue(element._computeHideEditCommitMessage(
          false, false, changeRecord, '2'));
      assert.isTrue(element._computeHideEditCommitMessage(
          true, true, changeRecord, '2'));
      assert.isTrue(element._computeHideEditCommitMessage(
          true, false, changeRecord, '1'));
      assert.isFalse(element._computeHideEditCommitMessage(
          true, false, changeRecord, '2'));
    });

    test('topic is coalesced to null', function() {
      sinon.stub(element, '_changeChanged');
      sinon.stub(element.$.restAPI, 'getChangeDetail', function(num) {
        return Promise.resolve({id: '123456789', labels: {}});
      });

      element._getChangeDetail().then(function() {
        assert.isNull(element._change.topic);
      });
    });

    test('reply dialog focus can be controlled', function() {
      var FocusTarget = element.$.replyDialog.FocusTarget;
      var openSpy = sinon.spy(element, '_openReplyDialog');

      var e = {detail: {}};
      element._handleShowReplyDialog(e);
      assert(openSpy.lastCall.calledWithExactly(FocusTarget.REVIEWERS),
          '_openReplyDialog should have been passed REVIEWERS');

      e.detail.value = {ccsOnly: true};
      element._handleShowReplyDialog(e);
      assert(openSpy.lastCall.calledWithExactly(FocusTarget.CCS),
          '_openReplyDialog should have been passed CCS');
    });
  });
</script>
