<!DOCTYPE html>
<!--
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-endpoints</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-js-api-interface.html"/>

<script>
  suite('gr-plugin-endpoints tests', () => {
    let sandbox;
    let instance;
    let pluginFoo;
    let pluginBar;

    setup(() => {
      sandbox = sinon.sandbox.create();
      instance = new GrPluginEndpoints();
      Gerrit.install(p => { pluginFoo = p; }, '0.1',
          'http://test.com/plugins/testplugin/static/foo.html');
      instance.registerModule(pluginFoo, 'a-place', 'decorate', 'foo-module');
      Gerrit.install(p => { pluginBar = p; }, '0.1',
          'http://test.com/plugins/testplugin/static/bar.html');
      instance.registerModule(pluginBar, 'a-place', 'style', 'bar-module');
    });

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

    test('getDetails all', () => {
      assert.deepEqual(instance.getDetails('a-place'), [
        {
          moduleName: 'foo-module',
          plugin: pluginFoo,
          pluginUrl: pluginFoo._url,
          type: 'decorate',
        },
        {
          moduleName: 'bar-module',
          plugin: pluginBar,
          pluginUrl: pluginBar._url,
          type: 'style',
        },
      ]);
    });

    test('getDetails by type', () => {
      assert.deepEqual(instance.getDetails('a-place', {type: 'style'}), [
        {
          moduleName: 'bar-module',
          plugin: pluginBar,
          pluginUrl: pluginBar._url,
          type: 'style',
        },
      ]);
    });

    test('getDetails by module', () => {
      assert.deepEqual(
          instance.getDetails('a-place', {moduleName: 'foo-module'}),
          [
            {
              moduleName: 'foo-module',
              plugin: pluginFoo,
              pluginUrl: pluginFoo._url,
              type: 'decorate',
            },
          ]);
    });

    test('getModules', () => {
      assert.deepEqual(
          instance.getModules('a-place'), ['foo-module', 'bar-module']);
    });

    test('getPlugins', () => {
      assert.deepEqual(
          instance.getPlugins('a-place'), [pluginFoo._url, pluginBar._url]);
    });
  });
</script>
