<!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>
