<!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-diff-comment-thread</title>

<script src="../../../bower_components/webcomponentsjs/webcomponents-lite.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-diff-comment-thread.html">

<test-fixture id="basic">
  <template>
    <gr-diff-comment-thread></gr-diff-comment-thread>
  </template>
</test-fixture>

<test-fixture id="withComment">
  <template>
    <gr-diff-comment-thread></gr-diff-comment-thread>
  </template>
</test-fixture>

<script>
  suite('gr-diff-comment-thread tests', function() {
    var element;
    var sandbox;

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

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

    test('comments are sorted correctly', function() {
      var comments = [
        {
          id: 'jacks_reply',
          message: 'i like you, too',
          in_reply_to: 'sallys_confession',
          updated: '2015-12-25 15:00:20.396000000',
        }, {
          id: 'sallys_confession',
          message: 'i like you, jack',
          updated: '2015-12-24 15:00:20.396000000',
        }, {
          id: 'sally_to_dr_finklestein',
          message: 'i’m running away',
          updated: '2015-10-31 09:00:20.396000000',
        }, {
          id: 'sallys_defiance',
          in_reply_to: 'sally_to_dr_finklestein',
          message: 'i will poison you so i can get away',
          updated: '2015-10-31 15:00:20.396000000',
        }, {
          id: 'dr_finklesteins_response',
          in_reply_to: 'sally_to_dr_finklestein',
          message: 'no i will pull a thread and your arm will fall off',
          updated: '2015-10-31 11:00:20.396000000',
        }, {
          id: 'sallys_mission',
          message: 'i have to find santa',
          updated: '2015-12-24 15:00:20.396000000',
        }
      ];
      var results = element._sortedComments(comments);
      assert.deepEqual(results, [
        {
          id: 'sally_to_dr_finklestein',
          message: 'i’m running away',
          updated: '2015-10-31 09:00:20.396000000',
        }, {
          id: 'dr_finklesteins_response',
          in_reply_to: 'sally_to_dr_finklestein',
          message: 'no i will pull a thread and your arm will fall off',
          updated: '2015-10-31 11:00:20.396000000',
        }, {
          id: 'sallys_defiance',
          in_reply_to: 'sally_to_dr_finklestein',
          message: 'i will poison you so i can get away',
          updated: '2015-10-31 15:00:20.396000000',
        }, {
          id: 'sallys_confession',
          message: 'i like you, jack',
          updated: '2015-12-24 15:00:20.396000000',
        }, {
          id: 'sallys_mission',
          message: 'i have to find santa',
          updated: '2015-12-24 15:00:20.396000000',
        }, {
          id: 'jacks_reply',
          message: 'i like you, too',
          in_reply_to: 'sallys_confession',
          updated: '2015-12-25 15:00:20.396000000',
        }
      ]);
    });

    test('addOrEditDraft w/ edit draft', function() {
      element.comments = [{
        id: 'jacks_reply',
        message: 'i like you, too',
        in_reply_to: 'sallys_confession',
        updated: '2015-12-25 15:00:20.396000000',
        __draft: true,
      }];
      var commentElStub = sandbox.stub(element, '_commentElWithDraftID',
          function() { return {}; });
      var addDraftStub = sandbox.stub(element, 'addDraft');

      element.addOrEditDraft(123);

      assert.isTrue(commentElStub.called);
      assert.isFalse(addDraftStub.called);
    });

    test('addOrEditDraft w/o edit draft', function() {
      element.comments = [];
      var commentElStub = sandbox.stub(element, '_commentElWithDraftID',
          function() { return {}; });
      var addDraftStub = sandbox.stub(element, 'addDraft');

      element.addOrEditDraft(123);

      assert.isFalse(commentElStub.called);
      assert.isTrue(addDraftStub.called);
    });
  });

  suite('comment action tests', function() {
    var element;

    setup(function() {
      stub('gr-rest-api-interface', {
        getLoggedIn: function() { return Promise.resolve(false); },
        saveDiffDraft: function() {
          return Promise.resolve({
            ok: true,
            text: function() { return Promise.resolve(')]}\'\n' +
                JSON.stringify({
                  id: '7afa4931_de3d65bd',
                  path: '/path/to/file.txt',
                  line: 5,
                  in_reply_to: 'baf0414d_60047215',
                  updated: '2015-12-21 02:01:10.850000000',
                  message: 'Done',
                }));
            },
          });
        },
        deleteDiffDraft: function() { return Promise.resolve({ok: true}); },
      });
      element = fixture('withComment');
      element.comments = [{
        author: {
          name: 'Mr. Peanutbutter',
          email: 'tenn1sballchaser@aol.com',
        },
        id: 'baf0414d_60047215',
        line: 5,
        message: 'is this a crossover episode!?',
        updated: '2015-12-08 19:48:33.843000000',
      }];
      flushAsynchronousOperations();
    });

    test('reply', function(done) {
      var commentEl = element.$$('gr-diff-comment');
      assert.ok(commentEl);
      commentEl.addEventListener('create-reply-comment', function() {
        var drafts = element._orderedComments.filter(function(c) {
          return c.__draft == true;
        });
        assert.equal(drafts.length, 1);
        assert.notOk(drafts[0].message, 'message should be empty');
        assert.equal(drafts[0].in_reply_to, 'baf0414d_60047215');
        done();
      });
      commentEl.fire('create-reply-comment', {comment: commentEl.comment},
          {bubbles: false});
    });

    test('quote reply', function(done) {
      var commentEl = element.$$('gr-diff-comment');
      assert.ok(commentEl);
      commentEl.addEventListener('create-reply-comment', function() {
        var drafts = element._orderedComments.filter(function(c) {
          return c.__draft == true;
        });
        assert.equal(drafts.length, 1);
        assert.equal(drafts[0].message, '> is this a crossover episode!?\n\n');
        assert.equal(drafts[0].in_reply_to, 'baf0414d_60047215');
        done();
      });
      commentEl.fire('create-reply-comment', {comment: commentEl.comment,
          quote: true}, {bubbles: false});
    });

    test('quote reply multiline', function(done) {
      element.comments = [{
        author: {
          name: 'Mr. Peanutbutter',
          email: 'tenn1sballchaser@aol.com',
        },
        id: 'baf0414d_60047215',
        line: 5,
        message: 'is this a crossover episode!?\nIt might be!',
        updated: '2015-12-08 19:48:33.843000000',
      }];
      flushAsynchronousOperations();

      var commentEl = element.$$('gr-diff-comment');
      assert.ok(commentEl);
      commentEl.addEventListener('create-reply-comment', function() {
        var drafts = element._orderedComments.filter(function(c) {
          return c.__draft == true;
        });
        assert.equal(drafts.length, 1);
        assert.equal(drafts[0].message,
            '> is this a crossover episode!?\n> It might be!\n\n');
        assert.equal(drafts[0].in_reply_to, 'baf0414d_60047215');
        done();
      });
      commentEl.fire('create-reply-comment', {comment: commentEl.comment,
          quote: true}, {bubbles: false});
    });

    test('ack', function(done) {
      element.changeNum = '42';
      element.patchNum = '1';
      var commentEl = element.$$('gr-diff-comment');
      assert.ok(commentEl);
      commentEl.addEventListener('create-ack-comment', function() {
        var drafts = element._orderedComments.filter(function(c) {
          return c.__draft == true;
        });
        assert.equal(drafts.length, 1);
        assert.equal(drafts[0].message, 'Ack');
        assert.equal(drafts[0].in_reply_to, 'baf0414d_60047215');
        done();
      });
      commentEl.fire('create-ack-comment', {comment: commentEl.comment},
          {bubbles: false});
    });

    test('done', function(done) {
      element.changeNum = '42';
      element.patchNum = '1';
      var commentEl = element.$$('gr-diff-comment');
      assert.ok(commentEl);
      commentEl.addEventListener('create-done-comment', function() {
        var drafts = element._orderedComments.filter(function(c) {
          return c.__draft == true;
        });
        assert.equal(drafts.length, 1);
        assert.equal(drafts[0].message, 'Done');
        assert.equal(drafts[0].in_reply_to, 'baf0414d_60047215');
        assert.isFalse(drafts[0].unresolved);
        done();
      });
      commentEl.fire('create-done-comment', {comment: commentEl.comment},
          {bubbles: false});
    });

    test('please fix', function(done) {
      element.changeNum = '42';
      element.patchNum = '1';
      var commentEl = element.$$('gr-diff-comment');
      assert.ok(commentEl);
      commentEl.addEventListener('create-fix-comment', function() {
        var drafts = element._orderedComments.filter(function(c) {
          return c.__draft == true;
        });
        assert.equal(drafts.length, 1);
        assert.equal(
            drafts[0].message, '> is this a crossover episode!?\n\nPlease Fix');
        assert.equal(drafts[0].in_reply_to, 'baf0414d_60047215');
        assert.isTrue(drafts[0].unresolved);
        done();
      });
      commentEl.fire('create-fix-comment', {comment: commentEl.comment},
          {bubbles: false});
    });

    test('discard', function(done) {
      element.changeNum = '42';
      element.patchNum = '1';
      element.push('comments', element._newReply(
        element.comments[0].id,
        element.comments[0].line,
        element.comments[0].path,
        'it’s pronouced jiff, not giff'));
      flushAsynchronousOperations();

      var draftEl =
          Polymer.dom(element.root).querySelectorAll('gr-diff-comment')[1];
      assert.ok(draftEl);
      draftEl.addEventListener('comment-discard', function() {
        var drafts = element.comments.filter(function(c) {
          return c.__draft == true;
        });
        assert.equal(drafts.length, 0);
        done();
      });
      draftEl.fire('comment-discard', null, {bubbles: false});
    });

    test('first editing comment does not add __otherEditing attribute',
        function(done) {
      var commentEl = element.$$('gr-diff-comment');
      element.comments = [{
        author: {
          name: 'Mr. Peanutbutter',
          email: 'tenn1sballchaser@aol.com',
        },
        id: 'baf0414d_60047215',
        line: 5,
        message: 'is this a crossover episode!?',
        updated: '2015-12-08 19:48:33.843000000',
        __draft: true,
      }];
      flushAsynchronousOperations();

      commentEl.addEventListener('create-reply-comment', function() {
        var editing = element._orderedComments.filter(function(c) {
          return c.__editing == true;
        });
        assert.equal(editing.length, 1);
        assert.equal(!!editing[0].__otherEditing, false);
        done();
      });
      commentEl.fire('create-reply-comment', {comment: commentEl.comment},
          {bubbles: false});
    });

    test('two editing comments adds __otherEditing attribute', function(done) {
      var commentEl = element.$$('gr-diff-comment');
      element.comments = [{
        author: {
          name: 'Mr. Peanutbutter',
          email: 'tenn1sballchaser@aol.com',
        },
        id: 'baf0414d_60047215',
        line: 5,
        message: 'is this a crossover episode!?',
        updated: '2015-12-08 19:48:33.843000000',
        __editing: true,
        __draft: true,
      }];
      flushAsynchronousOperations();

      commentEl.addEventListener('create-reply-comment', function() {
        var editing = element._orderedComments.filter(function(c) {
          return c.__editing == true;
        });
        assert.equal(editing.length, 2);
        assert.equal(editing[1].__otherEditing, true);
        done();
      });
      commentEl.fire('create-reply-comment', {comment: commentEl.comment},
          {bubbles: false});
    });

    test('When editing other comments, local storage set after discard',
        function(done) {
      element.changeNum = '42';
      element.patchNum = '1';
      element.comments = [{
        author: {
          name: 'Mr. Peanutbutter',
          email: 'tenn1sballchaser@aol.com',
        },
        id: 'baf0414d_60047215',
        in_reply_to: 'baf0414d_60047215',
        line: 5,
        message: 'is this a crossover episode!?',
        updated: '2015-12-08 19:48:31.843000000',
      },
      {
        author: {
          name: 'Mr. Peanutbutter',
          email: 'tenn1sballchaser@aol.com',
        },
        __draftID: '1',
        in_reply_to: 'baf0414d_60047215',
        line: 5,
        message: 'yes',
        updated: '2015-12-08 19:48:32.843000000',
        __draft: true,
        __editing: true,
      },
      {
        author: {
          name: 'Mr. Peanutbutter',
          email: 'tenn1sballchaser@aol.com',
        },
        __draftID: '2',
        in_reply_to: 'baf0414d_60047215',
        line: 5,
        message: 'no',
        updated: '2015-12-08 19:48:33.843000000',
        __draft: true,
        __editing: true,
      }];
      var storageStub = sinon.stub(element.$.storage, 'setDraftComment');
      flushAsynchronousOperations();

      var draftEl =
          Polymer.dom(element.root).querySelectorAll('gr-diff-comment')[1];
      assert.ok(draftEl);
      draftEl.addEventListener('comment-discard', function() {
        assert.isTrue(storageStub.called);
        storageStub.restore();
        done();
      });
      draftEl.fire('comment-discard', null, {bubbles: false});
    });

    test('When not editing other comments, local storage not set after discard',
        function(done) {
      element.changeNum = '42';
      element.patchNum = '1';
      element.comments = [{
        author: {
          name: 'Mr. Peanutbutter',
          email: 'tenn1sballchaser@aol.com',
        },
        id: 'baf0414d_60047215',
        line: 5,
        message: 'is this a crossover episode!?',
        updated: '2015-12-08 19:48:31.843000000',
      },
      {
        author: {
          name: 'Mr. Peanutbutter',
          email: 'tenn1sballchaser@aol.com',
        },
        __draftID: '1',
        in_reply_to: 'baf0414d_60047215',
        line: 5,
        message: 'yes',
        updated: '2015-12-08 19:48:32.843000000',
        __draft: true,
        __editing: true,
      },
      {
        author: {
          name: 'Mr. Peanutbutter',
          email: 'tenn1sballchaser@aol.com',
        },
        __draftID: '2',
        in_reply_to: 'baf0414d_60047215',
        line: 5,
        message: 'no',
        updated: '2015-12-08 19:48:33.843000000',
        __draft: true,
      }];
      var storageStub = sinon.stub(element.$.storage, 'setDraftComment');
      flushAsynchronousOperations();

      var draftEl =
          Polymer.dom(element.root).querySelectorAll('gr-diff-comment')[1];
      assert.ok(draftEl);
      draftEl.addEventListener('comment-discard', function() {
        assert.isFalse(storageStub.called);
        storageStub.restore();
        done();
      });
      draftEl.fire('comment-discard', null, {bubbles: false});
    });

    test('comment-update', function() {
      var commentEl = element.$$('gr-diff-comment');
      var updatedComment = {
        id: element.comments[0].id,
        foo: 'bar',
      };
      commentEl.fire('comment-update', {comment: updatedComment});
      assert.strictEqual(element.comments[0], updatedComment);
    });

    suite('jack and sally comment data test consolidation', function() {
      var getComments = function() {
        return Polymer.dom(element.root).querySelectorAll('gr-diff-comment');
      };

      setup(function() {
        element.comments = [
        {
          id: 'jacks_reply',
          message: 'i like you, too',
          in_reply_to: 'sallys_confession',
          updated: '2015-12-25 15:00:20.396000000',
          unresolved: false,
        }, {
          id: 'sallys_confession',
          in_reply_to: 'nonexistent_comment',
          message: 'i like you, jack',
          updated: '2015-12-24 15:00:20.396000000',
        }, {
          id: 'sally_to_dr_finklestein',
          in_reply_to: 'nonexistent_comment',
          message: 'i’m running away',
          updated: '2015-10-31 09:00:20.396000000',
        }, {
          id: 'sallys_defiance',
          message: 'i will poison you so i can get away',
          updated: '2015-10-31 15:00:20.396000000',
        }];
      });

      test('orphan replies', function() {
        assert.equal(4, element._orderedComments.length);
      });

      test('keyboard shortcuts', function() {
        var expandCollapseStub = sinon.stub(element, '_expandCollapseComments');
        MockInteractions.pressAndReleaseKeyOn(element, 69, null, 'e');
        assert.isTrue(expandCollapseStub.lastCall.calledWith(false));

        MockInteractions.pressAndReleaseKeyOn(element, 69, 'shift', 'e');
        assert.isTrue(expandCollapseStub.lastCall.calledWith(true));
        expandCollapseStub.restore();
      });

      test('comment in_reply_to is either null or most recent comment id',
          function() {
        element._createReplyComment(element.comments[3], 'dummy', true);
        flushAsynchronousOperations();
        assert.equal(element._orderedComments.length, 5);
        assert.equal(element._orderedComments[4].in_reply_to, 'jacks_reply');
      });

      test('resolvable comments', function() {
        assert.isFalse(element._unresolved);
        element._createReplyComment(element.comments[3], 'dummy', true, true);
        flushAsynchronousOperations();
        assert.isTrue(element._unresolved);
      });

      test('_setInitialExpandedState', function() {
        element._unresolved = true;
        element._setInitialExpandedState();
        var comments = getComments();
        for (var i = 0; i < element.comments.length; i++) {
          assert.isFalse(element.comments[i].collapsed);
        }
        element._unresolved = false;
        element._setInitialExpandedState();
        var comments = getComments();
        for (var i = 0; i < element.comments.length; i++) {
          assert.isTrue(element.comments[i].collapsed);
        }
      });
    });

    test('_computeHostClass', function() {
      assert.equal(element._computeHostClass(true), 'unresolved');
      assert.equal(element._computeHostClass(false), '');
    });

    test('_newDraft', function() {
      element.commentSide = 'left';
      var draft = element._newDraft();
      assert.equal(draft.__commentSide, 'left');
    });
  });
</script>
