/** * @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 {_testOnly_resetPluginLoader} from '../elements/shared/gr-js-api-interface/gr-plugin-loader.js'; import {testOnly_resetInternalState} from '../elements/shared/gr-js-api-interface/gr-api-utils.js'; import {_testOnly_resetEndpoints} from '../elements/shared/gr-js-api-interface/gr-plugin-endpoints.js'; import {_testOnly_getShortcutManagerInstance} from '../mixins/keyboard-shortcut-mixin/keyboard-shortcut-mixin.js'; export const mockPromise = () => { let res; const promise = new Promise(resolve => { res = resolve; }); promise.resolve = res; return promise; }; export const isHidden = el => getComputedStyle(el).display === 'none'; // Some tests/elements can define its own binding. We want to restore bindings // at the end of the test. The TestKeyboardShortcutBinder store bindings in // stack, so it is possible to override bindings in nested suites. export class TestKeyboardShortcutBinder { static push() { if (!this.stack) { this.stack = []; } const testBinder = new TestKeyboardShortcutBinder(); this.stack.push(testBinder); return _testOnly_getShortcutManagerInstance(); } static pop() { this.stack.pop()._restoreShortcuts(); } constructor() { this._originalBinding = new Map( _testOnly_getShortcutManagerInstance().bindings); } _restoreShortcuts() { const bindings = _testOnly_getShortcutManagerInstance().bindings; bindings.clear(); this._originalBinding.forEach((value, key) => { bindings.set(key, value); }); } } // Provide reset plugins function to clear installed plugins between tests. // No gr-app found (running tests) export const resetPlugins = () => { testOnly_resetInternalState(); _testOnly_resetEndpoints(); const pl = _testOnly_resetPluginLoader(); pl.loadPlugins([]); }; const cleanups = []; function registerTestCleanup(cleanupCallback) { cleanups.push(cleanupCallback); } export function cleanupTestUtils() { cleanups.forEach(cleanup => cleanup()); cleanups.splice(0); } export function stubBaseUrl(newUrl) { const originalCanonicalPath = window.CANONICAL_PATH; window.CANONICAL_PATH = newUrl; registerTestCleanup(() => window.CANONICAL_PATH = originalCanonicalPath); } export function generateChange(options) { const change = { _number: 42, }; const revisionIdStart = 1; const messageIdStart = 1000; // We want to distinguish between empty arrays/objects and undefined // If an option is not set - the appropriate property is not set // If an options is set - the property always set if (typeof options.revisionsCount !== 'undefined') { const revisions = {}; for (let i = 0; i < options.revisionsCount; i++) { const revisionId = (i + revisionIdStart).toString(16); revisions[revisionId] = { _number: i+1, commit: {parents: []}, }; } change.revisions = revisions; } if (typeof options.messagesCount !== 'undefined') { const messages = []; for (let i = 0; i < options.messagesCount; i++) { messages.push({ id: (i + messageIdStart).toString(16), date: new Date(2020, 1, 1), message: `This is a message N${i + 1}`, }); } change.messages = messages; } if (options.status) { change.status = options.status; } return change; } /** * Forcing an opacity of 0 onto the ironOverlayBackdrop is required, because * otherwise the backdrop stays around in the DOM for too long waiting for * an animation to finish. This could be considered to be moved to a * common-test-setup file. */ export function createIronOverlayBackdropStyleEl() { const ironOverlayBackdropStyleEl = document.createElement('style'); document.head.appendChild(ironOverlayBackdropStyleEl); ironOverlayBackdropStyleEl.sheet.insertRule( 'body { --iron-overlay-backdrop-opacity: 0; }'); return ironOverlayBackdropStyleEl; }