| import { GlobalConfig } from '@n8n/config'; |
| import type { entities } from '@n8n/db'; |
| import { Container } from '@n8n/di'; |
| import type { DataSourceOptions } from '@n8n/typeorm'; |
| import { DataSource as Connection } from '@n8n/typeorm'; |
| import { randomString } from 'n8n-workflow'; |
|
|
| import { DbConnection } from '@/databases/db-connection'; |
| import { DbConnectionOptions } from '@/databases/db-connection-options'; |
|
|
| export const testDbPrefix = 'n8n_test_'; |
|
|
| |
| |
| |
| export async function init() { |
| const globalConfig = Container.get(GlobalConfig); |
| const dbType = globalConfig.database.type; |
| const testDbName = `${testDbPrefix}${randomString(6, 10).toLowerCase()}_${Date.now()}`; |
|
|
| if (dbType === 'postgresdb') { |
| const bootstrapPostgres = await new Connection( |
| getBootstrapDBOptions('postgresdb'), |
| ).initialize(); |
| await bootstrapPostgres.query(`CREATE DATABASE ${testDbName}`); |
| await bootstrapPostgres.destroy(); |
|
|
| globalConfig.database.postgresdb.database = testDbName; |
| } else if (dbType === 'mysqldb' || dbType === 'mariadb') { |
| const bootstrapMysql = await new Connection(getBootstrapDBOptions('mysqldb')).initialize(); |
| await bootstrapMysql.query(`CREATE DATABASE ${testDbName} DEFAULT CHARACTER SET utf8mb4`); |
| await bootstrapMysql.destroy(); |
|
|
| globalConfig.database.mysqldb.database = testDbName; |
| } |
|
|
| const dbConnection = Container.get(DbConnection); |
| await dbConnection.init(); |
| await dbConnection.migrate(); |
| } |
|
|
| export function isReady() { |
| const { connectionState } = Container.get(DbConnection); |
| return connectionState.connected && connectionState.migrated; |
| } |
|
|
| |
| |
| |
| export async function terminate() { |
| const dbConnection = Container.get(DbConnection); |
| await dbConnection.close(); |
| dbConnection.connectionState.connected = false; |
| } |
|
|
| type EntityName = keyof typeof entities | 'InsightsRaw' | 'InsightsByPeriod' | 'InsightsMetadata'; |
|
|
| |
| |
| |
| export async function truncate(entities: EntityName[]) { |
| const connection = Container.get(Connection); |
|
|
| for (const name of entities) { |
| await connection.getRepository(name).delete({}); |
| } |
| } |
|
|
| |
| |
| |
| export const getBootstrapDBOptions = (dbType: 'postgresdb' | 'mysqldb'): DataSourceOptions => { |
| const globalConfig = Container.get(GlobalConfig); |
| const type = dbType === 'postgresdb' ? 'postgres' : 'mysql'; |
| return { |
| type, |
| ...Container.get(DbConnectionOptions).getOverrides(dbType), |
| database: type, |
| entityPrefix: globalConfig.database.tablePrefix, |
| schema: dbType === 'postgresdb' ? globalConfig.database.postgresdb.schema : undefined, |
| }; |
| }; |
|
|