tests.ts•3.32 kB
import { PrismaPg } from '@prisma/adapter-pg'
import { expectTypeOf } from 'expect-type'
import { NewPrismaClient } from '../_utils/types'
// @ts-ignore
import testMatrix from './_matrix'
import type * as imports from './generated/prisma/client'
declare let prisma: imports.PrismaClient
declare const newPrismaClient: NewPrismaClient<imports.PrismaClient, typeof imports.PrismaClient>
declare let loaded: {
Plan: typeof imports.Plan
}
testMatrix.setupTestSuite(
({ driverAdapter, clientRuntime }, _suiteMeta, _clientMeta, _cliMeta, info) => {
test('can create data with an enum array', async () => {
const { Plan } = loaded
await prisma.user.create({
data: {
plans: [Plan.FREE],
},
})
})
test('can retrieve data with an enum array', async () => {
const { Plan } = loaded
const user = await prisma.user.create({
data: {
plans: [Plan.FREE],
},
})
const data = await prisma.user.findFirstOrThrow({
where: {
id: user.id,
},
})
expectTypeOf(data.plans).toEqualTypeOf<imports.Plan[]>()
expect(data.plans).toEqual([Plan.FREE])
})
testIf(driverAdapter === 'js_pg' && clientRuntime === 'client')(
'can retrieve data with an enum array with a raw query and a custom parser',
async () => {
const { Plan } = loaded
const prisma = newPrismaClient({
// @ts-test-if: provider !== Providers.MONGODB
adapter: new PrismaPg(
{
connectionString: info.databaseUrl,
},
{
userDefinedTypeParser: async (oid, value, queryable) => {
const result = await queryable.queryRaw({
sql: `
SELECT t.typtype::text AS type, e.typtype::text AS element_type
FROM pg_type t
JOIN pg_type e ON t.typelem = e.oid
WHERE t.oid = $1`,
args: [oid],
argTypes: [{ arity: 'scalar', scalarType: 'int' }],
})
const [[baseType, elementType]] = result.rows
if (baseType === 'b' && elementType === 'e') {
return (value as string).replace(/^\{/, '').replace(/\}$/, '').split(',')
} else {
return value
}
},
},
),
})
// @ts-test-if: provider !== Providers.MONGODB
const users = await prisma.user.createManyAndReturn({
data: [
{
plans: [Plan.FREE, Plan.CUSTOM],
},
{
plans: [Plan.CUSTOM],
},
],
})
// @ts-test-if: provider !== Providers.MONGODB
const data = await prisma.$queryRaw<imports.User[]>`
SELECT * FROM "User" WHERE "plans" @> Array['CUSTOM']::"Plan"[]
`
expect(data).toMatchObject([
{
id: users[0].id,
plans: [Plan.FREE, Plan.CUSTOM],
},
{
id: users[1].id,
plans: [Plan.CUSTOM],
},
])
},
)
},
{
optOut: {
from: ['sqlserver', 'mysql', 'sqlite'],
reason: 'enum arrays are not supported',
},
},
)