|  | /** | 
|  | * @license | 
|  | * Copyright (C) 2020 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. | 
|  | */ | 
|  |  | 
|  | import '../../../test/common-test-setup-karma.js'; | 
|  | import {resetPlugins} from '../../../test/test-utils.js'; | 
|  | import './gr-js-api-interface.js'; | 
|  | import {GrPluginEndpoints} from './gr-plugin-endpoints.js'; | 
|  | import {pluginLoader} from './gr-plugin-loader.js'; | 
|  | import {_testOnly_initGerritPluginApi} from './gr-gerrit.js'; | 
|  |  | 
|  | const pluginApi = _testOnly_initGerritPluginApi(); | 
|  |  | 
|  | suite('gr-plugin-endpoints tests', () => { | 
|  | let sandbox; | 
|  | let instance; | 
|  | let pluginFoo; | 
|  | let pluginBar; | 
|  | let domHook; | 
|  |  | 
|  | setup(() => { | 
|  | sandbox = sinon.sandbox.create(); | 
|  | domHook = {}; | 
|  | instance = new GrPluginEndpoints(); | 
|  | pluginApi.install(p => { pluginFoo = p; }, '0.1', | 
|  | 'http://test.com/plugins/testplugin/static/foo.html'); | 
|  | instance.registerModule( | 
|  | pluginFoo, | 
|  | { | 
|  | endpoint: 'a-place', | 
|  | type: 'decorate', | 
|  | moduleName: 'foo-module', | 
|  | domHook, | 
|  | } | 
|  | ); | 
|  | pluginApi.install(p => { pluginBar = p; }, '0.1', | 
|  | 'http://test.com/plugins/testplugin/static/bar.html'); | 
|  | instance.registerModule( | 
|  | pluginBar, | 
|  | { | 
|  | endpoint: 'a-place', | 
|  | type: 'style', | 
|  | moduleName: 'bar-module', | 
|  | domHook, | 
|  | } | 
|  | ); | 
|  | sandbox.stub(pluginLoader, 'arePluginsLoaded').returns(true); | 
|  | sandbox.spy(instance, 'importUrl'); | 
|  | }); | 
|  |  | 
|  | teardown(() => { | 
|  | sandbox.restore(); | 
|  | resetPlugins(); | 
|  | }); | 
|  |  | 
|  | test('getDetails all', () => { | 
|  | assert.deepEqual(instance.getDetails('a-place'), [ | 
|  | { | 
|  | moduleName: 'foo-module', | 
|  | plugin: pluginFoo, | 
|  | pluginUrl: pluginFoo._url, | 
|  | type: 'decorate', | 
|  | domHook, | 
|  | slot: undefined, | 
|  | }, | 
|  | { | 
|  | moduleName: 'bar-module', | 
|  | plugin: pluginBar, | 
|  | pluginUrl: pluginBar._url, | 
|  | type: 'style', | 
|  | domHook, | 
|  | slot: undefined, | 
|  | }, | 
|  | ]); | 
|  | }); | 
|  |  | 
|  | test('getDetails by type', () => { | 
|  | assert.deepEqual(instance.getDetails('a-place', {type: 'style'}), [ | 
|  | { | 
|  | moduleName: 'bar-module', | 
|  | plugin: pluginBar, | 
|  | pluginUrl: pluginBar._url, | 
|  | type: 'style', | 
|  | domHook, | 
|  | slot: undefined, | 
|  | }, | 
|  | ]); | 
|  | }); | 
|  |  | 
|  | test('getDetails by module', () => { | 
|  | assert.deepEqual( | 
|  | instance.getDetails('a-place', {moduleName: 'foo-module'}), | 
|  | [ | 
|  | { | 
|  | moduleName: 'foo-module', | 
|  | plugin: pluginFoo, | 
|  | pluginUrl: pluginFoo._url, | 
|  | type: 'decorate', | 
|  | domHook, | 
|  | slot: undefined, | 
|  | }, | 
|  | ]); | 
|  | }); | 
|  |  | 
|  | test('getModules', () => { | 
|  | assert.deepEqual( | 
|  | instance.getModules('a-place'), ['foo-module', 'bar-module']); | 
|  | }); | 
|  |  | 
|  | test('getPlugins', () => { | 
|  | assert.deepEqual( | 
|  | instance.getPlugins('a-place'), [pluginFoo._url]); | 
|  | }); | 
|  |  | 
|  | test('getAndImportPlugins', () => { | 
|  | instance.getAndImportPlugins('a-place'); | 
|  | assert.isTrue(instance.importUrl.called); | 
|  | assert.isTrue(instance.importUrl.calledOnce); | 
|  | instance.getAndImportPlugins('a-place'); | 
|  | assert.isTrue(instance.importUrl.calledOnce); | 
|  | }); | 
|  |  | 
|  | test('onNewEndpoint', () => { | 
|  | const newModuleStub = sandbox.stub(); | 
|  | instance.onNewEndpoint('a-place', newModuleStub); | 
|  | instance.registerModule( | 
|  | pluginFoo, | 
|  | { | 
|  | endpoint: 'a-place', | 
|  | type: 'replace', | 
|  | moduleName: 'zaz-module', | 
|  | domHook, | 
|  | }); | 
|  | assert.deepEqual(newModuleStub.lastCall.args[0], { | 
|  | moduleName: 'zaz-module', | 
|  | plugin: pluginFoo, | 
|  | pluginUrl: pluginFoo._url, | 
|  | type: 'replace', | 
|  | domHook, | 
|  | slot: undefined, | 
|  | }); | 
|  | }); | 
|  |  | 
|  | test('reuse dom hooks', () => { | 
|  | instance.registerModule( | 
|  | pluginFoo, 'a-place', 'decorate', 'foo-module', domHook); | 
|  | assert.deepEqual(instance.getDetails('a-place'), [ | 
|  | { | 
|  | moduleName: 'foo-module', | 
|  | plugin: pluginFoo, | 
|  | pluginUrl: pluginFoo._url, | 
|  | type: 'decorate', | 
|  | domHook, | 
|  | slot: undefined, | 
|  | }, | 
|  | { | 
|  | moduleName: 'bar-module', | 
|  | plugin: pluginBar, | 
|  | pluginUrl: pluginBar._url, | 
|  | type: 'style', | 
|  | domHook, | 
|  | slot: undefined, | 
|  | }, | 
|  | ]); | 
|  | }); | 
|  | }); |