<!DOCTYPE html>
<!--
@license
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-comment-thread</title>
<script src="/test/common-test-setup.js"></script>
<script src="/bower_components/webcomponentsjs/custom-elements-es5-adapter.js"></script>

<script src="/bower_components/webcomponentsjs/webcomponents-lite.js"></script>
<script src="/bower_components/web-component-tester/browser.js"></script>
<link rel="import" href="../../../test/common-test-setup.html"/>
<script src="../../../scripts/util.js"></script>

<link rel="import" href="gr-comment-thread.html">

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

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

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

<script>
  suite('gr-comment-thread tests', () => {
    let element;
    let sandbox;

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

    teardown(() => {
      sandbox.restore();
    });

    test('comments are sorted correctly', () => {
      const comments = [
        {
          message: 'i like you, too',
          in_reply_to: 'sallys_confession',
          __date: new Date('2015-12-25'),
        }, {
          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',
        },
      ];
      const 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',
        }, {
          message: 'i like you, too',
          in_reply_to: 'sallys_confession',
          __date: new Date('2015-12-25'),
        },
      ]);
    });

    test('addOrEditDraft w/ edit draft', () => {
      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,
      }];
      const commentElStub = sandbox.stub(element, '_commentElWithDraftID',
          () => { return {}; });
      const addDraftStub = sandbox.stub(element, 'addDraft');

      element.addOrEditDraft(123);

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

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

      element.addOrEditDraft(123);

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

    test('_hideActions', () => {
      let showActions = true;
      const lastComment = {};
      assert.equal(element._hideActions(showActions, lastComment), false);
      showActions = false;
      assert.equal(element._hideActions(showActions, lastComment), true);
      showActions = true;
      lastComment.__draft = true;
      assert.equal(element._hideActions(showActions, lastComment), true);
      const robotComment = {};
      robotComment.robot_id = true;
      assert.equal(element._hideActions(showActions, robotComment), true);
    });

    test('setting project name loads the project config', done => {
      const projectName = 'foo/bar/baz';
      const getProjectStub = sandbox.stub(element.$.restAPI, 'getProjectConfig')
          .returns(Promise.resolve({}));
      element.projectName = projectName;
      flush(() => {
        assert.isTrue(getProjectStub.calledWithExactly(projectName));
        done();
      });
    });

    test('optionally show file path', () => {
      // Path info doesn't exist when showFilePath is false. Because it's in a
      // dom-if it is not yet in the dom.
      assert.isNotOk(element.$$('.pathInfo'));

      sandbox.stub(Gerrit.Nav, 'getUrlForDiffById');
      element.changeNum = 123;
      element.projectName = 'test project';
      element.path = 'path/to/file';
      element.patchNum = 3;
      element.lineNum = 5;
      element.showFilePath = true;
      flushAsynchronousOperations();
      assert.isOk(element.$$('.pathInfo'));
      assert.notEqual(getComputedStyle(element.$$('.pathInfo')).display,
          'none');
      assert.isTrue(Gerrit.Nav.getUrlForDiffById.lastCall.calledWithExactly(
          element.changeNum, element.projectName, element.path,
          element.patchNum, null, element.lineNum));
    });

    test('_computeDisplayPath', () => {
      const path = 'path/to/file';
      assert.equal(element._computeDisplayPath(path), 'path/to/file');

      element.lineNum = 5;
      assert.equal(element._computeDisplayPath(path), 'path/to/file#5');
    });
  });

  suite('comment action tests', () => {
    let element;
    let sandbox;

    setup(() => {
      sandbox = sinon.sandbox.create();
      stub('gr-rest-api-interface', {
        getLoggedIn() { return Promise.resolve(false); },
        saveDiffDraft() {
          return Promise.resolve({
            ok: true,
            text() {
              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() { 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',
        path: '/path/to/file.txt',
      }];
      flushAsynchronousOperations();
    });

    teardown(() => {
      sandbox.restore();
    });

    test('reply', () => {
      const commentEl = element.$$('gr-comment');
      const reportStub = sandbox.stub(element.$.reporting,
          'recordDraftInteraction');
      assert.ok(commentEl);

      const replyBtn = element.$.replyBtn;
      MockInteractions.tap(replyBtn);
      flushAsynchronousOperations();

      const drafts = element._orderedComments.filter(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');
      assert.isTrue(reportStub.calledOnce);
    });

    test('quote reply', () => {
      const commentEl = element.$$('gr-comment');
      const reportStub = sandbox.stub(element.$.reporting,
          'recordDraftInteraction');
      assert.ok(commentEl);

      const quoteBtn = element.$.quoteBtn;
      MockInteractions.tap(quoteBtn);
      flushAsynchronousOperations();

      const drafts = element._orderedComments.filter(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');
      assert.isTrue(reportStub.calledOnce);
    });

    test('quote reply multiline', () => {
      const reportStub = sandbox.stub(element.$.reporting,
          'recordDraftInteraction');
      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();

      const commentEl = element.$$('gr-comment');
      assert.ok(commentEl);

      const quoteBtn = element.$.quoteBtn;
      MockInteractions.tap(quoteBtn);
      flushAsynchronousOperations();

      const drafts = element._orderedComments.filter(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');
      assert.isTrue(reportStub.calledOnce);
    });

    test('ack', done => {
      const reportStub = sandbox.stub(element.$.reporting,
          'recordDraftInteraction');
      element.changeNum = '42';
      element.patchNum = '1';

      const commentEl = element.$$('gr-comment');
      assert.ok(commentEl);

      const ackBtn = element.$.ackBtn;
      MockInteractions.tap(ackBtn);
      flush(() => {
        const drafts = element.comments.filter(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');
        assert.equal(drafts[0].unresolved, false);
        assert.isTrue(reportStub.calledOnce);
        done();
      });
    });

    test('done', done => {
      const reportStub = sandbox.stub(element.$.reporting,
          'recordDraftInteraction');
      element.changeNum = '42';
      element.patchNum = '1';
      const commentEl = element.$$('gr-comment');
      assert.ok(commentEl);

      const doneBtn = element.$.doneBtn;
      MockInteractions.tap(doneBtn);
      flush(() => {
        const drafts = element.comments.filter(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);
        assert.isTrue(reportStub.calledOnce);
        done();
      });
    });

    test('save', done => {
      element.changeNum = '42';
      element.patchNum = '1';
      element.path = '/path/to/file.txt';
      const commentEl = element.$$('gr-comment');
      assert.ok(commentEl);

      const saveOrDiscardStub = sandbox.stub();
      element.addEventListener('thread-changed', saveOrDiscardStub);
      element.$$('gr-comment')._fireSave();

      flush(() => {
        assert.isTrue(saveOrDiscardStub.called);
        assert.equal(saveOrDiscardStub.lastCall.args[0].detail.rootId,
            'baf0414d_60047215');
        assert.equal(element.rootId, 'baf0414d_60047215');
        assert.equal(saveOrDiscardStub.lastCall.args[0].detail.path,
            '/path/to/file.txt');
        done();
      });
    });

    test('please fix', done => {
      element.changeNum = '42';
      element.patchNum = '1';
      const commentEl = element.$$('gr-comment');
      assert.ok(commentEl);
      commentEl.addEventListener('create-fix-comment', () => {
        const drafts = element._orderedComments.filter(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', done => {
      element.changeNum = '42';
      element.patchNum = '1';
      element.path = '/path/to/file.txt';
      element.push('comments', element._newReply(
          element.comments[0].id,
          element.comments[0].line,
          element.comments[0].path,
          'it’s pronouced jiff, not giff'));
      flushAsynchronousOperations();

      const saveOrDiscardStub = sandbox.stub();
      element.addEventListener('thread-changed', saveOrDiscardStub);
      const draftEl =
          Polymer.dom(element.root).querySelectorAll('gr-comment')[1];
      assert.ok(draftEl);
      draftEl.addEventListener('comment-discard', () => {
        const drafts = element.comments.filter(c => {
          return c.__draft == true;
        });
        assert.equal(drafts.length, 0);
        assert.isTrue(saveOrDiscardStub.called);
        assert.equal(saveOrDiscardStub.lastCall.args[0].detail.rootId,
            element.rootId);
        assert.equal(saveOrDiscardStub.lastCall.args[0].detail.path,
            element.path);
        done();
      });
      draftEl.fire('comment-discard', {comment: draftEl.comment},
          {bubbles: false});
    });

    test('discard with a single comment still fires event with previous rootId',
        done => {
          element.changeNum = '42';
          element.patchNum = '1';
          element.path = '/path/to/file.txt';
          element.comments = [];
          element.addOrEditDraft('1');
          flushAsynchronousOperations();
          const rootId = element.rootId;
          assert.isOk(rootId);

          const saveOrDiscardStub = sandbox.stub();
          element.addEventListener('thread-changed', saveOrDiscardStub);
          const draftEl =
          Polymer.dom(element.root).querySelectorAll('gr-comment')[0];
          assert.ok(draftEl);
          draftEl.addEventListener('comment-discard', () => {
            assert.equal(element.comments.length, 0);
            assert.isTrue(saveOrDiscardStub.called);
            assert.equal(saveOrDiscardStub.lastCall.args[0].detail.rootId,
                rootId);
            assert.equal(saveOrDiscardStub.lastCall.args[0].detail.path,
                element.path);
            done();
          });
          draftEl.fire('comment-discard', {comment: draftEl.comment},
              {bubbles: false});
        });

    test('first editing comment does not add __otherEditing attribute', () => {
      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,
      }];

      const replyBtn = element.$.replyBtn;
      MockInteractions.tap(replyBtn);
      flushAsynchronousOperations();

      const editing = element._orderedComments.filter(c => {
        return c.__editing == true;
      });
      assert.equal(editing.length, 1);
      assert.equal(!!editing[0].__otherEditing, false);
    });

    test('When not editing other comments, local storage not set' +
        ' after discard', 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,
      }];
      const storageStub = sinon.stub(element.$.storage, 'setDraftComment');
      flushAsynchronousOperations();

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

    test('comment-update', () => {
      const commentEl = element.$$('gr-comment');
      const 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', () => {
      setup(() => {
        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', () => {
        assert.equal(4, element._orderedComments.length);
      });

      test('keyboard shortcuts', () => {
        const 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));
      });

      test('comment in_reply_to is either null or most recent comment', () => {
        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', () => {
        assert.isFalse(element.unresolved);
        element._createReplyComment(element.comments[3], 'dummy', true, true);
        flushAsynchronousOperations();
        assert.isTrue(element.unresolved);
      });

      test('_setInitialExpandedState', () => {
        element.unresolved = true;
        element._setInitialExpandedState();
        for (let i = 0; i < element.comments.length; i++) {
          assert.isFalse(element.comments[i].collapsed);
        }
        element.unresolved = false;
        element._setInitialExpandedState();
        for (let i = 0; i < element.comments.length; i++) {
          assert.isTrue(element.comments[i].collapsed);
        }
        for (let i = 0; i < element.comments.length; i++) {
          element.comments[i].robot_id = 123;
        }
        element._setInitialExpandedState();
        for (let i = 0; i < element.comments.length; i++) {
          assert.isFalse(element.comments[i].collapsed);
        }
      });
    });

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

    test('addDraft sets unresolved state correctly', () => {
      let unresolved = true;
      element.comments = [];
      element.addDraft(null, null, unresolved);
      assert.equal(element.comments[0].unresolved, true);

      unresolved = false; // comment should get added as actually resolved.
      element.comments = [];
      element.addDraft(null, null, unresolved);
      assert.equal(element.comments[0].unresolved, false);

      element.comments = [];
      element.addDraft();
      assert.equal(element.comments[0].unresolved, true);
    });

    test('_newDraft', () => {
      element.commentSide = 'left';
      element.patchNum = 3;
      const draft = element._newDraft();
      assert.equal(draft.__commentSide, 'left');
      assert.equal(draft.patchNum, 3);
    });

    test('new comment gets created', () => {
      element.comments = [];
      element.addOrEditDraft(1);
      assert.equal(element.comments.length, 1);
      // Mock a submitted comment.
      element.comments[0].id = element.comments[0].__draftID;
      element.comments[0].__draft = false;
      element.addOrEditDraft(1);
      assert.equal(element.comments.length, 2);
    });

    test('unresolved label', () => {
      element.unresolved = false;
      assert.isTrue(element.$.unresolvedLabel.hasAttribute('hidden'));
      element.unresolved = true;
      assert.isFalse(element.$.unresolvedLabel.hasAttribute('hidden'));
    });

    test('draft comments are at the end of orderedComments', () => {
      element.comments = [{
        author: {
          name: 'Mr. Peanutbutter',
          email: 'tenn1sballchaser@aol.com',
        },
        id: 2,
        line: 5,
        message: 'Earlier draft',
        updated: '2015-12-08 19:48:33.843000000',
        __draft: true,
      },
      {
        author: {
          name: 'Mr. Peanutbutter2',
          email: 'tenn1sballchaser@aol.com',
        },
        id: 1,
        line: 5,
        message: 'This comment was left last but is not a draft',
        updated: '2015-12-10 19:48:33.843000000',
      },
      {
        author: {
          name: 'Mr. Peanutbutter2',
          email: 'tenn1sballchaser@aol.com',
        },
        id: 3,
        line: 5,
        message: 'Later draft',
        updated: '2015-12-09 19:48:33.843000000',
        __draft: true,
      }];
      assert.equal(element._orderedComments[0].id, '1');
      assert.equal(element._orderedComments[1].id, '2');
      assert.equal(element._orderedComments[2].id, '3');
    });

    test('reflects lineNum and commentSide to attributes', () => {
      element.lineNum = 7;
      element.commentSide = 'left';

      assert.equal(element.getAttribute('line-num'), '7');
      assert.equal(element.getAttribute('comment-side'), 'left');
    });

    test('reflects range to JSON serialized attribute if set', () => {
      element.range = {
        start_line: 4,
        end_line: 5,
        start_character: 6,
        end_character: 7,
      };

      assert.deepEqual(
          JSON.parse(element.getAttribute('range')),
          {start_line: 4, end_line: 5, start_character: 6, end_character: 7});
    });

    test('removes range attribute if range is unset', () => {
      element.range = {
        start_line: 4,
        end_line: 5,
        start_character: 6,
        end_character: 7,
      };
      element.range = undefined;

      assert.notOk(element.hasAttribute('range'));
    });
  });
</script>
