UNPKG

@getanthill/datastore

Version:

Event-Sourced Datastore

240 lines 8.73 kB
"use strict"; 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 (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); __setModuleDefault(result, mod); return result; }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); process.env.MONGOMS_DOWNLOAD_URL = process.env.MONGOMS_DOWNLOAD_URL || 'https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-debian12-8.0.3.tgz'; process.env.OTEL_PROMETHEUS_EXPORTER_PREVENT_SERVER_START = 'true'; /* @ts-ignore */ const jest_preset_1 = __importDefault(require("@shelf/jest-mongodb/jest-preset")); const lodash_1 = require("lodash"); const util_1 = __importDefault(require("util")); const net_1 = __importDefault(require("net")); const config_1 = __importDefault(require("./config")); const models_1 = require("./models"); const App_1 = __importDefault(require("./App")); const services_1 = require("./services"); const Datastore_1 = __importDefault(require("./sdk/Datastore")); // Set the default ACCESS_TOKENS for the tests: process.env.ADMIN_ACCESS_TOKENS = 'token'; async function setup() { console.log('Global Setup'); process.env.SKIP_MONGODB_IN_MEMORY !== 'true' && (await setupMongodbInMemory()); } exports.default = setup; async function setupMongodbInMemory(attempt = 0) { try { const { default: setupMongoDb } = await Promise.resolve(`${jest_preset_1.default.globalSetup}`).then(s => __importStar(require(s))); await setupMongoDb({ rootDir: '.', }); } catch (err) { if (attempt < 10) { console.warn(err); console.log('Retrying the MongoDB setup'); await new Promise((resolve) => setTimeout(resolve, 1000)); setupMongodbInMemory(attempt + 1); return; } console.error(err); process.exit(1); } } async function teardownMongoDbInMemory() { try { const { default: teardownMongoDb } = await Promise.resolve(`${jest_preset_1.default.globalTeardown}`).then(s => __importStar(require(s))); process.env.SKIP_MONGODB_IN_MEMORY !== 'true' && (await teardownMongoDb({ rootDir: '.', })); } catch (err) { console.warn(err); } } setup.setupMongodbInMemory = setupMongodbInMemory; setup.teardownMongoDbInMemory = teardownMongoDbInMemory; setup.uuid = function uuid() { return 'uuid' + (Math.random() * 1e16).toFixed(0); }; const DEFAULT_SERVICES_CONFIG = config_1.default; async function getPort() { return new Promise((resolve) => { const srv = net_1.default.createServer(); srv.listen(0, () => { // @ts-ignore const port = srv.address()?.port; srv.close(() => { resolve(port); }); }); }); } setup.build = async (config = {}) => { const dbName = `datastore_test_${new Date().getTime()}`; const _config = (0, lodash_1.merge)({}, DEFAULT_SERVICES_CONFIG, { mode: 'development', port: await getPort(), features: { initInternalModels: false, }, mongodb: { databases: [ { ...DEFAULT_SERVICES_CONFIG.mongodb.databases[0], url: (process.env.MONGO_URL || DEFAULT_SERVICES_CONFIG.mongodb.databases[0].url) .replace('/?', '/' + dbName + '?') .replace('/datastore', `/${dbName}`), }, { ...DEFAULT_SERVICES_CONFIG.mongodb.databases[1], url: (process.env.MONGO_URL || DEFAULT_SERVICES_CONFIG.mongodb.databases[1].url) .replace('/?', '/' + dbName + '?') .replace('/datastore', `/${dbName}`), }, ], ensureIndexInBackground: true, }, }, config); const services = (0, services_1.build)(_config); if (typeof jest !== 'undefined') { /* @ts-ignore */ global.debugMock = jest .spyOn(services.telemetry.logger, 'debug') /* @ts-ignore */ .mockImplementation(() => null); /* @ts-ignore */ global.infoMock = jest .spyOn(services.telemetry.logger, 'info') /* @ts-ignore */ .mockImplementation(() => null); /* @ts-ignore */ global.warnMock = jest .spyOn(services.telemetry.logger, 'warn') /* @ts-ignore */ .mockImplementation(() => null); /* @ts-ignore */ global.errorMock = jest .spyOn(services.telemetry.logger, 'error') /* @ts-ignore */ .mockImplementation(() => null); } await services.mongodb.connect(); await services.mongodb.db('datastore_write').dropDatabase(); await services.fhe.connect(); return new App_1.default(services); }; setup.cleanModel = async function cleanModel(services, modelName) { // Remove internal models await Promise.all([ services.mongodb.db('datastore_write').collection(modelName).deleteMany({}), services.mongodb .db('datastore_write') .collection(`${modelName}_events`) .deleteMany({}), services.mongodb .db('datastore_write') .collection(`${modelName}_snapshots`) .deleteMany({}), ]); }; setup.cleanModels = async function cleanModels(services) { await setup.cleanModel(services, 'internal_models'); }; setup.initModels = async function initModels(services, modelConfigs = []) { const models = (0, models_1.init)({ models: [], }, services); await setup.cleanModels(services); await Promise.all(modelConfigs.map((modelConfig) => models.createModel({ is_enabled: true, ...modelConfig, }))); await models.reload(); await Promise.all(modelConfigs.map((modelConfig) => models.createModelIndexes(modelConfig))); models.services = services; services.models = models; return models; }; setup.teardownDb = async function teardownDb(mongodb) { try { if (!mongodb.db('datastore_write')) { return; } await mongodb.db('datastore_write').dropDatabase(); await mongodb.disconnect(); } catch (err) { console.error(err); } }; setup.startApi = async function startApi(_config = {}, modelConfigs = []) { const app = await setup.build(_config); app.services.models = await setup.initModels(app.services, modelConfigs); await app.services.models.initInternalModels(); await app.start(); const sdk = new Datastore_1.default({ baseUrl: `http://localhost:${app.services.config.port}`, // Set to true to inspect SDK responses: debug: process.env.DATASTORE_DEBUG === 'true', token: 'token', timeout: 300000, telemetry: app.services.telemetry, }); let res = { state: 'down' }; do { const { data } = await sdk.heartbeat(); res = data; } while (res.state !== 'up' && (await new Promise((resolve) => setTimeout(resolve, 10)))); return [ app.services.config, app.services.mongodb, app.services.models, app.express, app.server, sdk, app.services, app, ]; }; setup.stopApi = async function stopApi(app) { await app.stop(); }; setup.restartApi = async function restartApi(app, _config = {}) { await setup.stopApi(app); return setup.startApi(_config); }; setup.inspect = (obj) => { console.log(util_1.default.inspect(obj, false, null, true)); }; //# sourceMappingURL=setup.js.map