<!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;
    setup(function() {
      stub('gr-rest-api-interface', {
        getLoggedIn: function() { return Promise.resolve(false); },
      });
      element = fixture('basic');
    });

    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',
        }
      ]);
    });
  });

  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');
        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');
        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('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);
    });

    test('orphan replies', 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',
          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',
        }];
      element.comments = comments;
      assert.equal(4, element._orderedComments.length);
    });

    test('keyboard shortcuts', 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',
          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',
        }];
      element.comments = comments;
      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();
    });
  });
</script>
