/** * @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. */ import '../../../test/common-test-setup-karma.js'; import '../../shared/gr-js-api-interface/gr-js-api-interface.js'; import {GrDomHook, GrDomHooksManager} from './gr-dom-hooks.js'; import {_testOnly_initGerritPluginApi} from '../../shared/gr-js-api-interface/gr-gerrit.js'; const pluginApi = _testOnly_initGerritPluginApi(); suite('gr-dom-hooks tests', () => { let instance; let hook; setup(() => { let plugin; pluginApi.install(p => { plugin = p; }, '0.1', 'http://test.com/plugins/testplugin/static/test.js'); instance = new GrDomHooksManager(plugin); }); suite('placeholder', () => { setup(()=>{ sinon.stub(GrDomHook.prototype, '_createPlaceholder'); hook = instance.getDomHook('foo-bar'); }); test('registers placeholder class', () => { assert.isTrue(hook._createPlaceholder.calledWithExactly( 'testplugin-autogenerated-foo-bar')); }); test('getModuleName()', () => { const hookName = Object.keys(instance._hooks).pop(); assert.equal(hookName, 'testplugin-autogenerated-foo-bar'); assert.equal(hook.getModuleName(), 'testplugin-autogenerated-foo-bar'); }); }); suite('custom element', () => { setup(() => { hook = instance.getDomHook('foo-bar', 'my-el'); }); test('getModuleName()', () => { const hookName = Object.keys(instance._hooks).pop(); assert.equal(hookName, 'foo-bar my-el'); assert.equal(hook.getModuleName(), 'my-el'); }); test('onAttached', () => { const onAttachedSpy = sinon.spy(); hook.onAttached(onAttachedSpy); const [el1, el2] = [ document.createElement(hook.getModuleName()), document.createElement(hook.getModuleName()), ]; hook.handleInstanceAttached(el1); hook.handleInstanceAttached(el2); assert.isTrue(onAttachedSpy.firstCall.calledWithExactly(el1)); assert.isTrue(onAttachedSpy.secondCall.calledWithExactly(el2)); }); test('onDetached', () => { const onDetachedSpy = sinon.spy(); hook.onDetached(onDetachedSpy); const [el1, el2] = [ document.createElement(hook.getModuleName()), document.createElement(hook.getModuleName()), ]; hook.handleInstanceDetached(el1); assert.isTrue(onDetachedSpy.firstCall.calledWithExactly(el1)); hook.handleInstanceDetached(el2); assert.isTrue(onDetachedSpy.secondCall.calledWithExactly(el2)); }); test('getAllAttached', () => { const [el1, el2] = [ document.createElement(hook.getModuleName()), document.createElement(hook.getModuleName()), ]; el1.textContent = 'one'; el2.textContent = 'two'; hook.handleInstanceAttached(el1); hook.handleInstanceAttached(el2); assert.deepEqual([el1, el2], hook.getAllAttached()); hook.handleInstanceDetached(el1); assert.deepEqual([el2], hook.getAllAttached()); }); test('getLastAttached', () => { const beforeAttachedPromise = hook.getLastAttached().then( el => assert.strictEqual(el1, el)); const [el1, el2] = [ document.createElement(hook.getModuleName()), document.createElement(hook.getModuleName()), ]; el1.textContent = 'one'; el2.textContent = 'two'; hook.handleInstanceAttached(el1); hook.handleInstanceAttached(el2); const afterAttachedPromise = hook.getLastAttached().then( el => assert.strictEqual(el2, el)); return Promise.all([ beforeAttachedPromise, afterAttachedPromise, ]); }); }); });