<!DOCTYPE html>
<!--
@license
Copyright (C) 2017 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-plugin-host</title>

<script src="../../../bower_components/webcomponentsjs/webcomponents-lite.min.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-plugin-host.html">

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

<test-fixture id="basic">
  <template>
    <gr-plugin-host></gr-plugin-host>
  </template>
</test-fixture>

<script>
  suite('gr-diff tests', () => {
    let element;
    let sandbox;
    let url;

    setup(() => {
      element = fixture('basic');
      sandbox = sinon.sandbox.create();
      sandbox.stub(document.body, 'appendChild');
      sandbox.stub(element, 'importHref');
      url = window.location.href.split(window.location.pathname)[0];
    });

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

    test('counts plugins', () => {
      sandbox.stub(Gerrit, '_setPluginsCount');
      element.config = {
        plugin: {
          html_resource_paths: ['foo/bar', 'baz'],
          js_resource_paths: ['42'],
        },
      };
      assert.isTrue(Gerrit._setPluginsCount.calledWith(3));
    });

    test('imports relative html plugins from config', () => {
      sandbox.stub(Gerrit, '_pluginInstallError');
      element.config = {
        plugin: {html_resource_paths: ['foo/bar', 'baz']},
      };
      assert.equal(element.importHref.firstCall.args[0], url + '/foo/bar');
      assert.isTrue(element.importHref.firstCall.args[3]);

      assert.equal(element.importHref.secondCall.args[0], url + '/baz');
      assert.isTrue(element.importHref.secondCall.args[3]);

      assert.equal(Gerrit._pluginInstallError.callCount, 0);
      element.importHref.firstCall.args[2]();
      assert.equal(Gerrit._pluginInstallError.callCount, 1);
      element.importHref.secondCall.args[2]();
      assert.equal(Gerrit._pluginInstallError.callCount, 2);
    });

    test('imports relative html plugins from config with a base url', () => {
      sandbox.stub(Gerrit, '_pluginInstallError');
      sandbox.stub(element, 'getBaseUrl').returns('/the-base');
      element.config = {
        plugin: {html_resource_paths: ['foo/bar', 'baz']}};
      assert.equal(element.importHref.firstCall.args[0],
          url + '/the-base/foo/bar');
      assert.isTrue(element.importHref.firstCall.args[3]);

      assert.equal(element.importHref.secondCall.args[0],
          url + '/the-base/baz');
      assert.isTrue(element.importHref.secondCall.args[3]);
      assert.equal(Gerrit._pluginInstallError.callCount, 0);
      element.importHref.firstCall.args[2]();
      assert.equal(Gerrit._pluginInstallError.callCount, 1);
      element.importHref.secondCall.args[2]();
      assert.equal(Gerrit._pluginInstallError.callCount, 2);
    });

    test('importHref is not called with null callback functions', () => {
      const plugins = ['path/to/plugin'];
      element._importHtmlPlugins(plugins);
      assert.isTrue(element.importHref.calledOnce);
      assert.isFunction(element.importHref.lastCall.args[1]);
      assert.isFunction(element.importHref.lastCall.args[2]);
    });

    test('imports absolute html plugins from config', () => {
      sandbox.stub(Gerrit, '_pluginInstallError');
      element.config = {
        plugin: {
          html_resource_paths: [
            'http://example.com/foo/bar',
            'https://example.com/baz',
          ],
        },
      };
      assert.equal(element.importHref.firstCall.args[0],
          'http://example.com/foo/bar');
      assert.isTrue(element.importHref.firstCall.args[3]);

      assert.equal(element.importHref.secondCall.args[0],
          'https://example.com/baz');
      assert.isTrue(element.importHref.secondCall.args[3]);
      assert.equal(Gerrit._pluginInstallError.callCount, 0);
      element.importHref.firstCall.args[2]();
      assert.equal(Gerrit._pluginInstallError.callCount, 1);
      element.importHref.secondCall.args[2]();
      assert.equal(Gerrit._pluginInstallError.callCount, 2);
    });

    test('adds js plugins from config to the body', () => {
      element.config = {plugin: {js_resource_paths: ['foo/bar', 'baz']}};
      assert.isTrue(document.body.appendChild.calledTwice);
    });

    test('imports relative js plugins from config', () => {
      sandbox.stub(element, '_createScriptTag');
      element.config = {plugin: {js_resource_paths: ['foo/bar', 'baz']}};
      assert.isTrue(element._createScriptTag.calledWith(url + '/foo/bar'));
      assert.isTrue(element._createScriptTag.calledWith(url + '/baz'));
    });

    test('imports relative html plugins from config with a base url', () => {
      sandbox.stub(element, '_createScriptTag');
      sandbox.stub(element, 'getBaseUrl').returns('/the-base');
      element.config = {plugin: {js_resource_paths: ['foo/bar', 'baz']}};
      assert.isTrue(element._createScriptTag.calledWith(
          url + '/the-base/foo/bar'));
      assert.isTrue(element._createScriptTag.calledWith(
          url + '/the-base/baz'));
    });

    test('imports absolute html plugins from config', () => {
      sandbox.stub(element, '_createScriptTag');
      element.config = {
        plugin: {
          js_resource_paths: [
            'http://example.com/foo/bar',
            'https://example.com/baz',
          ],
        },
      };
      assert.isTrue(element._createScriptTag.calledWith(
          'http://example.com/foo/bar'));
      assert.isTrue(element._createScriptTag.calledWith(
          'https://example.com/baz'));
    });

    test('default theme is loaded with html plugins', () => {
      sandbox.stub(Gerrit, '_pluginInstallError');
      element.config = {
        default_theme: '/oof',
        plugin: {
          html_resource_paths: ['some'],
        },
      };
      assert.equal(element.importHref.firstCall.args[0], url + '/oof');
      assert.isFalse(element.importHref.firstCall.args[3]);

      assert.equal(element.importHref.secondCall.args[0], url + '/some');
      assert.isTrue(element.importHref.secondCall.args[3]);
      assert.equal(Gerrit._pluginInstallError.callCount, 0);
      element.importHref.firstCall.args[2]();
      assert.equal(Gerrit._pluginInstallError.callCount, 1);
      element.importHref.secondCall.args[2]();
      assert.equal(Gerrit._pluginInstallError.callCount, 2);
    });
  });
</script>
