@itwin/presentation-testing
Version:
Testing utilities for iTwin.js Presentation library
166 lines • 6.96 kB
JavaScript
;
/*---------------------------------------------------------------------------------------------
* Copyright (c) Bentley Systems, Incorporated. All rights reserved.
* See LICENSE.md in the project root for license terms and full copyright notice.
*--------------------------------------------------------------------------------------------*/
/** @packageDocumentation
* @module Helpers
*/
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || (function () {
var ownKeys = function(o) {
ownKeys = Object.getOwnPropertyNames || function (o) {
var ar = [];
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
return ar;
};
return ownKeys(o);
};
return function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
__setModuleDefault(result, mod);
return result;
};
})();
Object.defineProperty(exports, "__esModule", { value: true });
exports.terminate = exports.initialize = exports.HierarchyCacheMode = void 0;
exports.safeDispose = safeDispose;
const path_1 = require("path");
const core_backend_1 = require("@itwin/core-backend");
const core_bentley_1 = require("@itwin/core-bentley");
const core_common_1 = require("@itwin/core-common");
const core_frontend_1 = require("@itwin/core-frontend");
const presentation_backend_1 = require("@itwin/presentation-backend");
Object.defineProperty(exports, "HierarchyCacheMode", { enumerable: true, get: function () { return presentation_backend_1.HierarchyCacheMode; } });
const presentation_common_1 = require("@itwin/presentation-common");
const presentation_frontend_1 = require("@itwin/presentation-frontend");
const FilenameUtils_js_1 = require("./FilenameUtils.js");
function initializeRpcInterfaces(interfaces) {
const config = class extends core_common_1.RpcDefaultConfiguration {
interfaces = () => interfaces;
};
for (const definition of interfaces) {
// eslint-disable-next-line @itwin/no-internal
core_common_1.RpcConfiguration.assign(definition, /* istanbul ignore next */ () => config);
}
const instance = core_common_1.RpcConfiguration.obtain(config);
try {
core_common_1.RpcConfiguration.initializeInterfaces(instance);
/* c8 ignore start */
}
catch {
// this may fail with "Error: RPC interface "xxx" is already initialized." because
// multiple different tests want to set up rpc interfaces
}
/* c8 ignore end */
}
let isInitialized = false;
/**
* Initialize the framework for presentation testing. The function sets up backend,
* frontend and RPC communication between them.
*
* @see `terminate`
*
* @public
*/
const initialize = async (props) => {
if (isInitialized) {
return;
}
if (!props) {
props = {};
}
core_bentley_1.Logger.initializeToConsole();
core_bentley_1.Logger.setLevelDefault(core_bentley_1.LogLevel.Warning);
core_bentley_1.Logger.setLevel("i18n", core_bentley_1.LogLevel.Error);
core_bentley_1.Logger.setLevel("SQLite", core_bentley_1.LogLevel.Error);
core_bentley_1.Logger.setLevel(presentation_backend_1.PresentationBackendNativeLoggerCategory.ECObjects, core_bentley_1.LogLevel.Warning);
// set up rpc interfaces
initializeRpcInterfaces(props.rpcs ?? [core_common_1.IModelReadRpcInterface, presentation_common_1.PresentationRpcInterface]);
// init backend
// make sure backend gets assigned an id which puts its resources into a unique directory
props.backendProps = props.backendProps ?? {};
if (!props.backendProps.id) {
props.backendProps.id = `test-${core_bentley_1.Guid.createValue()}`;
}
await core_backend_1.IModelHost.startup({
cacheDir: (0, path_1.join)((0, FilenameUtils_js_1.getTestOutputDir)(), ".cache", `${process.pid}`),
...props.backendHostProps,
});
presentation_backend_1.Presentation.initialize(props.backendProps);
// init frontend
if (!props.frontendApp) {
props.frontendApp = core_frontend_1.NoRenderApp;
}
await props.frontendApp.startup(props.frontendAppOptions);
const defaultFrontendProps = {
presentation: {
activeLocale: core_frontend_1.IModelApp.localization.getLanguageList()[0],
},
};
await presentation_frontend_1.Presentation.initialize({ ...defaultFrontendProps, ...props.frontendProps });
(0, FilenameUtils_js_1.setTestOutputDir)(props.testOutputDir);
isInitialized = true;
};
exports.initialize = initialize;
/**
* Undoes the setup made by `initialize`.
* @param frontendApp IModelApp implementation
*
* @see `initialize`
*
* @public
*/
const terminate = async (frontendApp = core_frontend_1.IModelApp) => {
if (!isInitialized) {
return;
}
// store directory that needs to be cleaned-up
let hierarchiesCacheDirectory;
const hierarchiesCacheConfig = presentation_backend_1.Presentation.initProps?.caching?.hierarchies;
if (hierarchiesCacheConfig?.mode === presentation_backend_1.HierarchyCacheMode.Disk) {
hierarchiesCacheDirectory = hierarchiesCacheConfig?.directory;
}
else if (hierarchiesCacheConfig?.mode === presentation_backend_1.HierarchyCacheMode.Hybrid) {
hierarchiesCacheDirectory = hierarchiesCacheConfig?.disk?.directory;
}
// terminate backend
presentation_backend_1.Presentation.terminate();
await core_backend_1.IModelHost.shutdown();
if (hierarchiesCacheDirectory) {
const { sync: rimrafSync } = await Promise.resolve().then(() => __importStar(require("rimraf")));
rimrafSync(hierarchiesCacheDirectory);
}
// terminate frontend
presentation_frontend_1.Presentation.terminate();
await frontendApp.shutdown();
isInitialized = false;
};
exports.terminate = terminate;
/** @internal */
function safeDispose(disposable) {
if ("dispose" in disposable) {
disposable.dispose();
}
else if (Symbol.dispose in disposable) {
disposable[Symbol.dispose]();
}
}
//# sourceMappingURL=Helpers.js.map