<!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-api-interface</title>

<script src="../../../bower_components/webcomponentsjs/webcomponents.min.js"></script>
<script src="../../../bower_components/web-component-tester/browser.js"></script>
<link rel="import" href="gr-js-api-interface.html">

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

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

    var throwErrFn = function() {
      throw Error('Unfortunately, this handler has stopped');
    };

    setup(function() {
      sandbox = sinon.sandbox.create();
      stub('gr-rest-api-interface', {
        getAccount: function() {
          return Promise.resolve({name: 'Judy Hopps'});
        },
      });
      element = fixture('basic');
      errorStub = sandbox.stub(console, 'error');
      Gerrit._setPluginsCount(1);
      Gerrit.install(function(p) { plugin = p; }, '0.1',
          'http://test.com/plugins/testplugin/static/test.js');
    });

    teardown(function() {
      sandbox.restore();
      element._removeEventCallbacks();
      plugin = null;
    });

    test('url', function() {
      assert.equal(plugin.url(), 'http://test.com/plugins/testplugin/');
      assert.equal(plugin.url('/static/test.js'),
          'http://test.com/plugins/testplugin/static/test.js');
    });

    test('history event', function(done) {
      plugin.on(element.EventType.HISTORY, throwErrFn);
      plugin.on(element.EventType.HISTORY, function(path) {
        assert.equal(path, '/path/to/awesomesauce');
        assert.isTrue(errorStub.calledOnce);
        done();
      });
      element.handleEvent(element.EventType.HISTORY,
          {path: '/path/to/awesomesauce'});
    });

    test('showchange event', function(done) {
      var testChange = {
        _number: 42,
        revisions: {def: {_number: 2}, abc: {_number: 1}},
      };
      plugin.on(element.EventType.SHOW_CHANGE, throwErrFn);
      plugin.on(element.EventType.SHOW_CHANGE, function(change, revision) {
        assert.deepEqual(change, testChange);
        assert.deepEqual(revision, testChange.revisions.abc);
        assert.isTrue(errorStub.calledOnce);
        done();
      });
      element.handleEvent(element.EventType.SHOW_CHANGE,
          {change: testChange, patchNum: 1});
    });

    test('handleEvent awaits plugins load', function(done) {
      var testChange = {
        _number: 42,
        revisions: {def: {_number: 2}, abc: {_number: 1}},
      };
      var spy = sandbox.spy();
      Gerrit._setPluginsCount(1);
      plugin.on(element.EventType.SHOW_CHANGE, spy);
      element.handleEvent(element.EventType.SHOW_CHANGE,
          {change: testChange, patchNum: 1});
      assert.isFalse(spy.called);
      Gerrit._setPluginsCount(0);
      flush(function() {
        assert.isTrue(spy.called);
        done();
      });
    });

    test('comment event', function(done) {
      var testCommentNode = {foo: 'bar'};
      plugin.on(element.EventType.COMMENT, throwErrFn);
      plugin.on(element.EventType.COMMENT, function(commentNode) {
        assert.deepEqual(commentNode, testCommentNode);
        assert.isTrue(errorStub.calledOnce);
        done();
      });
      element.handleEvent(element.EventType.COMMENT, {node: testCommentNode});
    });

    test('revert event', function() {
      function appendToRevertMsg(c, revertMsg, originalMsg) {
        return revertMsg + '\n' + originalMsg.replace(/^/gm, '> ') + '\ninfo';
      }

      assert.equal(element.modifyRevertMsg(null, 'test', 'origTest'), 'test');
      assert.equal(errorStub.callCount, 0);

      plugin.on(element.EventType.REVERT, throwErrFn);
      plugin.on(element.EventType.REVERT, appendToRevertMsg);
      assert.equal(element.modifyRevertMsg(null, 'test', 'origTest'),
                   'test\n> origTest\ninfo');
      assert.isTrue(errorStub.calledOnce);

      plugin.on(element.EventType.REVERT, appendToRevertMsg);
      assert.equal(element.modifyRevertMsg(null, 'test', 'origTest'),
                   'test\n> origTest\ninfo\n> origTest\ninfo');
      assert.isTrue(errorStub.calledTwice);
    });

    test('postrevert event', function() {
      function getLabels(c) {
        return {'Code-Review': 1};
      }

      assert.deepEqual(element.getLabelValuesPostRevert(null), {});
      assert.equal(errorStub.callCount, 0);

      plugin.on(element.EventType.POST_REVERT, throwErrFn);
      plugin.on(element.EventType.POST_REVERT, getLabels);
      assert.deepEqual(
          element.getLabelValuesPostRevert(null), {'Code-Review': 1});
      assert.isTrue(errorStub.calledOnce);
    });

    test('commitmsgedit event', function(done) {
      var testMsg = 'Test CL commit message';
      plugin.on(element.EventType.COMMIT_MSG_EDIT, throwErrFn);
      plugin.on(element.EventType.COMMIT_MSG_EDIT, function(change, msg) {
        assert.deepEqual(msg, testMsg);
        assert.isTrue(errorStub.calledOnce);
        done();
      });
      element.handleCommitMessage(null, testMsg);
    });

    test('labelchange event', function(done) {
      var testChange = {_number: 42};
      plugin.on(element.EventType.LABEL_CHANGE, throwErrFn);
      plugin.on(element.EventType.LABEL_CHANGE, function(change) {
        assert.deepEqual(change, testChange);
        assert.isTrue(errorStub.calledOnce);
        done();
      });
      element.handleEvent(element.EventType.LABEL_CHANGE, {change: testChange});
    });

    test('submitchange', function() {
      plugin.on(element.EventType.SUBMIT_CHANGE, throwErrFn);
      plugin.on(element.EventType.SUBMIT_CHANGE, function() { return true; });
      assert.isTrue(element.canSubmitChange());
      assert.isTrue(errorStub.calledOnce);
      plugin.on(element.EventType.SUBMIT_CHANGE, function() { return false; });
      plugin.on(element.EventType.SUBMIT_CHANGE, function() { return true; });
      assert.isFalse(element.canSubmitChange());
      assert.isTrue(errorStub.calledTwice);
    });

    test('versioning', function() {
      var callback = sandbox.spy();
      Gerrit.install(callback, '0.0pre-alpha');
      assert(callback.notCalled);
    });

    test('getAccount', function(done) {
      Gerrit.getLoggedIn().then(function(loggedIn) {
        assert.isTrue(loggedIn);
        done();
      });
    });

    test('_setPluginsCount', function(done) {
      stub('gr-reporting', {
        pluginsLoaded: function() {
          assert.equal(Gerrit._pluginsPending, 0);
          done();
        }
      });
      Gerrit._setPluginsCount(0);
    });

    test('_arePluginsLoaded', function() {
      assert.isTrue(Gerrit._arePluginsLoaded());
      Gerrit._setPluginsCount(1);
      assert.isFalse(Gerrit._arePluginsLoaded());
      Gerrit._setPluginsCount(0);
      assert.isTrue(Gerrit._arePluginsLoaded());
    });

    test('_pluginInstalled', function(done) {
      stub('gr-reporting', {
        pluginsLoaded: function() {
          assert.equal(Gerrit._pluginsPending, 0);
          done();
        }
      });
      Gerrit._setPluginsCount(2);
      Gerrit._pluginInstalled();
      assert.equal(Gerrit._pluginsPending, 1);
      Gerrit._pluginInstalled();
    });

    test('install calls _pluginInstalled', function() {
      sandbox.stub(Gerrit, '_pluginInstalled');
      Gerrit.install(function(p) { plugin = p; }, '0.1',
          'http://test.com/plugins/testplugin/static/test.js');
      assert.isTrue(Gerrit._pluginInstalled.calledOnce);
    });

    test('install calls _pluginInstalled on error', function() {
      sandbox.stub(Gerrit, '_pluginInstalled');
      Gerrit.install(function() {}, '0.0pre-alpha');
      assert.isTrue(Gerrit._pluginInstalled.calledOnce);
    });

    test('installGwt calls _pluginInstalled', function() {
      sandbox.stub(Gerrit, '_pluginInstalled');
      Gerrit.installGwt();
      assert.isTrue(Gerrit._pluginInstalled.calledOnce);
    });

    test('installGwt returns a stub object', function() {
      var plugin = Gerrit.installGwt();
      sandbox.stub(console, 'warn');
      assert.isAbove(Object.keys(plugin).length, 0);
      Object.keys(plugin).forEach(function(name) {
        console.warn.reset();
        plugin[name]();
        assert.isTrue(console.warn.calledOnce);
      });
    });
  });
</script>
