blob: 600162270c2e62d74f2bb0c0b15f439fa5863175 [file] [log] [blame]
/**
* @license
* Copyright 2017 Google LLC
* SPDX-License-Identifier: Apache-2.0
*/
import {HookApi, PluginElement} from '../../../api/hook';
import {PluginApi} from '../../../api/plugin';
import '../../../test/common-test-setup-karma';
import '../../shared/gr-js-api-interface/gr-js-api-interface';
import {GrDomHook, GrDomHooksManager} from './gr-dom-hooks';
suite('gr-dom-hooks tests', () => {
let instance: GrDomHooksManager;
let hook: HookApi<PluginElement>;
let plugin: PluginApi;
setup(() => {
window.Gerrit.install(
p => {
plugin = p;
},
'0.1',
'http://test.com/plugins/testplugin/static/test.js'
);
instance = new GrDomHooksManager(plugin);
});
suite('placeholder', () => {
let createPlaceHolderStub: sinon.SinonStub;
setup(() => {
createPlaceHolderStub = sinon.stub(
GrDomHook.prototype,
'_createPlaceholder'
);
hook = instance.getDomHook('foo-bar');
});
test('registers placeholder class', () => {
assert.isTrue(
createPlaceHolderStub.calledWithExactly(
'testplugin-autogenerated-foo-bar'
)
);
});
test('getModuleName()', () => {
assert.equal(hook.getModuleName(), 'testplugin-autogenerated-foo-bar');
});
});
suite('custom element', () => {
setup(() => {
hook = instance.getDomHook('foo-bar', 'my-el');
});
test('getModuleName()', () => {
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: HTMLElement) => 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: HTMLElement) => assert.strictEqual(el2, el));
return Promise.all([beforeAttachedPromise, afterAttachedPromise]);
});
});
});