tests.ts•6.61 kB
import { AdapterProviders, Providers } from '../../_utils/providers'
import testMatrix from './_matrix'
// @ts-ignore
import type { PrismaClient } from './generated/prisma/client'
declare let prisma: PrismaClient
testMatrix.setupTestSuite(
(suiteConfig) => {
describe('unique constraint violation', () => {
const user1_cuid = 'tz4a98xxat96iws9zmbrgj3a'
const user2_cuid = 'tz4a98xxat96iws9zmbrgj3b'
// Create a user with the same email as the test email
// This is to ensure that the test email is already in the database
beforeAll(async () => {
await prisma.user.create({
data: {
id: user1_cuid,
email: suiteConfig.testEmail,
},
})
})
describe('modelName is returned on error.meta', () => {
it('should return modelName on error.meta when performing prisma.model.create', async () => {
const createDuplicateUserWithEmail = async () => {
await prisma.user.create({
data: {
email: suiteConfig.testEmail,
},
})
}
try {
await createDuplicateUserWithEmail()
// If the above function doesn't throw an error, fail the test
expect(true).toBe(false)
} catch (e) {
expect(e.name).toBeDefined()
expect(e.code).toBeDefined()
expect(e.meta).toBeDefined()
expect(e.meta.modelName).toBeDefined()
expect(e.name).toBe('PrismaClientKnownRequestError')
expect(e.code).toBe('P2002')
expect(e.meta.modelName).toBe('User')
}
})
it('should return modelName on error.meta when performing prisma$transaction with the client', async () => {
const createDuplicateUserWithEmail = async () => {
await prisma.$transaction([
prisma.user.create({
data: {
email: suiteConfig.testEmail,
},
}),
prisma.user.create({
data: {
email: suiteConfig.testEmail,
},
}),
])
}
try {
await createDuplicateUserWithEmail()
// If the above function doesn't throw an error, fail the test
expect(true).toBe(false)
} catch (e) {
expect(e.name).toBeDefined()
expect(e.code).toBeDefined()
expect(e.meta).toBeDefined()
expect(e.meta.modelName).toBeDefined()
expect(e.name).toBe('PrismaClientKnownRequestError')
expect(e.code).toBe('P2002')
expect(e.meta.modelName).toBe('User')
}
})
})
describe('modelName is not returned on error.meta', () => {
it('should not return modelName when performing queryRaw', async () => {
const createTwoUserWithSameEmail = async () => {
if (suiteConfig.provider === Providers.MYSQL) {
await prisma.$queryRaw`INSERT INTO \`User\` (\`id\`, \`email\`) VALUES (${user2_cuid}, ${suiteConfig.testEmail});`
} else {
await prisma.$queryRaw`INSERT INTO "User" (id, email) VALUES (${user2_cuid}, ${suiteConfig.testEmail});`
}
}
try {
await createTwoUserWithSameEmail()
// If the above function doesn't throw an error, fail the test
expect(true).toBe(false)
} catch (e) {
expect(e.name).toBeDefined()
expect(e.code).toBeDefined()
expect(e.meta).toBeDefined()
expect(e.name).toBe('PrismaClientKnownRequestError')
expect(e.code).toBe('P2010')
expect(Object.keys(e.meta).includes('modelName')).toBe(false)
}
})
it('should not return modelName when performing executeRaw', async () => {
const createTwoUserWithSameEmail = async () => {
if (suiteConfig.provider === Providers.MYSQL) {
await prisma.$executeRaw`INSERT INTO \`User\` (\`id\`, \`email\`) VALUES (${user2_cuid}, ${suiteConfig.testEmail});`
} else {
await prisma.$executeRaw`INSERT INTO "User" (id, email) VALUES (${user2_cuid}, ${suiteConfig.testEmail});`
}
}
try {
await createTwoUserWithSameEmail()
// If the above function doesn't throw an error, fail the test
expect(true).toBe(false)
} catch (e) {
expect(e.name).toBeDefined()
expect(e.code).toBeDefined()
expect(e.meta).toBeDefined()
expect(e.name).toBe('PrismaClientKnownRequestError')
expect(e.code).toBe('P2010')
expect(Object.keys(e.meta).includes('modelName')).toBe(false)
}
})
it('should not return modelName when performing transactions with raw queries', async () => {
const createTwoUserWithSameEmail = async () => {
if (suiteConfig.provider === Providers.MYSQL) {
await prisma.$transaction([
prisma.$executeRaw`INSERT INTO \`User\` (\`id\`, \`email\`) VALUES (${user2_cuid}, ${suiteConfig.testEmail});`,
prisma.$executeRaw`INSERT INTO \`User\` (\`id\`, \`email\`) VALUES (${user2_cuid}, ${suiteConfig.testEmail});`,
])
} else {
await prisma.$transaction([
prisma.$executeRaw`INSERT INTO "User" (id, email) VALUES (${user2_cuid}, ${suiteConfig.testEmail});`,
prisma.$executeRaw`INSERT INTO "User" (id, email) VALUES (${user2_cuid}, ${suiteConfig.testEmail});`,
])
}
}
try {
await createTwoUserWithSameEmail()
// If the above function doesn't throw an error, fail the test
expect(true).toBe(false)
} catch (e) {
expect(e.name).toBeDefined()
expect(e.code).toBeDefined()
expect(e.meta).toBeDefined()
expect(e.name).toBe('PrismaClientKnownRequestError')
expect(e.code).toBe('P2010')
expect(Object.keys(e.meta).includes('modelName')).toBe(false)
}
})
})
})
},
{
optOut: {
from: [Providers.MONGODB],
reason: "MongoDB doesn't support raw queries",
},
skipDriverAdapter: {
from: [AdapterProviders.JS_LIBSQL],
reason: 'js_libsql: SIGABRT due to panic in libsql (not yet implemented: array)', // TODO: ORM-867
},
},
)