<!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-external-style</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-external-style.html">

<test-fixture id="basic">
  <template>
    <gr-external-style name="foo"></gr-external-style>
  </template>
</test-fixture>

<script>
  suite('gr-external-style integration tests', () => {
    const TEST_URL = 'http://some/plugin/url.html';

    let sandbox;
    let element;
    let plugin;

    const installPlugin = () => {
      if (plugin) { return; }
      Gerrit.install(p => {
        plugin = p;
      }, '0.1', TEST_URL);
    };

    const createElement = () => {
      element = fixture('basic');
      sandbox.spy(element, '_applyStyle');
    };

    /**
     * Installs the plugin, creates the element, registers style module.
     */
    const lateRegister = () => {
      installPlugin();
      createElement();
      plugin.registerStyleModule('foo', 'some-module');
    };

    /**
     * Installs the plugin, registers style module, creates the element.
     */
    const earlyRegister = () => {
      installPlugin();
      plugin.registerStyleModule('foo', 'some-module');
      createElement();
    };

    setup(() => {
      sandbox = sinon.sandbox.create();
      stub('gr-external-style', {
        importHref: (url, resolve) => resolve(),
      });
      sandbox.stub(Gerrit, 'awaitPluginsLoaded').returns(Promise.resolve());
    });

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

    test('imports plugin-provided module', async () => {
      lateRegister();
      await new Promise(flush);
      assert.isTrue(element.importHref.calledWith(new URL(TEST_URL)));
    });

    test('applies plugin-provided styles', async () => {
      lateRegister();
      await new Promise(flush);
      assert.isTrue(element._applyStyle.calledWith('some-module'));
    });

    test('does not double import', async () => {
      earlyRegister();
      await new Promise(flush);
      plugin.registerStyleModule('foo', 'some-module');
      await new Promise(flush);
      const urlsImported =
          element._urlsImported.filter(url => url.toString() === TEST_URL);
      assert.strictEqual(urlsImported.length, 1);
    });

    test('does not double apply', async () => {
      earlyRegister();
      await new Promise(flush);
      plugin.registerStyleModule('foo', 'some-module');
      await new Promise(flush);
      const stylesApplied =
          element._stylesApplied.filter(name => name === 'some-module');
      assert.strictEqual(stylesApplied.length, 1);
    });

    test('loads and applies preloaded modules', async () => {
      earlyRegister();
      await new Promise(flush);
      assert.isTrue(element.importHref.calledWith(new URL(TEST_URL)));
      assert.isTrue(element._applyStyle.calledWith('some-module'));
    });
  });
</script>
