@backstage/backend-test-utils 0.1.26 → 0.1.27-next.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +8 -0
- package/dist/index.cjs.js +71 -45
- package/dist/index.cjs.js.map +1 -1
- package/package.json +5 -5
package/CHANGELOG.md
CHANGED
package/dist/index.cjs.js
CHANGED
|
@@ -47,7 +47,9 @@ async function waitForMysqlReady(connection) {
|
|
|
47
47
|
}
|
|
48
48
|
} catch (e) {
|
|
49
49
|
if (Date.now() - startTime > 3e4) {
|
|
50
|
-
throw new Error(
|
|
50
|
+
throw new Error(
|
|
51
|
+
`Timed out waiting for the database to be ready for connections, ${e}`
|
|
52
|
+
);
|
|
51
53
|
}
|
|
52
54
|
}
|
|
53
55
|
await new Promise((resolve) => setTimeout(resolve, 100));
|
|
@@ -83,7 +85,9 @@ async function waitForPostgresReady(connection) {
|
|
|
83
85
|
}
|
|
84
86
|
} catch (e) {
|
|
85
87
|
if (Date.now() - startTime > 3e4) {
|
|
86
|
-
throw new Error(
|
|
88
|
+
throw new Error(
|
|
89
|
+
`Timed out waiting for the database to be ready for connections, ${e}`
|
|
90
|
+
);
|
|
87
91
|
}
|
|
88
92
|
}
|
|
89
93
|
await new Promise((resolve) => setTimeout(resolve, 100));
|
|
@@ -137,7 +141,11 @@ class TestDatabases {
|
|
|
137
141
|
ids: Object.keys(allDatabases),
|
|
138
142
|
disableDocker: isDockerDisabledForTests()
|
|
139
143
|
};
|
|
140
|
-
const { ids, disableDocker } = Object.assign(
|
|
144
|
+
const { ids, disableDocker } = Object.assign(
|
|
145
|
+
{},
|
|
146
|
+
defaultOptions,
|
|
147
|
+
options != null ? options : {}
|
|
148
|
+
);
|
|
141
149
|
const supportedIds = ids.filter((id) => {
|
|
142
150
|
const properties = allDatabases[id];
|
|
143
151
|
if (!properties) {
|
|
@@ -176,11 +184,15 @@ class TestDatabases {
|
|
|
176
184
|
const properties = allDatabases[id];
|
|
177
185
|
if (!properties) {
|
|
178
186
|
const candidates = Object.keys(allDatabases).join(", ");
|
|
179
|
-
throw new Error(
|
|
187
|
+
throw new Error(
|
|
188
|
+
`Unknown test database ${id}, possible values are ${candidates}`
|
|
189
|
+
);
|
|
180
190
|
}
|
|
181
191
|
if (!this.supportedIds.includes(id)) {
|
|
182
192
|
const candidates = this.supportedIds.join(", ");
|
|
183
|
-
throw new Error(
|
|
193
|
+
throw new Error(
|
|
194
|
+
`Unsupported test database ${id} for this environment, possible values are ${candidates}`
|
|
195
|
+
);
|
|
184
196
|
}
|
|
185
197
|
let instance = this.instanceById.get(id);
|
|
186
198
|
if (!instance) {
|
|
@@ -197,14 +209,16 @@ class TestDatabases {
|
|
|
197
209
|
if (envVarName) {
|
|
198
210
|
const connectionString = process.env[envVarName];
|
|
199
211
|
if (connectionString) {
|
|
200
|
-
const databaseManager = backendCommon.DatabaseManager.fromConfig(
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
212
|
+
const databaseManager = backendCommon.DatabaseManager.fromConfig(
|
|
213
|
+
new config.ConfigReader({
|
|
214
|
+
backend: {
|
|
215
|
+
database: {
|
|
216
|
+
client: properties.driver,
|
|
217
|
+
connection: connectionString
|
|
218
|
+
}
|
|
205
219
|
}
|
|
206
|
-
}
|
|
207
|
-
|
|
220
|
+
})
|
|
221
|
+
);
|
|
208
222
|
return {
|
|
209
223
|
databaseManager,
|
|
210
224
|
connections: []
|
|
@@ -225,15 +239,19 @@ class TestDatabases {
|
|
|
225
239
|
}
|
|
226
240
|
}
|
|
227
241
|
async initPostgres(properties) {
|
|
228
|
-
const { host, port, user, password, stop } = await startPostgresContainer(
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
242
|
+
const { host, port, user, password, stop } = await startPostgresContainer(
|
|
243
|
+
properties.dockerImageName
|
|
244
|
+
);
|
|
245
|
+
const databaseManager = backendCommon.DatabaseManager.fromConfig(
|
|
246
|
+
new config.ConfigReader({
|
|
247
|
+
backend: {
|
|
248
|
+
database: {
|
|
249
|
+
client: "pg",
|
|
250
|
+
connection: { host, port, user, password }
|
|
251
|
+
}
|
|
234
252
|
}
|
|
235
|
-
}
|
|
236
|
-
|
|
253
|
+
})
|
|
254
|
+
);
|
|
237
255
|
return {
|
|
238
256
|
stopContainer: stop,
|
|
239
257
|
databaseManager,
|
|
@@ -241,15 +259,19 @@ class TestDatabases {
|
|
|
241
259
|
};
|
|
242
260
|
}
|
|
243
261
|
async initMysql(properties) {
|
|
244
|
-
const { host, port, user, password, stop } = await startMysqlContainer(
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
262
|
+
const { host, port, user, password, stop } = await startMysqlContainer(
|
|
263
|
+
properties.dockerImageName
|
|
264
|
+
);
|
|
265
|
+
const databaseManager = backendCommon.DatabaseManager.fromConfig(
|
|
266
|
+
new config.ConfigReader({
|
|
267
|
+
backend: {
|
|
268
|
+
database: {
|
|
269
|
+
client: "mysql2",
|
|
270
|
+
connection: { host, port, user, password }
|
|
271
|
+
}
|
|
250
272
|
}
|
|
251
|
-
}
|
|
252
|
-
|
|
273
|
+
})
|
|
274
|
+
);
|
|
253
275
|
return {
|
|
254
276
|
stopContainer: stop,
|
|
255
277
|
databaseManager,
|
|
@@ -257,14 +279,16 @@ class TestDatabases {
|
|
|
257
279
|
};
|
|
258
280
|
}
|
|
259
281
|
async initSqlite(properties) {
|
|
260
|
-
const databaseManager = backendCommon.DatabaseManager.fromConfig(
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
282
|
+
const databaseManager = backendCommon.DatabaseManager.fromConfig(
|
|
283
|
+
new config.ConfigReader({
|
|
284
|
+
backend: {
|
|
285
|
+
database: {
|
|
286
|
+
client: properties.driver,
|
|
287
|
+
connection: ":memory:"
|
|
288
|
+
}
|
|
265
289
|
}
|
|
266
|
-
}
|
|
267
|
-
|
|
290
|
+
})
|
|
291
|
+
);
|
|
268
292
|
return {
|
|
269
293
|
databaseManager,
|
|
270
294
|
connections: []
|
|
@@ -272,16 +296,18 @@ class TestDatabases {
|
|
|
272
296
|
}
|
|
273
297
|
async shutdown() {
|
|
274
298
|
const instances = [...this.instanceById.values()];
|
|
275
|
-
await Promise.all(
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
299
|
+
await Promise.all(
|
|
300
|
+
instances.map(async ({ stopContainer, connections }) => {
|
|
301
|
+
try {
|
|
302
|
+
await Promise.all(connections.map((c) => c.destroy()));
|
|
303
|
+
} catch {
|
|
304
|
+
}
|
|
305
|
+
try {
|
|
306
|
+
await (stopContainer == null ? void 0 : stopContainer());
|
|
307
|
+
} catch {
|
|
308
|
+
}
|
|
309
|
+
})
|
|
310
|
+
);
|
|
285
311
|
}
|
|
286
312
|
}
|
|
287
313
|
|
package/dist/index.cjs.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs.js","sources":["../src/util/isDockerDisabledForTests.ts","../src/database/startMysqlContainer.ts","../src/database/startPostgresContainer.ts","../src/database/types.ts","../src/database/TestDatabases.ts","../src/msw/setupRequestMockHandlers.ts"],"sourcesContent":["/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/** @public */\nexport function isDockerDisabledForTests() {\n // If we are not running in continuous integration, the default is to skip\n // the (relatively heavy, long running) docker based tests. If you want to\n // still run local tests for all databases, just pass either the CI=1 env\n // parameter to your test runner, or individual connection strings per\n // database.\n return (\n Boolean(process.env.BACKSTAGE_TEST_DISABLE_DOCKER) ||\n !Boolean(process.env.CI)\n );\n}\n","/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport createConnection, { Knex } from 'knex';\nimport { v4 as uuid } from 'uuid';\n\nasync function waitForMysqlReady(\n connection: Knex.MySqlConnectionConfig,\n): Promise<void> {\n const startTime = Date.now();\n const db = createConnection({ client: 'mysql2', connection });\n\n try {\n for (;;) {\n try {\n const result = await db.select(db.raw('version() AS version'));\n if (result[0]?.version) {\n return;\n }\n } catch (e) {\n if (Date.now() - startTime > 30_000) {\n throw new Error(\n `Timed out waiting for the database to be ready for connections, ${e}`,\n );\n }\n }\n\n await new Promise(resolve => setTimeout(resolve, 100));\n }\n } finally {\n db.destroy();\n }\n}\n\nexport async function startMysqlContainer(image: string) {\n const user = 'root';\n const password = uuid();\n\n // Lazy-load to avoid side-effect of importing testcontainers\n const { GenericContainer } = await import('testcontainers');\n\n const container = await new GenericContainer(image)\n .withExposedPorts(3306)\n .withEnv('MYSQL_ROOT_PASSWORD', password)\n .withTmpFs({ '/var/lib/mysql': 'rw' })\n .start();\n\n const host = container.getHost();\n const port = container.getMappedPort(3306);\n const stop = async () => {\n await container.stop({ timeout: 10_000 });\n };\n\n await waitForMysqlReady({ host, port, user, password });\n\n return { host, port, user, password, stop };\n}\n","/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport createConnection, { Knex } from 'knex';\nimport { v4 as uuid } from 'uuid';\n\nasync function waitForPostgresReady(\n connection: Knex.PgConnectionConfig,\n): Promise<void> {\n const startTime = Date.now();\n const db = createConnection({ client: 'pg', connection });\n\n try {\n for (;;) {\n try {\n const result = await db.select(db.raw('version()'));\n if (Array.isArray(result) && result[0]?.version) {\n return;\n }\n } catch (e) {\n if (Date.now() - startTime > 30_000) {\n throw new Error(\n `Timed out waiting for the database to be ready for connections, ${e}`,\n );\n }\n }\n\n await new Promise(resolve => setTimeout(resolve, 100));\n }\n } finally {\n db.destroy();\n }\n}\n\nexport async function startPostgresContainer(image: string) {\n const user = 'postgres';\n const password = uuid();\n\n // Lazy-load to avoid side-effect of importing testcontainers\n const { GenericContainer } = await import('testcontainers');\n\n const container = await new GenericContainer(image)\n .withExposedPorts(5432)\n .withEnv('POSTGRES_PASSWORD', password)\n .withTmpFs({ '/var/lib/postgresql/data': 'rw' })\n .start();\n\n const host = container.getHost();\n const port = container.getMappedPort(5432);\n const stop = async () => {\n await container.stop({ timeout: 10_000 });\n };\n\n await waitForPostgresReady({ host, port, user, password });\n\n return { host, port, user, password, stop };\n}\n","/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { DatabaseManager } from '@backstage/backend-common';\nimport { Knex } from 'knex';\n\n/**\n * The possible databases to test against.\n *\n * @public\n */\nexport type TestDatabaseId =\n | 'POSTGRES_13'\n | 'POSTGRES_9'\n | 'MYSQL_8'\n | 'SQLITE_3';\n\nexport type TestDatabaseProperties = {\n name: string;\n driver: string;\n dockerImageName?: string;\n connectionStringEnvironmentVariableName?: string;\n};\n\nexport type Instance = {\n stopContainer?: () => Promise<void>;\n databaseManager: DatabaseManager;\n connections: Array<Knex>;\n};\n\nexport const allDatabases: Record<TestDatabaseId, TestDatabaseProperties> =\n Object.freeze({\n POSTGRES_13: {\n name: 'Postgres 13.x',\n driver: 'pg',\n dockerImageName: 'postgres:13',\n connectionStringEnvironmentVariableName:\n 'BACKSTAGE_TEST_DATABASE_POSTGRES13_CONNECTION_STRING',\n },\n POSTGRES_9: {\n name: 'Postgres 9.x',\n driver: 'pg',\n dockerImageName: 'postgres:9',\n connectionStringEnvironmentVariableName:\n 'BACKSTAGE_TEST_DATABASE_POSTGRES9_CONNECTION_STRING',\n },\n MYSQL_8: {\n name: 'MySQL 8.x',\n driver: 'mysql2',\n dockerImageName: 'mysql:8',\n connectionStringEnvironmentVariableName:\n 'BACKSTAGE_TEST_DATABASE_MYSQL8_CONNECTION_STRING',\n },\n SQLITE_3: {\n name: 'SQLite 3.x',\n driver: 'better-sqlite3',\n },\n });\n","/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { DatabaseManager } from '@backstage/backend-common';\nimport { ConfigReader } from '@backstage/config';\nimport { randomBytes } from 'crypto';\nimport { Knex } from 'knex';\nimport { isDockerDisabledForTests } from '../util/isDockerDisabledForTests';\nimport { startMysqlContainer } from './startMysqlContainer';\nimport { startPostgresContainer } from './startPostgresContainer';\nimport {\n allDatabases,\n Instance,\n TestDatabaseId,\n TestDatabaseProperties,\n} from './types';\n\n/**\n * Encapsulates the creation of ephemeral test database instances for use\n * inside unit or integration tests.\n *\n * @public\n */\nexport class TestDatabases {\n private readonly instanceById: Map<string, Instance>;\n private readonly supportedIds: TestDatabaseId[];\n\n /**\n * Creates an empty `TestDatabases` instance, and sets up Jest to clean up\n * all of its acquired resources after all tests finish.\n *\n * You typically want to create just a single instance like this at the top\n * of your test file or `describe` block, and then call `init` many times on\n * that instance inside the individual tests. Spinning up a \"physical\"\n * database instance takes a considerable amount of time, slowing down tests.\n * But initializing a new logical database inside that instance using `init`\n * is very fast.\n */\n static create(options?: {\n ids?: TestDatabaseId[];\n disableDocker?: boolean;\n }): TestDatabases {\n const defaultOptions = {\n ids: Object.keys(allDatabases) as TestDatabaseId[],\n disableDocker: isDockerDisabledForTests(),\n };\n\n const { ids, disableDocker } = Object.assign(\n {},\n defaultOptions,\n options ?? {},\n );\n\n const supportedIds = ids.filter(id => {\n const properties = allDatabases[id];\n if (!properties) {\n return false;\n }\n // If the caller has set up the env with an explicit connection string,\n // we'll assume that this database will work\n if (\n properties.connectionStringEnvironmentVariableName &&\n process.env[properties.connectionStringEnvironmentVariableName]\n ) {\n return true;\n }\n // If the database doesn't require docker at all, there's nothing to worry\n // about\n if (!properties.dockerImageName) {\n return true;\n }\n // If the database requires docker, but docker is disabled, we will fail.\n if (disableDocker) {\n return false;\n }\n return true;\n });\n\n const databases = new TestDatabases(supportedIds);\n\n if (supportedIds.length > 0) {\n afterAll(async () => {\n await databases.shutdown();\n });\n }\n\n return databases;\n }\n\n private constructor(supportedIds: TestDatabaseId[]) {\n this.instanceById = new Map();\n this.supportedIds = supportedIds;\n }\n\n supports(id: TestDatabaseId): boolean {\n return this.supportedIds.includes(id);\n }\n\n eachSupportedId(): [TestDatabaseId][] {\n return this.supportedIds.map(id => [id]);\n }\n\n /**\n * Returns a fresh, unique, empty logical database on an instance of the\n * given database ID platform.\n *\n * @param id - The ID of the database platform to use, e.g. 'POSTGRES_13'\n * @returns A `Knex` connection object\n */\n async init(id: TestDatabaseId): Promise<Knex> {\n const properties = allDatabases[id];\n if (!properties) {\n const candidates = Object.keys(allDatabases).join(', ');\n throw new Error(\n `Unknown test database ${id}, possible values are ${candidates}`,\n );\n }\n if (!this.supportedIds.includes(id)) {\n const candidates = this.supportedIds.join(', ');\n throw new Error(\n `Unsupported test database ${id} for this environment, possible values are ${candidates}`,\n );\n }\n\n let instance: Instance | undefined = this.instanceById.get(id);\n\n // Ensure that a testcontainers instance is up for this ID\n if (!instance) {\n instance = await this.initAny(properties);\n this.instanceById.set(id, instance);\n }\n\n // Ensure that a unique logical database is created in the instance\n const connection = await instance.databaseManager\n .forPlugin(`db${randomBytes(16).toString('hex')}`)\n .getClient();\n\n instance.connections.push(connection);\n\n return connection;\n }\n\n private async initAny(properties: TestDatabaseProperties): Promise<Instance> {\n // Use the connection string if provided\n if (properties.driver === 'pg' || properties.driver === 'mysql2') {\n const envVarName = properties.connectionStringEnvironmentVariableName;\n if (envVarName) {\n const connectionString = process.env[envVarName];\n if (connectionString) {\n const databaseManager = DatabaseManager.fromConfig(\n new ConfigReader({\n backend: {\n database: {\n client: properties.driver,\n connection: connectionString,\n },\n },\n }),\n );\n return {\n databaseManager,\n connections: [],\n };\n }\n }\n }\n\n // Otherwise start a container for the purpose\n switch (properties.driver) {\n case 'pg':\n return this.initPostgres(properties);\n case 'mysql2':\n return this.initMysql(properties);\n case 'better-sqlite3':\n case 'sqlite3':\n return this.initSqlite(properties);\n default:\n throw new Error(`Unknown database driver ${properties.driver}`);\n }\n }\n\n private async initPostgres(\n properties: TestDatabaseProperties,\n ): Promise<Instance> {\n const { host, port, user, password, stop } = await startPostgresContainer(\n properties.dockerImageName!,\n );\n\n const databaseManager = DatabaseManager.fromConfig(\n new ConfigReader({\n backend: {\n database: {\n client: 'pg',\n connection: { host, port, user, password },\n },\n },\n }),\n );\n\n return {\n stopContainer: stop,\n databaseManager,\n connections: [],\n };\n }\n\n private async initMysql(\n properties: TestDatabaseProperties,\n ): Promise<Instance> {\n const { host, port, user, password, stop } = await startMysqlContainer(\n properties.dockerImageName!,\n );\n\n const databaseManager = DatabaseManager.fromConfig(\n new ConfigReader({\n backend: {\n database: {\n client: 'mysql2',\n connection: { host, port, user, password },\n },\n },\n }),\n );\n\n return {\n stopContainer: stop,\n databaseManager,\n connections: [],\n };\n }\n\n private async initSqlite(\n properties: TestDatabaseProperties,\n ): Promise<Instance> {\n const databaseManager = DatabaseManager.fromConfig(\n new ConfigReader({\n backend: {\n database: {\n client: properties.driver,\n connection: ':memory:',\n },\n },\n }),\n );\n\n return {\n databaseManager,\n connections: [],\n };\n }\n\n private async shutdown() {\n const instances = [...this.instanceById.values()];\n await Promise.all(\n instances.map(async ({ stopContainer, connections }) => {\n try {\n await Promise.all(connections.map(c => c.destroy()));\n } catch {\n // ignore\n }\n try {\n await stopContainer?.();\n } catch {\n // ignore\n }\n }),\n );\n }\n}\n","/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * Sets up handlers for request mocking\n * @public\n * @param worker - service worker\n */\nexport function setupRequestMockHandlers(worker: {\n listen: (t: any) => void;\n close: () => void;\n resetHandlers: () => void;\n}) {\n beforeAll(() => worker.listen({ onUnhandledRequest: 'error' }));\n afterAll(() => worker.close());\n afterEach(() => worker.resetHandlers());\n}\n"],"names":["createConnection","uuid","randomBytes","DatabaseManager","ConfigReader"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAO,SAAS,wBAAwB,GAAG;AAC3C,EAAE,OAAO,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AACxF;;ACAA,eAAe,iBAAiB,CAAC,UAAU,EAAE;AAC7C,EAAE,IAAI,EAAE,CAAC;AACT,EAAE,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;AAC/B,EAAE,MAAM,EAAE,GAAGA,oCAAgB,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC,CAAC;AAChE,EAAE,IAAI;AACN,IAAI,WAAW;AACf,MAAM,IAAI;AACV,QAAQ,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC,CAAC;AACvE,QAAQ,IAAI,CAAC,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC,KAAK,IAAI,GAAG,KAAK,CAAC,GAAG,EAAE,CAAC,OAAO,EAAE;AAC5D,UAAU,OAAO;AACjB,SAAS;AACT,OAAO,CAAC,OAAO,CAAC,EAAE;AAClB,QAAQ,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,GAAG,GAAG,EAAE;AAC1C,UAAU,MAAM,IAAI,KAAK,CAAC,CAAC,gEAAgE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;AAClG,SAAS;AACT,OAAO;AACP,MAAM,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,KAAK,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;AAC/D,KAAK;AACL,GAAG,SAAS;AACZ,IAAI,EAAE,CAAC,OAAO,EAAE,CAAC;AACjB,GAAG;AACH,CAAC;AACM,eAAe,mBAAmB,CAAC,KAAK,EAAE;AACjD,EAAE,MAAM,IAAI,GAAG,MAAM,CAAC;AACtB,EAAE,MAAM,QAAQ,GAAGC,OAAI,EAAE,CAAC;AAC1B,EAAE,MAAM,EAAE,gBAAgB,EAAE,GAAG,MAAM,mFAAO,gBAAgB,MAAC,CAAC;AAC9D,EAAE,MAAM,SAAS,GAAG,MAAM,IAAI,gBAAgB,CAAC,KAAK,CAAC,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,qBAAqB,EAAE,QAAQ,CAAC,CAAC,SAAS,CAAC,EAAE,gBAAgB,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC;AACpK,EAAE,MAAM,IAAI,GAAG,SAAS,CAAC,OAAO,EAAE,CAAC;AACnC,EAAE,MAAM,IAAI,GAAG,SAAS,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;AAC7C,EAAE,MAAM,IAAI,GAAG,YAAY;AAC3B,IAAI,MAAM,SAAS,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC;AAC3C,GAAG,CAAC;AACJ,EAAE,MAAM,iBAAiB,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;AAC1D,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;AAC9C;;AClCA,eAAe,oBAAoB,CAAC,UAAU,EAAE;AAChD,EAAE,IAAI,EAAE,CAAC;AACT,EAAE,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;AAC/B,EAAE,MAAM,EAAE,GAAGD,oCAAgB,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC;AAC5D,EAAE,IAAI;AACN,IAAI,WAAW;AACf,MAAM,IAAI;AACV,QAAQ,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC;AAC5D,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC,KAAK,IAAI,GAAG,KAAK,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,EAAE;AACvF,UAAU,OAAO;AACjB,SAAS;AACT,OAAO,CAAC,OAAO,CAAC,EAAE;AAClB,QAAQ,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,GAAG,GAAG,EAAE;AAC1C,UAAU,MAAM,IAAI,KAAK,CAAC,CAAC,gEAAgE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;AAClG,SAAS;AACT,OAAO;AACP,MAAM,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,KAAK,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;AAC/D,KAAK;AACL,GAAG,SAAS;AACZ,IAAI,EAAE,CAAC,OAAO,EAAE,CAAC;AACjB,GAAG;AACH,CAAC;AACM,eAAe,sBAAsB,CAAC,KAAK,EAAE;AACpD,EAAE,MAAM,IAAI,GAAG,UAAU,CAAC;AAC1B,EAAE,MAAM,QAAQ,GAAGC,OAAI,EAAE,CAAC;AAC1B,EAAE,MAAM,EAAE,gBAAgB,EAAE,GAAG,MAAM,mFAAO,gBAAgB,MAAC,CAAC;AAC9D,EAAE,MAAM,SAAS,GAAG,MAAM,IAAI,gBAAgB,CAAC,KAAK,CAAC,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,mBAAmB,EAAE,QAAQ,CAAC,CAAC,SAAS,CAAC,EAAE,0BAA0B,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC;AAC5K,EAAE,MAAM,IAAI,GAAG,SAAS,CAAC,OAAO,EAAE,CAAC;AACnC,EAAE,MAAM,IAAI,GAAG,SAAS,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;AAC7C,EAAE,MAAM,IAAI,GAAG,YAAY;AAC3B,IAAI,MAAM,SAAS,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC;AAC3C,GAAG,CAAC;AACJ,EAAE,MAAM,oBAAoB,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;AAC7D,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;AAC9C;;ACpCO,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,CAAC;AAC1C,EAAE,WAAW,EAAE;AACf,IAAI,IAAI,EAAE,eAAe;AACzB,IAAI,MAAM,EAAE,IAAI;AAChB,IAAI,eAAe,EAAE,aAAa;AAClC,IAAI,uCAAuC,EAAE,sDAAsD;AACnG,GAAG;AACH,EAAE,UAAU,EAAE;AACd,IAAI,IAAI,EAAE,cAAc;AACxB,IAAI,MAAM,EAAE,IAAI;AAChB,IAAI,eAAe,EAAE,YAAY;AACjC,IAAI,uCAAuC,EAAE,qDAAqD;AAClG,GAAG;AACH,EAAE,OAAO,EAAE;AACX,IAAI,IAAI,EAAE,WAAW;AACrB,IAAI,MAAM,EAAE,QAAQ;AACpB,IAAI,eAAe,EAAE,SAAS;AAC9B,IAAI,uCAAuC,EAAE,kDAAkD;AAC/F,GAAG;AACH,EAAE,QAAQ,EAAE;AACZ,IAAI,IAAI,EAAE,YAAY;AACtB,IAAI,MAAM,EAAE,gBAAgB;AAC5B,GAAG;AACH,CAAC,CAAC;;ACdK,MAAM,aAAa,CAAC;AAC3B,EAAE,OAAO,MAAM,CAAC,OAAO,EAAE;AACzB,IAAI,MAAM,cAAc,GAAG;AAC3B,MAAM,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC;AACpC,MAAM,aAAa,EAAE,wBAAwB,EAAE;AAC/C,KAAK,CAAC;AACN,IAAI,MAAM,EAAE,GAAG,EAAE,aAAa,EAAE,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,cAAc,EAAE,OAAO,IAAI,IAAI,GAAG,OAAO,GAAG,EAAE,CAAC,CAAC;AACrG,IAAI,MAAM,YAAY,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,EAAE,KAAK;AAC5C,MAAM,MAAM,UAAU,GAAG,YAAY,CAAC,EAAE,CAAC,CAAC;AAC1C,MAAM,IAAI,CAAC,UAAU,EAAE;AACvB,QAAQ,OAAO,KAAK,CAAC;AACrB,OAAO;AACP,MAAM,IAAI,UAAU,CAAC,uCAAuC,IAAI,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,uCAAuC,CAAC,EAAE;AACjI,QAAQ,OAAO,IAAI,CAAC;AACpB,OAAO;AACP,MAAM,IAAI,CAAC,UAAU,CAAC,eAAe,EAAE;AACvC,QAAQ,OAAO,IAAI,CAAC;AACpB,OAAO;AACP,MAAM,IAAI,aAAa,EAAE;AACzB,QAAQ,OAAO,KAAK,CAAC;AACrB,OAAO;AACP,MAAM,OAAO,IAAI,CAAC;AAClB,KAAK,CAAC,CAAC;AACP,IAAI,MAAM,SAAS,GAAG,IAAI,aAAa,CAAC,YAAY,CAAC,CAAC;AACtD,IAAI,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE;AACjC,MAAM,QAAQ,CAAC,YAAY;AAC3B,QAAQ,MAAM,SAAS,CAAC,QAAQ,EAAE,CAAC;AACnC,OAAO,CAAC,CAAC;AACT,KAAK;AACL,IAAI,OAAO,SAAS,CAAC;AACrB,GAAG;AACH,EAAE,WAAW,CAAC,YAAY,EAAE;AAC5B,IAAI,IAAI,CAAC,YAAY,mBAAmB,IAAI,GAAG,EAAE,CAAC;AAClD,IAAI,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;AACrC,GAAG;AACH,EAAE,QAAQ,CAAC,EAAE,EAAE;AACf,IAAI,OAAO,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;AAC1C,GAAG;AACH,EAAE,eAAe,GAAG;AACpB,IAAI,OAAO,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;AAC/C,GAAG;AACH,EAAE,MAAM,IAAI,CAAC,EAAE,EAAE;AACjB,IAAI,MAAM,UAAU,GAAG,YAAY,CAAC,EAAE,CAAC,CAAC;AACxC,IAAI,IAAI,CAAC,UAAU,EAAE;AACrB,MAAM,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC9D,MAAM,MAAM,IAAI,KAAK,CAAC,CAAC,sBAAsB,EAAE,EAAE,CAAC,sBAAsB,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC;AACxF,KAAK;AACL,IAAI,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE;AACzC,MAAM,MAAM,UAAU,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACtD,MAAM,MAAM,IAAI,KAAK,CAAC,CAAC,0BAA0B,EAAE,EAAE,CAAC,2CAA2C,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC;AACjH,KAAK;AACL,IAAI,IAAI,QAAQ,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AAC7C,IAAI,IAAI,CAAC,QAAQ,EAAE;AACnB,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;AAChD,MAAM,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC;AAC1C,KAAK;AACL,IAAI,MAAM,UAAU,GAAG,MAAM,QAAQ,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC,EAAE,EAAEC,kBAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC;AACpH,IAAI,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;AAC1C,IAAI,OAAO,UAAU,CAAC;AACtB,GAAG;AACH,EAAE,MAAM,OAAO,CAAC,UAAU,EAAE;AAC5B,IAAI,IAAI,UAAU,CAAC,MAAM,KAAK,IAAI,IAAI,UAAU,CAAC,MAAM,KAAK,QAAQ,EAAE;AACtE,MAAM,MAAM,UAAU,GAAG,UAAU,CAAC,uCAAuC,CAAC;AAC5E,MAAM,IAAI,UAAU,EAAE;AACtB,QAAQ,MAAM,gBAAgB,GAAG,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;AACzD,QAAQ,IAAI,gBAAgB,EAAE;AAC9B,UAAU,MAAM,eAAe,GAAGC,6BAAe,CAAC,UAAU,CAAC,IAAIC,mBAAY,CAAC;AAC9E,YAAY,OAAO,EAAE;AACrB,cAAc,QAAQ,EAAE;AACxB,gBAAgB,MAAM,EAAE,UAAU,CAAC,MAAM;AACzC,gBAAgB,UAAU,EAAE,gBAAgB;AAC5C,eAAe;AACf,aAAa;AACb,WAAW,CAAC,CAAC,CAAC;AACd,UAAU,OAAO;AACjB,YAAY,eAAe;AAC3B,YAAY,WAAW,EAAE,EAAE;AAC3B,WAAW,CAAC;AACZ,SAAS;AACT,OAAO;AACP,KAAK;AACL,IAAI,QAAQ,UAAU,CAAC,MAAM;AAC7B,MAAM,KAAK,IAAI;AACf,QAAQ,OAAO,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC;AAC7C,MAAM,KAAK,QAAQ;AACnB,QAAQ,OAAO,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;AAC1C,MAAM,KAAK,gBAAgB,CAAC;AAC5B,MAAM,KAAK,SAAS;AACpB,QAAQ,OAAO,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;AAC3C,MAAM;AACN,QAAQ,MAAM,IAAI,KAAK,CAAC,CAAC,wBAAwB,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;AACxE,KAAK;AACL,GAAG;AACH,EAAE,MAAM,YAAY,CAAC,UAAU,EAAE;AACjC,IAAI,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,MAAM,sBAAsB,CAAC,UAAU,CAAC,eAAe,CAAC,CAAC;AAC1G,IAAI,MAAM,eAAe,GAAGD,6BAAe,CAAC,UAAU,CAAC,IAAIC,mBAAY,CAAC;AACxE,MAAM,OAAO,EAAE;AACf,QAAQ,QAAQ,EAAE;AAClB,UAAU,MAAM,EAAE,IAAI;AACtB,UAAU,UAAU,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE;AACpD,SAAS;AACT,OAAO;AACP,KAAK,CAAC,CAAC,CAAC;AACR,IAAI,OAAO;AACX,MAAM,aAAa,EAAE,IAAI;AACzB,MAAM,eAAe;AACrB,MAAM,WAAW,EAAE,EAAE;AACrB,KAAK,CAAC;AACN,GAAG;AACH,EAAE,MAAM,SAAS,CAAC,UAAU,EAAE;AAC9B,IAAI,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,MAAM,mBAAmB,CAAC,UAAU,CAAC,eAAe,CAAC,CAAC;AACvG,IAAI,MAAM,eAAe,GAAGD,6BAAe,CAAC,UAAU,CAAC,IAAIC,mBAAY,CAAC;AACxE,MAAM,OAAO,EAAE;AACf,QAAQ,QAAQ,EAAE;AAClB,UAAU,MAAM,EAAE,QAAQ;AAC1B,UAAU,UAAU,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE;AACpD,SAAS;AACT,OAAO;AACP,KAAK,CAAC,CAAC,CAAC;AACR,IAAI,OAAO;AACX,MAAM,aAAa,EAAE,IAAI;AACzB,MAAM,eAAe;AACrB,MAAM,WAAW,EAAE,EAAE;AACrB,KAAK,CAAC;AACN,GAAG;AACH,EAAE,MAAM,UAAU,CAAC,UAAU,EAAE;AAC/B,IAAI,MAAM,eAAe,GAAGD,6BAAe,CAAC,UAAU,CAAC,IAAIC,mBAAY,CAAC;AACxE,MAAM,OAAO,EAAE;AACf,QAAQ,QAAQ,EAAE;AAClB,UAAU,MAAM,EAAE,UAAU,CAAC,MAAM;AACnC,UAAU,UAAU,EAAE,UAAU;AAChC,SAAS;AACT,OAAO;AACP,KAAK,CAAC,CAAC,CAAC;AACR,IAAI,OAAO;AACX,MAAM,eAAe;AACrB,MAAM,WAAW,EAAE,EAAE;AACrB,KAAK,CAAC;AACN,GAAG;AACH,EAAE,MAAM,QAAQ,GAAG;AACnB,IAAI,MAAM,SAAS,GAAG,CAAC,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC,CAAC;AACtD,IAAI,MAAM,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,KAAK;AAC9E,MAAM,IAAI;AACV,QAAQ,MAAM,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;AAC/D,OAAO,CAAC,MAAM;AACd,OAAO;AACP,MAAM,IAAI;AACV,QAAQ,OAAO,aAAa,IAAI,IAAI,GAAG,KAAK,CAAC,GAAG,aAAa,EAAE,CAAC,CAAC;AACjE,OAAO,CAAC,MAAM;AACd,OAAO;AACP,KAAK,CAAC,CAAC,CAAC;AACR,GAAG;AACH;;ACjKO,SAAS,wBAAwB,CAAC,MAAM,EAAE;AACjD,EAAE,SAAS,CAAC,MAAM,MAAM,CAAC,MAAM,CAAC,EAAE,kBAAkB,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;AAClE,EAAE,QAAQ,CAAC,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;AACjC,EAAE,SAAS,CAAC,MAAM,MAAM,CAAC,aAAa,EAAE,CAAC,CAAC;AAC1C;;;;;;"}
|
|
1
|
+
{"version":3,"file":"index.cjs.js","sources":["../src/util/isDockerDisabledForTests.ts","../src/database/startMysqlContainer.ts","../src/database/startPostgresContainer.ts","../src/database/types.ts","../src/database/TestDatabases.ts","../src/msw/setupRequestMockHandlers.ts"],"sourcesContent":["/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/** @public */\nexport function isDockerDisabledForTests() {\n // If we are not running in continuous integration, the default is to skip\n // the (relatively heavy, long running) docker based tests. If you want to\n // still run local tests for all databases, just pass either the CI=1 env\n // parameter to your test runner, or individual connection strings per\n // database.\n return (\n Boolean(process.env.BACKSTAGE_TEST_DISABLE_DOCKER) ||\n !Boolean(process.env.CI)\n );\n}\n","/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport createConnection, { Knex } from 'knex';\nimport { v4 as uuid } from 'uuid';\n\nasync function waitForMysqlReady(\n connection: Knex.MySqlConnectionConfig,\n): Promise<void> {\n const startTime = Date.now();\n const db = createConnection({ client: 'mysql2', connection });\n\n try {\n for (;;) {\n try {\n const result = await db.select(db.raw('version() AS version'));\n if (result[0]?.version) {\n return;\n }\n } catch (e) {\n if (Date.now() - startTime > 30_000) {\n throw new Error(\n `Timed out waiting for the database to be ready for connections, ${e}`,\n );\n }\n }\n\n await new Promise(resolve => setTimeout(resolve, 100));\n }\n } finally {\n db.destroy();\n }\n}\n\nexport async function startMysqlContainer(image: string) {\n const user = 'root';\n const password = uuid();\n\n // Lazy-load to avoid side-effect of importing testcontainers\n const { GenericContainer } = await import('testcontainers');\n\n const container = await new GenericContainer(image)\n .withExposedPorts(3306)\n .withEnv('MYSQL_ROOT_PASSWORD', password)\n .withTmpFs({ '/var/lib/mysql': 'rw' })\n .start();\n\n const host = container.getHost();\n const port = container.getMappedPort(3306);\n const stop = async () => {\n await container.stop({ timeout: 10_000 });\n };\n\n await waitForMysqlReady({ host, port, user, password });\n\n return { host, port, user, password, stop };\n}\n","/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport createConnection, { Knex } from 'knex';\nimport { v4 as uuid } from 'uuid';\n\nasync function waitForPostgresReady(\n connection: Knex.PgConnectionConfig,\n): Promise<void> {\n const startTime = Date.now();\n const db = createConnection({ client: 'pg', connection });\n\n try {\n for (;;) {\n try {\n const result = await db.select(db.raw('version()'));\n if (Array.isArray(result) && result[0]?.version) {\n return;\n }\n } catch (e) {\n if (Date.now() - startTime > 30_000) {\n throw new Error(\n `Timed out waiting for the database to be ready for connections, ${e}`,\n );\n }\n }\n\n await new Promise(resolve => setTimeout(resolve, 100));\n }\n } finally {\n db.destroy();\n }\n}\n\nexport async function startPostgresContainer(image: string) {\n const user = 'postgres';\n const password = uuid();\n\n // Lazy-load to avoid side-effect of importing testcontainers\n const { GenericContainer } = await import('testcontainers');\n\n const container = await new GenericContainer(image)\n .withExposedPorts(5432)\n .withEnv('POSTGRES_PASSWORD', password)\n .withTmpFs({ '/var/lib/postgresql/data': 'rw' })\n .start();\n\n const host = container.getHost();\n const port = container.getMappedPort(5432);\n const stop = async () => {\n await container.stop({ timeout: 10_000 });\n };\n\n await waitForPostgresReady({ host, port, user, password });\n\n return { host, port, user, password, stop };\n}\n","/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { DatabaseManager } from '@backstage/backend-common';\nimport { Knex } from 'knex';\n\n/**\n * The possible databases to test against.\n *\n * @public\n */\nexport type TestDatabaseId =\n | 'POSTGRES_13'\n | 'POSTGRES_9'\n | 'MYSQL_8'\n | 'SQLITE_3';\n\nexport type TestDatabaseProperties = {\n name: string;\n driver: string;\n dockerImageName?: string;\n connectionStringEnvironmentVariableName?: string;\n};\n\nexport type Instance = {\n stopContainer?: () => Promise<void>;\n databaseManager: DatabaseManager;\n connections: Array<Knex>;\n};\n\nexport const allDatabases: Record<TestDatabaseId, TestDatabaseProperties> =\n Object.freeze({\n POSTGRES_13: {\n name: 'Postgres 13.x',\n driver: 'pg',\n dockerImageName: 'postgres:13',\n connectionStringEnvironmentVariableName:\n 'BACKSTAGE_TEST_DATABASE_POSTGRES13_CONNECTION_STRING',\n },\n POSTGRES_9: {\n name: 'Postgres 9.x',\n driver: 'pg',\n dockerImageName: 'postgres:9',\n connectionStringEnvironmentVariableName:\n 'BACKSTAGE_TEST_DATABASE_POSTGRES9_CONNECTION_STRING',\n },\n MYSQL_8: {\n name: 'MySQL 8.x',\n driver: 'mysql2',\n dockerImageName: 'mysql:8',\n connectionStringEnvironmentVariableName:\n 'BACKSTAGE_TEST_DATABASE_MYSQL8_CONNECTION_STRING',\n },\n SQLITE_3: {\n name: 'SQLite 3.x',\n driver: 'better-sqlite3',\n },\n });\n","/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { DatabaseManager } from '@backstage/backend-common';\nimport { ConfigReader } from '@backstage/config';\nimport { randomBytes } from 'crypto';\nimport { Knex } from 'knex';\nimport { isDockerDisabledForTests } from '../util/isDockerDisabledForTests';\nimport { startMysqlContainer } from './startMysqlContainer';\nimport { startPostgresContainer } from './startPostgresContainer';\nimport {\n allDatabases,\n Instance,\n TestDatabaseId,\n TestDatabaseProperties,\n} from './types';\n\n/**\n * Encapsulates the creation of ephemeral test database instances for use\n * inside unit or integration tests.\n *\n * @public\n */\nexport class TestDatabases {\n private readonly instanceById: Map<string, Instance>;\n private readonly supportedIds: TestDatabaseId[];\n\n /**\n * Creates an empty `TestDatabases` instance, and sets up Jest to clean up\n * all of its acquired resources after all tests finish.\n *\n * You typically want to create just a single instance like this at the top\n * of your test file or `describe` block, and then call `init` many times on\n * that instance inside the individual tests. Spinning up a \"physical\"\n * database instance takes a considerable amount of time, slowing down tests.\n * But initializing a new logical database inside that instance using `init`\n * is very fast.\n */\n static create(options?: {\n ids?: TestDatabaseId[];\n disableDocker?: boolean;\n }): TestDatabases {\n const defaultOptions = {\n ids: Object.keys(allDatabases) as TestDatabaseId[],\n disableDocker: isDockerDisabledForTests(),\n };\n\n const { ids, disableDocker } = Object.assign(\n {},\n defaultOptions,\n options ?? {},\n );\n\n const supportedIds = ids.filter(id => {\n const properties = allDatabases[id];\n if (!properties) {\n return false;\n }\n // If the caller has set up the env with an explicit connection string,\n // we'll assume that this database will work\n if (\n properties.connectionStringEnvironmentVariableName &&\n process.env[properties.connectionStringEnvironmentVariableName]\n ) {\n return true;\n }\n // If the database doesn't require docker at all, there's nothing to worry\n // about\n if (!properties.dockerImageName) {\n return true;\n }\n // If the database requires docker, but docker is disabled, we will fail.\n if (disableDocker) {\n return false;\n }\n return true;\n });\n\n const databases = new TestDatabases(supportedIds);\n\n if (supportedIds.length > 0) {\n afterAll(async () => {\n await databases.shutdown();\n });\n }\n\n return databases;\n }\n\n private constructor(supportedIds: TestDatabaseId[]) {\n this.instanceById = new Map();\n this.supportedIds = supportedIds;\n }\n\n supports(id: TestDatabaseId): boolean {\n return this.supportedIds.includes(id);\n }\n\n eachSupportedId(): [TestDatabaseId][] {\n return this.supportedIds.map(id => [id]);\n }\n\n /**\n * Returns a fresh, unique, empty logical database on an instance of the\n * given database ID platform.\n *\n * @param id - The ID of the database platform to use, e.g. 'POSTGRES_13'\n * @returns A `Knex` connection object\n */\n async init(id: TestDatabaseId): Promise<Knex> {\n const properties = allDatabases[id];\n if (!properties) {\n const candidates = Object.keys(allDatabases).join(', ');\n throw new Error(\n `Unknown test database ${id}, possible values are ${candidates}`,\n );\n }\n if (!this.supportedIds.includes(id)) {\n const candidates = this.supportedIds.join(', ');\n throw new Error(\n `Unsupported test database ${id} for this environment, possible values are ${candidates}`,\n );\n }\n\n let instance: Instance | undefined = this.instanceById.get(id);\n\n // Ensure that a testcontainers instance is up for this ID\n if (!instance) {\n instance = await this.initAny(properties);\n this.instanceById.set(id, instance);\n }\n\n // Ensure that a unique logical database is created in the instance\n const connection = await instance.databaseManager\n .forPlugin(`db${randomBytes(16).toString('hex')}`)\n .getClient();\n\n instance.connections.push(connection);\n\n return connection;\n }\n\n private async initAny(properties: TestDatabaseProperties): Promise<Instance> {\n // Use the connection string if provided\n if (properties.driver === 'pg' || properties.driver === 'mysql2') {\n const envVarName = properties.connectionStringEnvironmentVariableName;\n if (envVarName) {\n const connectionString = process.env[envVarName];\n if (connectionString) {\n const databaseManager = DatabaseManager.fromConfig(\n new ConfigReader({\n backend: {\n database: {\n client: properties.driver,\n connection: connectionString,\n },\n },\n }),\n );\n return {\n databaseManager,\n connections: [],\n };\n }\n }\n }\n\n // Otherwise start a container for the purpose\n switch (properties.driver) {\n case 'pg':\n return this.initPostgres(properties);\n case 'mysql2':\n return this.initMysql(properties);\n case 'better-sqlite3':\n case 'sqlite3':\n return this.initSqlite(properties);\n default:\n throw new Error(`Unknown database driver ${properties.driver}`);\n }\n }\n\n private async initPostgres(\n properties: TestDatabaseProperties,\n ): Promise<Instance> {\n const { host, port, user, password, stop } = await startPostgresContainer(\n properties.dockerImageName!,\n );\n\n const databaseManager = DatabaseManager.fromConfig(\n new ConfigReader({\n backend: {\n database: {\n client: 'pg',\n connection: { host, port, user, password },\n },\n },\n }),\n );\n\n return {\n stopContainer: stop,\n databaseManager,\n connections: [],\n };\n }\n\n private async initMysql(\n properties: TestDatabaseProperties,\n ): Promise<Instance> {\n const { host, port, user, password, stop } = await startMysqlContainer(\n properties.dockerImageName!,\n );\n\n const databaseManager = DatabaseManager.fromConfig(\n new ConfigReader({\n backend: {\n database: {\n client: 'mysql2',\n connection: { host, port, user, password },\n },\n },\n }),\n );\n\n return {\n stopContainer: stop,\n databaseManager,\n connections: [],\n };\n }\n\n private async initSqlite(\n properties: TestDatabaseProperties,\n ): Promise<Instance> {\n const databaseManager = DatabaseManager.fromConfig(\n new ConfigReader({\n backend: {\n database: {\n client: properties.driver,\n connection: ':memory:',\n },\n },\n }),\n );\n\n return {\n databaseManager,\n connections: [],\n };\n }\n\n private async shutdown() {\n const instances = [...this.instanceById.values()];\n await Promise.all(\n instances.map(async ({ stopContainer, connections }) => {\n try {\n await Promise.all(connections.map(c => c.destroy()));\n } catch {\n // ignore\n }\n try {\n await stopContainer?.();\n } catch {\n // ignore\n }\n }),\n );\n }\n}\n","/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * Sets up handlers for request mocking\n * @public\n * @param worker - service worker\n */\nexport function setupRequestMockHandlers(worker: {\n listen: (t: any) => void;\n close: () => void;\n resetHandlers: () => void;\n}) {\n beforeAll(() => worker.listen({ onUnhandledRequest: 'error' }));\n afterAll(() => worker.close());\n afterEach(() => worker.resetHandlers());\n}\n"],"names":["createConnection","uuid","randomBytes","DatabaseManager","ConfigReader"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@backstage/backend-test-utils",
|
|
3
3
|
"description": "Test helpers library for Backstage backends",
|
|
4
|
-
"version": "0.1.
|
|
4
|
+
"version": "0.1.27-next.0",
|
|
5
5
|
"main": "dist/index.cjs.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
7
7
|
"private": false,
|
|
@@ -34,8 +34,8 @@
|
|
|
34
34
|
"start": "backstage-cli package start"
|
|
35
35
|
},
|
|
36
36
|
"dependencies": {
|
|
37
|
-
"@backstage/backend-common": "^0.
|
|
38
|
-
"@backstage/cli": "^0.18.0",
|
|
37
|
+
"@backstage/backend-common": "^0.15.0-next.0",
|
|
38
|
+
"@backstage/cli": "^0.18.1-next.0",
|
|
39
39
|
"@backstage/config": "^1.0.1",
|
|
40
40
|
"better-sqlite3": "^7.5.0",
|
|
41
41
|
"knex": "^2.0.0",
|
|
@@ -46,10 +46,10 @@
|
|
|
46
46
|
"uuid": "^8.0.0"
|
|
47
47
|
},
|
|
48
48
|
"devDependencies": {
|
|
49
|
-
"@backstage/cli": "^0.18.0"
|
|
49
|
+
"@backstage/cli": "^0.18.1-next.0"
|
|
50
50
|
},
|
|
51
51
|
"files": [
|
|
52
52
|
"dist"
|
|
53
53
|
],
|
|
54
|
-
"gitHead": "
|
|
54
|
+
"gitHead": "fc3229c49caf6eced02ed9516199015bf4682664"
|
|
55
55
|
}
|