<!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-file-list</title>

<script src="../bower_components/webcomponentsjs/webcomponents.min.js"></script>
<script src="../bower_components/web-component-tester/browser.js"></script>
<script src="../bower_components/page/page.js"></script>
<script src="../scripts/fake-app.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="../elements/gr-file-list.html">

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

<script>
  suite('gr-file-list tests', function() {
    var element;
    var server;

    setup(function() {
      element = fixture('basic');
      server = sinon.fakeServer.create();
      server.respondWith(
        'GET',
        '/changes/42/revisions/1/files',
        [
          200,
          {'Content-Type': 'application/json'},
          ')]}\'\n' +
          JSON.stringify({
            '/COMMIT_MSG': {
              status: 'A',
              lines_inserted: 9,
              size_delta: 317,
              size: 317
            },
            'myfile.txt': {
              lines_inserted: 35,
              size_delta: 1146,
              size: 1167
            }
          }),
        ]
      );
      server.respondWith(
        'GET',
        '/changes/42/revisions/2/files',
        [
          200,
          {'Content-Type': 'application/json'},
          ')]}\'\n' +
          JSON.stringify({
            '/COMMIT_MSG': {
              status: 'A',
              lines_inserted: 9,
              size_delta: 317,
              size: 317
            },
            'myfile.txt': {
              lines_inserted: 35,
              size_delta: 1146,
              size: 1167
            },
            'file_added_in_rev2.txt': {
              lines_inserted: 98,
              size_delta: 234,
              size: 136
            }
          }),
        ]
      );
      server.respondWith(
        'GET',
        '/changes/42/revisions/1/drafts',
        [
          200,
          {'Content-Type': 'application/json'},
          ')]}\'\n' +
          '{}',
        ]
      );
      server.respondWith(
        'GET',
        '/changes/42/revisions/2/drafts',
        [
          200,
          {'Content-Type': 'application/json'},
          ')]}\'\n' +
          '{}',
        ]
      );
      server.respondWith(
        'GET',
        '/changes/42/revisions/1/files?reviewed',
        [
          200,
          {'Content-Type': 'application/json'},
          ')]}\'\n' +
          '["/COMMIT_MSG"]',
        ]
      );
      server.respondWith(
        'GET',
        '/changes/42/revisions/2/files?reviewed',
        [
          200,
          {'Content-Type': 'application/json'},
          ')]}\'\n' +
          '["/COMMIT_MSG","myfile.txt"]',
        ]
      );
      server.respondWith(
        'PUT',
        '/changes/42/revisions/2/files/%2FCOMMIT_MSG/reviewed',
        [
          201,
          {'Content-Type': 'application/json'},
          ')]}\'\n' +
          '""',
        ]
      );
      server.respondWith(
        'DELETE',
        '/changes/42/revisions/2/files/%2FCOMMIT_MSG/reviewed',
        [
          204,
          {'Content-Type': 'application/json'},
          '',
        ]
      );

      app.loggedIn = true;
    });

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

    test('requests', function(done) {
      element.changeNum = '42';
      element.patchNum = '1';
      element.reload();
      server.respond();

      element.async(function() {
        var filenames = element.files.map(function(f) {
          return f.__path;
        });
        assert.deepEqual(filenames, ['/COMMIT_MSG', 'myfile.txt']);
        assert.deepEqual(element._reviewed, ['/COMMIT_MSG']);

        element.patchNum = '2';
        element.reload();
        server.respond();
        element.async(function() {
          filenames = element.files.map(function(f) {
            return f.__path;
          });
          assert.deepEqual(filenames,
              ['/COMMIT_MSG', 'file_added_in_rev2.txt', 'myfile.txt']);
          assert.deepEqual(element._reviewed, ['/COMMIT_MSG', 'myfile.txt']);
          done();
        }, 1);
      }, 1);
    });

    test('keyboard shortcuts', function(done) {
      element.changeNum = '42';
      element.patchNum = '2';
      element.selectedIndex = 0;
      element.reload();
      server.respond();

      element.async(function() {
        var elementItems = Polymer.dom(element.root).querySelectorAll(
            '.row:not(.header)');
        assert.equal(elementItems.length, 3);
        assert.isTrue(elementItems[0].hasAttribute('selected'));
        assert.isFalse(elementItems[1].hasAttribute('selected'));
        assert.isFalse(elementItems[2].hasAttribute('selected'));
        MockInteractions.pressAndReleaseKeyOn(element, 74);  // 'j'
        assert.equal(element.selectedIndex, 1);
        MockInteractions.pressAndReleaseKeyOn(element, 74);  // 'j'

        var showStub = sinon.stub(page, 'show');
        assert.equal(element.selectedIndex, 2);
        MockInteractions.pressAndReleaseKeyOn(element, 13);  // 'enter'
        assert(showStub.lastCall.calledWith('/c/42/2/myfile.txt'),
            'Should navigate to /c/42/2/myfile.txt');

        MockInteractions.pressAndReleaseKeyOn(element, 75);  // 'k'
        assert.equal(element.selectedIndex, 1);
        MockInteractions.pressAndReleaseKeyOn(element, 79);  // 'o'
        assert(showStub.lastCall.calledWith('/c/42/2/file_added_in_rev2.txt'),
            'Should navigate to /c/42/2/file_added_in_rev2.txt');

        MockInteractions.pressAndReleaseKeyOn(element, 75);  // 'k'
        MockInteractions.pressAndReleaseKeyOn(element, 75);  // 'k'
        MockInteractions.pressAndReleaseKeyOn(element, 75);  // 'k'
        assert.equal(element.selectedIndex, 0);

        showStub.restore();
        done();
      }, 1);
    });

    test('comment filtering', function() {
      var comments = {
        '/COMMIT_MSG': [
          {patch_set: 1, message: 'Done'},
          {patch_set: 1, message: 'oh hay'},
          {patch_set: 2, message: 'hello'},
        ],
        'myfile.txt': [
          {patch_set: 1, message: 'good news!'},
          {patch_set: 2, message: 'wat!?'},
          {patch_set: 2, message: 'hi'},
        ],
      };
      assert.equal(
          element._computeCommentsString(comments, '1', '/COMMIT_MSG'),
          '2 comments');
      assert.equal(
          element._computeCommentsString(comments, '1', 'myfile.txt'),
          '1 comment');
      assert.equal(
          element._computeCommentsString(comments, '1',
              'file_added_in_rev2.txt'),
          '');
      assert.equal(
          element._computeCommentsString(comments, '2', '/COMMIT_MSG'),
          '1 comment');
      assert.equal(
          element._computeCommentsString(comments, '2', 'myfile.txt'),
          '2 comments');
      assert.equal(
          element._computeCommentsString(comments, '2',
              'file_added_in_rev2.txt'),
          '');
    });

    test('computed properties', function() {
      assert.equal(element._computeFileStatus('A'), 'A');
      assert.equal(element._computeFileStatus(undefined), 'M');
      assert.equal(element._computeFileStatus(null), 'M');

      assert.equal(element._computeFileDisplayName('/foo/bar/baz'),
          '/foo/bar/baz');
      assert.equal(element._computeFileDisplayName('/COMMIT_MSG'),
          'Commit message');

      assert.equal(element._computeClass('clazz', '/foo/bar/baz'), 'clazz');
      assert.equal(element._computeClass('clazz', '/COMMIT_MSG'),
          'clazz invisible');
    });

    test('file review status', function(done) {
      element.changeNum = '42';
      element.patchNum = '2';
      element.reload();
      server.respond();

      element.async(function() {
        var fileRows =
            Polymer.dom(element.root).querySelectorAll('.row:not(.header)');
        var commitMsg = fileRows[0].querySelector('input[type="checkbox"]');
        var fileAdded = fileRows[1].querySelector('input[type="checkbox"]');
        var myFile = fileRows[2].querySelector('input[type="checkbox"]');

        assert.isTrue(commitMsg.checked);
        assert.isFalse(fileAdded.checked);
        assert.isTrue(myFile.checked);

        assert.equal(element._reviewed.length, 2);

        MockInteractions.tap(commitMsg);
        server.respond();
        element._xhrPromise.then(function(req) {
          assert.equal(element._reviewed.length, 1);
          assert.equal(req.status, 204);
          assert.equal(req.url,
              '/changes/42/revisions/2/files/%2FCOMMIT_MSG/reviewed');

          MockInteractions.tap(commitMsg);
          server.respond();
        }).then(function() {
          element._xhrPromise.then(function(req) {
            assert.equal(element._reviewed.length, 2);
            assert.equal(req.status, 201);
            assert.equal(req.url,
                '/changes/42/revisions/2/files/%2FCOMMIT_MSG/reviewed');

            done();
          });
        });
      }, 1);
    });
  });
</script>
