Skip to content

Commit

Permalink
chore(): Fix database test utils and utils (#6383)
Browse files Browse the repository at this point in the history
**What**
Fix the test utils database to trully run the migrations, the migration path is deprecated and not used anymore as umzung infer the path under the hood. It also fix the schema so that it is possible to specify different schema if needed.

The index helper can now create named constraints for uniqueness. 

extracted [from](#6381)
  • Loading branch information
adrien2p authored Feb 12, 2024
1 parent 1593e0b commit e85463b
Show file tree
Hide file tree
Showing 5 changed files with 89 additions and 31 deletions.
6 changes: 6 additions & 0 deletions .changeset/warm-garlics-drive.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
---
"medusa-test-utils": patch
"@medusajs/utils": patch
---

chore(): Fix database test utils and utils
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ export class Migration20240124154000 extends Migration {
'create index if not exists "IDX_customer_address_customer_id" on "customer_address" ("customer_id");'
)
this.addSql(
'create unique index "IDX_customer_address_unqiue_customer_billing" on "customer_address" ("customer_id") where "is_default_billing" = true;'
'create unique index "IDX_customer_address_unique_customer_billing" on "customer_address" ("customer_id") where "is_default_billing" = true;'
)
this.addSql(
'create unique index "IDX_customer_address_unique_customer_shipping" on "customer_address" ("customer_id") where "is_default_shipping" = true;'
Expand Down
72 changes: 50 additions & 22 deletions packages/medusa-test-utils/src/database.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { TSMigrationGenerator } from "@mikro-orm/migrations"
import { MikroORM, Options, SqlEntityManager } from "@mikro-orm/postgresql"
import * as process from "process"
import { Migrator } from "@mikro-orm/migrations"

export function getDatabaseURL(): string {
const DB_HOST = process.env.DB_HOST ?? "localhost"
Expand All @@ -15,31 +15,26 @@ export function getDatabaseURL(): string {

export function getMikroOrmConfig(
mikroOrmEntities: any[],
pathToMigrations: string
pathToMigrations: string, // deprecated, auto inferred
schema?: string
): Options {
const DB_URL = getDatabaseURL()

return {
type: "postgresql",
clientUrl: DB_URL,
entities: Object.values(mikroOrmEntities),
schema: process.env.MEDUSA_DB_SCHEMA,
schema: schema ?? process.env.MEDUSA_DB_SCHEMA,
debug: false,
migrations: {
path: pathToMigrations,
pathTs: pathToMigrations,
glob: "!(*.d).{js,ts}",
silent: true,
dropTables: true,
transactional: true,
allOrNothing: true,
safe: false,
generator: TSMigrationGenerator,
},
extensions: [Migrator],
}
}

export interface TestDatabase {
mikroOrmEntities: any[]
pathToMigrations: any // deprecated, auto inferred
schema?: string

orm: MikroORM | null
manager: SqlEntityManager | null

Expand All @@ -52,9 +47,14 @@ export interface TestDatabase {

export function getMikroOrmWrapper(
mikroOrmEntities: any[],
pathToMigrations: string
pathToMigrations: string, // deprecated, auto inferred
schema?: string
): TestDatabase {
return {
mikroOrmEntities,
pathToMigrations, // deprecated, auto inferred
schema: schema ?? process.env.MEDUSA_DB_SCHEMA,

orm: null,
manager: null,

Expand Down Expand Up @@ -83,26 +83,54 @@ export function getMikroOrmWrapper(
},

async setupDatabase() {
const OrmConfig = getMikroOrmConfig(mikroOrmEntities, pathToMigrations)
const OrmConfig = getMikroOrmConfig(
this.mikroOrmEntities,
this.pathToMigrations,
this.schema
)

// Initializing the ORM
this.orm = await MikroORM.init(OrmConfig)

if (this.orm === null) {
throw new Error("ORM not configured")
}
this.manager = this.orm.em

this.manager = await this.orm.em
try {
await this.orm.getSchemaGenerator().ensureDatabase()
} catch (err) {}

await this.orm.schema.refreshDatabase() // ensure db exists and is fresh
await this.manager?.execute(
`CREATE SCHEMA IF NOT EXISTS "${this.schema ?? "public"}";`
)

const pendingMigrations = await this.orm
.getMigrator()
.getPendingMigrations()

if (pendingMigrations && pendingMigrations.length > 0) {
await this.orm
.getMigrator()
.up({ migrations: pendingMigrations.map((m) => m.name!) })
} else {
await this.orm.schema.refreshDatabase() // ensure db exists and is fresh
}
},

async clearDatabase() {
if (this.orm === null) {
throw new Error("ORM not configured")
}

await this.orm.close()
await this.manager?.execute(
`DROP SCHEMA IF EXISTS "${this.schema ?? "public"}" CASCADE;`
)

await this.manager?.execute(
`CREATE SCHEMA IF NOT EXISTS "${this.schema ?? "public"}";`
)

try {
await this.orm.close()
} catch {}

this.orm = null
this.manager = null
Expand Down
31 changes: 24 additions & 7 deletions packages/utils/src/common/__tests__/create-psql-index-helper.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ describe("createPsqlIndexStatementHelper", function () {

const indexStatement = createPsqlIndexStatementHelper(options)
expect(indexStatement).toEqual(
`CREATE INDEX IF NOT EXISTS ${options.name} ON ${options.tableName} (${options.columns})`
`CREATE INDEX IF NOT EXISTS "${options.name}" ON "${options.tableName}" (${options.columns})`
)
})

Expand All @@ -23,9 +23,9 @@ describe("createPsqlIndexStatementHelper", function () {

const indexStatement = createPsqlIndexStatementHelper(options)
expect(indexStatement).toEqual(
`CREATE INDEX IF NOT EXISTS ${options.name} ON ${
`CREATE INDEX IF NOT EXISTS "${options.name}" ON "${
options.tableName
} (${options.columns.join(", ")})`
}" (${options.columns.join(", ")})`
)
})

Expand All @@ -39,9 +39,9 @@ describe("createPsqlIndexStatementHelper", function () {

const indexStatement = createPsqlIndexStatementHelper(options)
expect(indexStatement).toEqual(
`CREATE INDEX IF NOT EXISTS ${options.name} ON ${
`CREATE INDEX IF NOT EXISTS "${options.name}" ON "${
options.tableName
} (${options.columns.join(", ")}) WHERE ${options.where}`
}" (${options.columns.join(", ")}) WHERE ${options.where}`
)
})

Expand All @@ -56,9 +56,26 @@ describe("createPsqlIndexStatementHelper", function () {

const indexStatement = createPsqlIndexStatementHelper(options)
expect(indexStatement).toEqual(
`CREATE INDEX IF NOT EXISTS ${options.name} ON ${
`CREATE INDEX IF NOT EXISTS "${options.name}" ON "${
options.tableName
} USING GIN (${options.columns.join(", ")}) WHERE ${options.where}`
}" USING GIN (${options.columns.join(", ")}) WHERE ${options.where}`
)
})

it("should generate unique constraint", function () {
const options = {
name: "index_name",
tableName: "table_name",
columns: ["column_name_1", "column_name_2"],
unique: true,
where: "column_name_1 IS NOT NULL",
}

const indexStatement = createPsqlIndexStatementHelper(options)
expect(indexStatement).toEqual(
`ALTER TABLE IF EXISTS "${options.tableName}" ADD CONSTRAINT "${
options.name
}" UNIQUE (${options.columns.join(", ")}) WHERE ${options.where}`
)
})
})
9 changes: 8 additions & 1 deletion packages/utils/src/common/create-psql-index-helper.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
* @param columns The columns to index
* @param type The type of index (e.g GIN, GIST, BTREE, etc)
* @param where The where clause
* @param unique If the index should be a unique index
*
* @example
* createPsqlIndexStatementHelper({
Expand Down Expand Up @@ -32,16 +33,22 @@ export function createPsqlIndexStatementHelper({
columns,
type,
where,
unique,
}: {
name: string
tableName: string
columns: string | string[]
type?: string
where?: string
unique?: boolean
}) {
columns = Array.isArray(columns) ? columns.join(", ") : columns
const typeStr = type ? ` USING ${type}` : ""
const optionsStr = where ? ` WHERE ${where}` : ""

return `CREATE INDEX IF NOT EXISTS ${name} ON ${tableName}${typeStr} (${columns})${optionsStr}`
if (!unique) {
return `CREATE INDEX IF NOT EXISTS "${name}" ON "${tableName}"${typeStr} (${columns})${optionsStr}`
} else {
return `ALTER TABLE IF EXISTS "${tableName}" ADD CONSTRAINT "${name}" UNIQUE (${columns})${optionsStr}`
}
}

0 comments on commit e85463b

Please sign in to comment.