<!DOCTYPE html>
<!--
Copyright (C) 2016 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-rest-api-interface</title>

<script src="../../../bower_components/webcomponentsjs/webcomponents.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-rest-api-interface.html">

<test-fixture id="basic">
  <template>
    <gr-rest-api-interface></gr-rest-api-interface>
  </template>
</test-fixture>

<script>
  suite('gr-rest-api-interface tests', function() {
    var element;
    var sandbox;

    setup(function() {
      sandbox = sinon.sandbox.create();
      element = fixture('basic');
    });

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

    test('JSON prefix is properly removed', function(done) {
      var testJSON = ')]}\'\n{"hello": "bonjour"}';

      sandbox.stub(window, 'fetch', function() {
        return Promise.resolve({
          ok: true,
          text: function() {
            return Promise.resolve(testJSON);
          },
        });
      });
      element.fetchJSON('/dummy/url').then(function(obj) {
        assert.deepEqual(obj, {hello: 'bonjour'});
        done();
      });
    });

    test('cached results', function(done) {
      var n = 0;
      sandbox.stub(element, 'fetchJSON', function() {
        return Promise.resolve(++n);
      });
      var promises = [];
      promises.push(element._fetchSharedCacheURL('/foo'));
      promises.push(element._fetchSharedCacheURL('/foo'));
      promises.push(element._fetchSharedCacheURL('/foo'));

      Promise.all(promises).then(function(results) {
        assert.deepEqual(results, [1, 1, 1]);
        element._fetchSharedCacheURL('/foo').then(function(foo) {
          assert.equal(foo, 1);
          done();
        });
      });
    });

    test('cached promise', function(done) {
      var promise = Promise.reject('foo');
      element._cache['/foo'] = promise;
      element._fetchSharedCacheURL('/foo').catch(function(p) {
        assert.equal(p, 'foo');
        done();
      });
    });

    test('params are properly encoded', function() {
      var url = element._urlWithParams('/path/', {
        sp: 'hola',
        gr: 'guten tag',
        noval: null,
      });
      assert.equal(url, '/path/?sp=hola&gr=guten%20tag&noval');

      url = element._urlWithParams('/path/', {
        sp: 'hola',
        en: ['hey', 'hi'],
      });
      assert.equal(url, '/path/?sp=hola&en=hey&en=hi');

      // Order must be maintained with array params.
      url = element._urlWithParams('/path/', {
        l: ['c', 'b', 'a'],
      });
      assert.equal(url, '/path/?l=c&l=b&l=a');
    });

    test('request callbacks can be canceled', function(done) {
      var cancelCalled = false;
      sandbox.stub(window, 'fetch', function() {
        return Promise.resolve({
          body: {
            cancel: function() { cancelCalled = true; },
          },
        });
      });
      element.fetchJSON('/dummy/url', null, function() { return true; }).then(
        function(obj) {
          assert.isUndefined(obj);
          assert.isTrue(cancelCalled);
          done();
        });
    });

    test('parent diff comments are properly grouped', function(done) {
      sandbox.stub(element, 'fetchJSON', function() {
        return Promise.resolve({
          '/COMMIT_MSG': [],
          'sieve.go': [
            {
              updated: '2017-02-03 22:32:28.000000000',
              message: 'this isn’t quite right',
            },
            {
              side: 'PARENT',
              message: 'how did this work in the first place?',
              updated: '2017-02-03 22:33:28.000000000',
            },
          ],
        });
      });
      element._getDiffComments('42', '', 'PARENT', 1, 'sieve.go').then(
        function(obj) {
          assert.equal(obj.baseComments.length, 1);
          assert.deepEqual(obj.baseComments[0], {
            side: 'PARENT',
            message: 'how did this work in the first place?',
            path: 'sieve.go',
            updated: '2017-02-03 22:33:28.000000000',
          });
          assert.equal(obj.comments.length, 1);
          assert.deepEqual(obj.comments[0], {
            message: 'this isn’t quite right',
            path: 'sieve.go',
            updated: '2017-02-03 22:32:28.000000000',
          });
          done();
        });
    });

    test('_setRange', function() {
      var comments = [
        {
          id: 1,
          side: 'PARENT',
          message: 'how did this work in the first place?',
          updated: '2017-02-03 22:32:28.000000000',
          range: {
            start_line: 1,
            start_character: 1,
            end_line: 2,
            end_character: 1,
          },
        },
        {
          id: 2,
          in_reply_to: 1,
          message: 'this isn’t quite right',
          updated: '2017-02-03 22:33:28.000000000',
        },
      ];
      var expectedResult = {
        id: 2,
        in_reply_to: 1,
        message: 'this isn’t quite right',
        updated: '2017-02-03 22:33:28.000000000',
        range: {
          start_line: 1,
          start_character: 1,
          end_line: 2,
          end_character: 1,
        },
      };
      var comment = comments[1];
      assert.deepEqual(element._setRange(comments, comment), expectedResult);
    });

    test('_setRanges', function() {
      var comments = [
        {
          id: 3,
          in_reply_to: 2,
          message: 'this isn’t quite right either',
          updated: '2017-02-03 22:34:28.000000000',
        },
        {
          id: 2,
          in_reply_to: 1,
          message: 'this isn’t quite right',
          updated: '2017-02-03 22:33:28.000000000',
        },
        {
          id: 1,
          side: 'PARENT',
          message: 'how did this work in the first place?',
          updated: '2017-02-03 22:32:28.000000000',
          range: {
            start_line: 1,
            start_character: 1,
            end_line: 2,
            end_character: 1,
          },
        },
      ];
      var expectedResult = [
        {
          id: 1,
          side: 'PARENT',
          message: 'how did this work in the first place?',
          updated: '2017-02-03 22:32:28.000000000',
          range: {
            start_line: 1,
            start_character: 1,
            end_line: 2,
            end_character: 1,
          },
        },
        {
          id: 2,
          in_reply_to: 1,
          message: 'this isn’t quite right',
          updated: '2017-02-03 22:33:28.000000000',
          range: {
            start_line: 1,
            start_character: 1,
            end_line: 2,
            end_character: 1,
          },
        },
        {
          id: 3,
          in_reply_to: 2,
          message: 'this isn’t quite right either',
          updated: '2017-02-03 22:34:28.000000000',
          range: {
            start_line: 1,
            start_character: 1,
            end_line: 2,
            end_character: 1,
          },
        },
      ];
      assert.deepEqual(element._setRanges(comments), expectedResult);
    });

    test('differing patch diff comments are properly grouped', function(done) {
      sandbox.stub(element, 'fetchJSON', function(url) {
        if (url == '/changes/42/revisions/1') {
          return Promise.resolve({
            '/COMMIT_MSG': [],
            'sieve.go': [
              {
                message: 'this isn’t quite right',
                updated: '2017-02-03 22:32:28.000000000',
              },
              {
                side: 'PARENT',
                message: 'how did this work in the first place?',
                updated: '2017-02-03 22:33:28.000000000',
              },
            ],
          });
        } else if (url == '/changes/42/revisions/2') {
          return Promise.resolve({
            '/COMMIT_MSG': [],
            'sieve.go': [
              {
                message: 'What on earth are you thinking, here?',
                updated: '2017-02-03 22:32:28.000000000',
              },
              {
                side: 'PARENT',
                message: 'Yeah not sure how this worked either?',
                updated: '2017-02-03 22:33:28.000000000',
              },
              {
                message: '¯\\_(ツ)_/¯',
                updated: '2017-02-04 22:33:28.000000000',
              },
            ],
          });
        }
      });
      element._getDiffComments('42', '', 1, 2, 'sieve.go').then(
        function(obj) {
          assert.equal(obj.baseComments.length, 1);
          assert.deepEqual(obj.baseComments[0], {
            message: 'this isn’t quite right',
            path: 'sieve.go',
            updated: '2017-02-03 22:32:28.000000000',
          });
          assert.equal(obj.comments.length, 2);
          assert.deepEqual(obj.comments[0], {
            message: 'What on earth are you thinking, here?',
            path: 'sieve.go',
            updated: '2017-02-03 22:32:28.000000000',
          });
          assert.deepEqual(obj.comments[1], {
            message: '¯\\_(ツ)_/¯',
            path: 'sieve.go',
            updated: '2017-02-04 22:33:28.000000000',
          });
          done();
        });
    });

    test('special file path sorting', function() {
      assert.deepEqual(
          ['.b', '/COMMIT_MSG', '.a', 'file'].sort(
              element.specialFilePathCompare),
          ['/COMMIT_MSG', '.a', '.b', 'file']);

      assert.deepEqual(
          ['.b', '/COMMIT_MSG', 'foo/bar/baz.cc', 'foo/bar/baz.h'].sort(
              element.specialFilePathCompare),
          ['/COMMIT_MSG', '.b', 'foo/bar/baz.h', 'foo/bar/baz.cc']);

      assert.deepEqual(
          ['.b', '/COMMIT_MSG', 'foo/bar/baz.cc', 'foo/bar/baz.hpp'].sort(
              element.specialFilePathCompare),
          ['/COMMIT_MSG', '.b', 'foo/bar/baz.hpp', 'foo/bar/baz.cc']);

      assert.deepEqual(
          ['.b', '/COMMIT_MSG', 'foo/bar/baz.cc', 'foo/bar/baz.hxx'].sort(
              element.specialFilePathCompare),
          ['/COMMIT_MSG', '.b', 'foo/bar/baz.hxx', 'foo/bar/baz.cc']);

      assert.deepEqual(
          ['foo/bar.h', 'foo/bar.hxx', 'foo/bar.hpp'].sort(
              element.specialFilePathCompare),
          ['foo/bar.h', 'foo/bar.hpp', 'foo/bar.hxx']);

      // Regression test for Issue 4448.
      assert.deepEqual([
          'minidump/minidump_memory_writer.cc',
          'minidump/minidump_memory_writer.h',
          'minidump/minidump_thread_writer.cc',
          'minidump/minidump_thread_writer.h',
          ]
        .sort(element.specialFilePathCompare),
          [
            'minidump/minidump_memory_writer.h',
            'minidump/minidump_memory_writer.cc',
            'minidump/minidump_thread_writer.h',
            'minidump/minidump_thread_writer.cc',
          ]);

      // Regression test for Issue 4545.
      assert.deepEqual([
          'task_test.go',
          'task.go',
          ]
        .sort(element.specialFilePathCompare),
          [
            'task.go',
            'task_test.go',
          ]);
    });

    test('rebase always enabled', function(done) {
      var resolveFetchJSON;
      sandbox.stub(element, 'fetchJSON').returns(
          new Promise(function(resolve) {
            resolveFetchJSON = resolve;
          }));
      element.getChangeRevisionActions('42', '1337').then(
          function(response) {
            assert.isTrue(response.rebase.enabled);
            done();
          });
      resolveFetchJSON({rebase: {}});
    });

    test('server error', function(done) {
      var getResponseObjectStub = sandbox.stub(element, 'getResponseObject');
      sandbox.stub(window, 'fetch', function() {
        return Promise.resolve({ok: false});
      });
      var serverErrorEventPromise = new Promise(function(resolve) {
        element.addEventListener('server-error', function() { resolve(); });
      });

      element.fetchJSON().then(
          function(response) {
            assert.isUndefined(response);
            assert.isTrue(getResponseObjectStub.notCalled);
            serverErrorEventPromise.then(function() {
              done();
            });
          });
    });

    test('refreshCredentials', function(done) {
      var responses = [
        {
          ok: false,
          status: 403,
          text: function() { return Promise.resolve(); },
        },
        {
          ok: true,
          status: 200,
          text: function() { return Promise.resolve(')]}\'{}'); },
        },
      ];
      sandbox.stub(window, 'fetch', function(url) {
        if (url === '/accounts/self/detail') {
          return Promise.resolve(responses.shift());
        }
      });
      element.getLoggedIn().then(function(isLoggedIn) {
        assert.isFalse(isLoggedIn);
        element.refreshCredentials().then(function(isRefreshed) {
          assert.isTrue(isRefreshed);
          done();
        });
      });
    });

    test('legacy n,z key in change url is replaced', function() {
      var stub = sandbox.stub(element, 'fetchJSON');
      element.getChanges(1, null, 'n,z');
      assert.equal(stub.args[0][3].S, 0);
    });

    test('saveDiffPreferences invalidates cache line', function() {
      var cacheKey = '/accounts/self/preferences.diff';
      sandbox.stub(element, 'send');
      element._cache[cacheKey] = {tab_size: 4};
      element.saveDiffPreferences({tab_size: 8});
      assert.isTrue(element.send.called);
      assert.notOk(element._cache[cacheKey]);
    });

    var preferenceSetup = function(testJSON, loggedIn, smallScreen) {
      sandbox.stub(element, 'getLoggedIn', function() {
        return Promise.resolve(loggedIn);
      });
      sandbox.stub(element, '_isNarrowScreen', function() {
        return smallScreen;
      });
      sandbox.stub(element, '_fetchSharedCacheURL', function() {
        return Promise.resolve(testJSON);
      });
    };

    test('getPreferences returns correctly on small screens logged in',
        function(done) {

      var testJSON = {diff_view: 'SIDE_BY_SIDE'};
      var loggedIn = true;
      var smallScreen = true;

      preferenceSetup(testJSON, loggedIn, smallScreen);

      element.getPreferences().then(function(obj) {
        assert.equal(obj.default_diff_view, 'UNIFIED_DIFF');
        assert.equal(obj.diff_view, 'SIDE_BY_SIDE');
        done();
      });
    });

    test('getPreferences returns correctly on small screens not logged in',
          function(done) {

      var testJSON = {diff_view: 'SIDE_BY_SIDE'};
      var loggedIn = false;
      var smallScreen = true;

      preferenceSetup(testJSON, loggedIn, smallScreen);
      element.getPreferences().then(function(obj) {
        assert.equal(obj.default_diff_view, 'UNIFIED_DIFF');
        assert.equal(obj.diff_view, 'SIDE_BY_SIDE');
        done();
      });
    });

    test('getPreferences returns correctly on larger screens logged in',
        function(done) {
      var testJSON = {diff_view: 'UNIFIED_DIFF'};
      var loggedIn = true;
      var smallScreen = false;

      preferenceSetup(testJSON, loggedIn, smallScreen);

      element.getPreferences().then(function(obj) {
        assert.equal(obj.default_diff_view, 'UNIFIED_DIFF');
        assert.equal(obj.diff_view, 'UNIFIED_DIFF');
        done();
      });
    });

    test('getPreferences returns correctly on larger screens not logged in',
        function(done) {
      var testJSON = {diff_view: 'UNIFIED_DIFF'};
      var loggedIn = false;
      var smallScreen = false;

      preferenceSetup(testJSON, loggedIn, smallScreen);

      element.getPreferences().then(function(obj) {
        assert.equal(obj.default_diff_view, 'SIDE_BY_SIDE');
        assert.equal(obj.diff_view, 'SIDE_BY_SIDE');
        done();
      });
    });

    test('savPreferences normalizes download scheme', function() {
      sandbox.stub(element, 'send');
      element.savePreferences({download_scheme: 'HTTP'});
      assert.isTrue(element.send.called);
      assert.equal(element.send.lastCall.args[2].download_scheme, 'http');
    });

    test('confirmEmail', function() {
      sandbox.spy(element, 'send');
      element.confirmEmail('foo');
      assert.isTrue(element.send.calledWith(
          'PUT', '/config/server/email.confirm', {token: 'foo'}));
    });

    test('GrReviewerUpdatesParser.parse is used', function(done) {
      sandbox.stub(GrReviewerUpdatesParser, 'parse').returns(
          Promise.resolve('foo'));
      element.getChangeDetail(42).then(function(result) {
        assert.isTrue(GrReviewerUpdatesParser.parse.calledOnce);
        assert.equal(result, 'foo');
        done();
      });
    });

    test('setAccountStatus', function(done) {
      sandbox.stub(element, 'send').returns(Promise.resolve('OOO'));
      sandbox.stub(element, 'getResponseObject')
          .returns(Promise.resolve('OOO'));
      element._cache['/accounts/self/detail'] = {};
      element.setAccountStatus('OOO').then(function() {
        assert.isTrue(element.send.calledWith('PUT', '/accounts/self/status',
            {status: 'OOO'}));
        assert.deepEqual(element._cache['/accounts/self/detail'],
            {status: 'OOO'});
        done();
      });
    });

    test('_sendDiffDraft pending requests tracked', function(done) {
      sandbox.stub(element, 'send', function() {
        assert.equal(element._pendingRequests.sendDiffDraft, 1);
        return Promise.resolve([]);
      });
      element.saveDiffDraft('', 1, 1).then(function() {
        assert.equal(element._pendingRequests.sendDiffDraft, 0);
        element.deleteDiffDraft('', 1, 1).then(function() {
          assert.equal(element._pendingRequests.sendDiffDraft, 0);
          done();
        });
      });
    });
  });
</script>
