<!DOCTYPE html>
<!--
@license
Copyright (C) 2018 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-thread-list</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"/>
<link rel="import" href="gr-thread-list.html">

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

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

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

    setup(() => {
      sandbox = sinon.sandbox.create();
      element = fixture('basic');
      element.threads = [
        {
          comments: [
            {
              __path: '/COMMIT_MSG',
              author: {
                _account_id: 1000000,
                name: 'user',
                username: 'user',
              },
              patch_set: 4,
              id: 'ecf0b9fa_fe1a5f62',
              line: 5,
              updated: '2018-02-08 18:49:18.000000000',
              message: 'test',
              unresolved: true,
            },
            {
              id: '503008e2_0ab203ee',
              path: '/COMMIT_MSG',
              line: 5,
              in_reply_to: 'ecf0b9fa_fe1a5f62',
              updated: '2018-02-13 22:48:48.018000000',
              message: 'draft',
              unresolved: false,
              __draft: true,
              __draftID: '0.m683trwff68',
              __editing: false,
              patch_set: '2',
            },
          ],
          patchNum: 4,
          path: '/COMMIT_MSG',
          line: 5,
          rootId: 'ecf0b9fa_fe1a5f62',
          start_datetime: '2018-02-08 18:49:18.000000000',
        },
        {
          comments: [
            {
              __path: 'test.txt',
              author: {
                _account_id: 1000000,
                name: 'user',
                username: 'user',
              },
              patch_set: 3,
              id: '09a9fb0a_1484e6cf',
              side: 'PARENT',
              updated: '2018-02-13 22:47:19.000000000',
              message: 'Some comment on another patchset.',
              unresolved: false,
            },
          ],
          patchNum: 3,
          path: 'test.txt',
          rootId: '09a9fb0a_1484e6cf',
          start_datetime: '2018-02-13 22:47:19.000000000',
          commentSide: 'PARENT',
        },
        {
          comments: [
            {
              __path: '/COMMIT_MSG',
              author: {
                _account_id: 1000000,
                name: 'user',
                username: 'user',
              },
              patch_set: 2,
              id: '8caddf38_44770ec1',
              line: 4,
              updated: '2018-02-13 22:48:40.000000000',
              message: 'Another unresolved comment',
              unresolved: true,
            },
          ],
          patchNum: 2,
          path: '/COMMIT_MSG',
          line: 4,
          rootId: '8caddf38_44770ec1',
          start_datetime: '2018-02-13 22:48:40.000000000',
        },
        {
          comments: [
            {
              __path: '/COMMIT_MSG',
              author: {
                _account_id: 1000000,
                name: 'user',
                username: 'user',
              },
              patch_set: 2,
              id: 'scaddf38_44770ec1',
              line: 4,
              updated: '2018-02-14 22:48:40.000000000',
              message: 'Yet another unresolved comment',
              unresolved: true,
            },
          ],
          patchNum: 2,
          path: '/COMMIT_MSG',
          line: 4,
          rootId: 'scaddf38_44770ec1',
          start_datetime: '2018-02-14 22:48:40.000000000',
        },
        {
          comments: [
            {
              id: 'zcf0b9fa_fe1a5f62',
              path: '/COMMIT_MSG',
              line: 6,
              updated: '2018-02-15 22:48:48.018000000',
              message: 'resolved draft',
              unresolved: false,
              __draft: true,
              __draftID: '0.m683trwff68',
              __editing: false,
              patch_set: '2',
            },
          ],
          patchNum: 4,
          path: '/COMMIT_MSG',
          line: 6,
          rootId: 'zcf0b9fa_fe1a5f62',
          start_datetime: '2018-02-09 18:49:18.000000000',
        },
        {
          comments: [
            {
              __path: '/COMMIT_MSG',
              author: {
                _account_id: 1000000,
                name: 'user',
                username: 'user',
              },
              patch_set: 4,
              id: 'rc1',
              line: 5,
              updated: '2019-02-08 18:49:18.000000000',
              message: 'test',
              unresolved: true,
              robot_id: 'rc1',
            },
          ],
          patchNum: 4,
          path: '/COMMIT_MSG',
          line: 5,
          rootId: 'rc1',
          start_datetime: '2019-02-08 18:49:18.000000000',
        },
        {
          comments: [
            {
              __path: '/COMMIT_MSG',
              author: {
                _account_id: 1000000,
                name: 'user',
                username: 'user',
              },
              patch_set: 4,
              id: 'rc2',
              line: 5,
              updated: '2019-03-08 18:49:18.000000000',
              message: 'test',
              unresolved: true,
              robot_id: 'rc2',
            },
            {
              __path: '/COMMIT_MSG',
              author: {
                _account_id: 1000000,
                name: 'user',
                username: 'user',
              },
              patch_set: 4,
              id: 'c2_1',
              line: 5,
              updated: '2019-03-08 18:49:18.000000000',
              message: 'test',
              unresolved: true,
            },
          ],
          patchNum: 4,
          path: '/COMMIT_MSG',
          line: 5,
          rootId: 'rc2',
          start_datetime: '2019-03-08 18:49:18.000000000',
        },
      ];
      flushAsynchronousOperations();
      threadElements = Polymer.dom(element.root)
          .querySelectorAll('gr-comment-thread');
    });

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

    test('draft toggle only appears when logged in', () => {
      assert.equal(getComputedStyle(element.$$('.draftToggle')).display,
          'none');
      element.loggedIn = true;
      assert.notEqual(getComputedStyle(element.$$('.draftToggle')).display,
          'none');
    });

    test('there are five threads by default', () => {
      assert.equal(Polymer.dom(element.root)
          .querySelectorAll('gr-comment-thread').length, 5);
    });

    test('_computeSortedThreads', () => {
      assert.equal(element._sortedThreads.length, 7);
      // Draft and unresolved
      assert.equal(element._sortedThreads[0].thread.rootId,
          'ecf0b9fa_fe1a5f62');
      // Unresolved robot comment
      assert.equal(element._sortedThreads[1].thread.rootId,
          'rc2');
      // Unresolved robot comment
      assert.equal(element._sortedThreads[2].thread.rootId,
          'rc1');
      // unresolved
      assert.equal(element._sortedThreads[3].thread.rootId,
          'scaddf38_44770ec1');
      // unresolved
      assert.equal(element._sortedThreads[4].thread.rootId,
          '8caddf38_44770ec1');
      // resolved and draft
      assert.equal(element._sortedThreads[5].thread.rootId,
          'zcf0b9fa_fe1a5f62');
      // resolved
      assert.equal(element._sortedThreads[6].thread.rootId,
          '09a9fb0a_1484e6cf');
    });

    test('filtered threads do not contain robot comments without reply', () => {
      const thread = element.threads.find(thread => thread.rootId === 'rc1');
      assert.equal(element._filteredThreads.includes(thread), false);
    });

    test('filtered threads contains robot comments with reply', () => {
      const thread = element.threads.find(thread => thread.rootId === 'rc2');
      assert.equal(element._filteredThreads.includes(thread), true);
    });


    test('thread removal', () => {
      threadElements[1].fire('thread-discard', {rootId: 'rc2'});
      flushAsynchronousOperations();
      assert.equal(element._sortedThreads.length, 6);
      assert.equal(element._sortedThreads[0].thread.rootId,
          'ecf0b9fa_fe1a5f62');
      // Unresolved robot comment
      assert.equal(element._sortedThreads[1].thread.rootId,
          'rc1');
      // unresolved
      assert.equal(element._sortedThreads[2].thread.rootId,
          'scaddf38_44770ec1');
      // unresolved
      assert.equal(element._sortedThreads[3].thread.rootId,
          '8caddf38_44770ec1');
      // resolved and draft
      assert.equal(element._sortedThreads[4].thread.rootId,
          'zcf0b9fa_fe1a5f62');
      // resolved
      assert.equal(element._sortedThreads[5].thread.rootId,
          '09a9fb0a_1484e6cf');
    });

    test('toggle unresolved only shows unresolved comments', () => {
      MockInteractions.tap(element.$.unresolvedToggle);
      flushAsynchronousOperations();
      assert.equal(Polymer.dom(element.root)
          .querySelectorAll('gr-comment-thread').length, 5);
    });

    test('toggle drafts only shows threads with draft comments', () => {
      MockInteractions.tap(element.$.draftToggle);
      flushAsynchronousOperations();
      assert.equal(Polymer.dom(element.root)
          .querySelectorAll('gr-comment-thread').length, 2);
    });

    test('toggle drafts and unresolved only shows threads with drafts and ' +
        'publicly unresolved ', () => {
      MockInteractions.tap(element.$.draftToggle);
      MockInteractions.tap(element.$.unresolvedToggle);
      flushAsynchronousOperations();
      assert.equal(Polymer.dom(element.root)
          .querySelectorAll('gr-comment-thread').length, 2);
    });

    test('modification events are consumed and displatched', () => {
      sandbox.spy(element, '_handleCommentsChanged');
      const dispatchSpy = sandbox.stub();
      element.addEventListener('thread-list-modified', dispatchSpy);
      threadElements[0].fire('thread-changed', {
        rootId: 'ecf0b9fa_fe1a5f62', path: '/COMMIT_MSG'});
      assert.isTrue(element._handleCommentsChanged.called);
      assert.isTrue(dispatchSpy.called);
      assert.equal(dispatchSpy.lastCall.args[0].detail.rootId,
          'ecf0b9fa_fe1a5f62');
      assert.equal(dispatchSpy.lastCall.args[0].detail.path, '/COMMIT_MSG');
    });
  });
</script>
