fix: DML Enum property (#7846)

* fix: DML Enum property

* add more tests

* fix unit tests
This commit is contained in:
Adrien de Peretti
2024-06-26 17:01:57 +02:00
committed by GitHub
parent 8703f453be
commit 68dbcda84c
3 changed files with 113 additions and 0 deletions
@@ -827,6 +827,7 @@ describe("Entity builder", () => {
items: expect.any(Function), items: expect.any(Function),
nullable: false, nullable: false,
name: "role", name: "role",
type: "string",
}, },
created_at: { created_at: {
reference: "scalar", reference: "scalar",
@@ -935,6 +936,7 @@ describe("Entity builder", () => {
items: expect.any(Function), items: expect.any(Function),
nullable: false, nullable: false,
name: "role", name: "role",
type: "string",
}, },
created_at: { created_at: {
reference: "scalar", reference: "scalar",
@@ -1047,6 +1049,7 @@ describe("Entity builder", () => {
items: expect.any(Function), items: expect.any(Function),
nullable: true, nullable: true,
name: "role", name: "role",
type: "string",
}, },
created_at: { created_at: {
reference: "scalar", reference: "scalar",
@@ -12,6 +12,7 @@ import {
OnInit, OnInit,
PrimaryKey, PrimaryKey,
Property, Property,
Utils,
} from "@mikro-orm/core" } from "@mikro-orm/core"
/** /**
@@ -152,6 +153,7 @@ export function defineProperty(
Enum({ Enum({
items: () => field.dataType.options!.choices, items: () => field.dataType.options!.choices,
nullable: field.nullable, nullable: field.nullable,
type: Utils.getObjectType(field.dataType.options!.choices[0]),
/** /**
* MikroORM does not ignore undefined values for default when generating * MikroORM does not ignore undefined values for default when generating
* the database schema SQL. Conditionally add it here to prevent undefined * the database schema SQL. Conditionally add it here to prevent undefined
@@ -0,0 +1,108 @@
import {
CheckConstraintViolationException,
MetadataStorage,
MikroORM,
} from "@mikro-orm/core"
import { model } from "../entity-builder"
import { toMikroOrmEntities } from "../helpers/create-mikro-orm-entity"
import { createDatabase, dropDatabase } from "pg-god"
import { mikroOrmSerializer } from "../../dal"
import { FileSystem } from "../../common"
import { join } from "path"
import { EntityConstructor } from "@medusajs/types"
const DB_HOST = process.env.DB_HOST
const DB_USERNAME = process.env.DB_USERNAME
const DB_PASSWORD = process.env.DB_PASSWORD
const pgGodCredentials = {
user: DB_USERNAME,
password: DB_PASSWORD,
host: DB_HOST,
}
const fileSystem = new FileSystem(join(__dirname, "../../migrations"))
describe("EntityBuilder | enum", () => {
const dbName = "EntityBuilder-enum"
let orm!: MikroORM
let Team: EntityConstructor<any>, User: EntityConstructor<any>
afterAll(() => {
fileSystem.cleanup()
})
beforeEach(async () => {
MetadataStorage.clear()
const user = model.define("user", {
id: model.id(),
username: model.text(),
role: model.enum(["admin", "moderator", "editor"]),
})
;[User] = toMikroOrmEntities([user])
await createDatabase({ databaseName: dbName }, pgGodCredentials)
orm = await MikroORM.init({
entities: [User],
tsNode: true,
dbName,
debug: true,
type: "postgresql",
})
const migrator = orm.getMigrator()
await migrator.createMigration()
await migrator.up()
})
afterEach(async () => {
await orm.close()
await dropDatabase(
{ databaseName: dbName, errorIfNonExist: false },
pgGodCredentials
)
})
it(`should handle the enum property`, async () => {
let manager = orm.em.fork()
const user1 = manager.create(User, {
username: "User 1",
role: "admin",
})
await manager.persistAndFlush([user1])
manager = orm.em.fork()
const user = await manager.findOne(User, {
id: user1.id,
})
expect(mikroOrmSerializer<InstanceType<typeof User>>(user)).toEqual({
id: user1.id,
username: "User 1",
role: "admin",
created_at: expect.any(Date),
updated_at: expect.any(Date),
deleted_at: null,
})
})
it(`should fail to handle the enum property`, async () => {
let manager = orm.em.fork()
const user1 = manager.create(User, {
username: "User 1",
role: "test",
})
const err = await manager.persistAndFlush([user1]).catch((e) => e)
expect(err.name).toEqual(CheckConstraintViolationException.name)
})
})