tests.ts•4.83 kB
import { PrismaBetterSQLite3 } from '@prisma/adapter-better-sqlite3'
import { PrismaLibSQL } from '@prisma/adapter-libsql'
import { randomUUID } from 'crypto'
import { AdapterProviders } from '../_utils/providers'
import { DatasourceInfo } from '../_utils/setupTestSuiteEnv'
import { NewPrismaClient } from '../_utils/types'
// @ts-ignore
import testMatrix from './_matrix'
import type * as imports from './generated/prisma/client'
declare const newPrismaClient: NewPrismaClient<imports.PrismaClient, typeof imports.PrismaClient>
testMatrix.setupTestSuite(
({ driverAdapter }, _suiteMeta, _clientMeta, _cliMeta, info) => {
test('can retrieve a unixepoch-ms date time with a find unique query', async () => {
const prisma = createClient(info, driverAdapter)
const created = await prisma.event.create({ data: { name: 'event' } })
expect(created).toMatchObject({ createdAt: expect.any(Date) })
const found = await prisma.event.findUnique({
where: {
uuid_createdAt: {
uuid: created.uuid,
createdAt: created.createdAt,
},
},
})
expect(found).toMatchObject(created)
})
test('can retrieve a unixepoch-ms date time with a find unique query when it was stored directly as a millis number', async () => {
const prisma = createClient(info, driverAdapter)
const uuid = randomUUID()
const now = new Date()
await prisma.$executeRaw`INSERT INTO Event (name, uuid, createdAt) VALUES ('event', ${uuid}, ${now.getTime()})`
const found = await prisma.event.findUnique({
where: {
uuid_createdAt: {
uuid,
createdAt: now,
},
},
})
expect(found).toMatchObject({ createdAt: now })
})
test('can retrieve a unixepoch-ms date time with a raw query', async () => {
const prisma = createClient(info, driverAdapter)
const created = await prisma.event.create({ data: { name: 'event' } })
expect(created).toMatchObject({ createdAt: expect.any(Date) })
const [event] = (await prisma.$queryRaw`SELECT * FROM Event WHERE createdAt = ${created.createdAt}`) as unknown[]
expect(event).toMatchObject(created)
})
test('can retrieve a unixepoch-ms date time with a raw query by a millis number', async () => {
const prisma = createClient(info, driverAdapter)
const created = await prisma.event.create({ data: { name: 'event' } })
expect(created).toMatchObject({ createdAt: expect.any(Date) })
const [event] =
(await prisma.$queryRaw`SELECT * FROM Event WHERE createdAt = ${created.createdAt.getTime()}`) as unknown[]
expect(event).toMatchObject(created)
})
test('can retrieve a unixepoch-ms date time with a find many query', async () => {
const prisma = createClient(info, driverAdapter)
const created = await prisma.event.create({ data: { name: 'event' } })
expect(created).toMatchObject({
createdAt: expect.any(Date),
})
const found = await prisma.event.findMany({
where: {
uuid: created.uuid,
createdAt: created.createdAt,
},
})
expect(found).toEqual([created])
})
test('can retrieve a unixepoch-ms date time with compactable find unique queries', async () => {
const prisma = createClient(info, driverAdapter)
const created = await prisma.event.create({ data: { name: 'event' } })
expect(created).toMatchObject({
createdAt: expect.any(Date),
})
const find = () =>
prisma.event.findUnique({
where: {
uuid_createdAt: {
uuid: created.uuid,
createdAt: created.createdAt,
},
},
})
// These two queries are going to be compacted together and run as one.
await expect(Promise.all([find(), find()])).resolves.toMatchObject([created, created])
})
},
{
optOut: {
from: ['sqlserver', 'mysql', 'postgresql', 'cockroachdb', 'mongodb'],
reason: 'testing sqlite-specific timestamp behavior',
},
skipDriverAdapter: {
from: ['js_d1'],
reason: 'D1 does not need to support the QE unixepoch-ms format',
},
skipDefaultClientInstance: true,
skip: (skip, options) => skip(options.driverAdapter === undefined, 'testing only driver adapters'),
},
)
function createClient(info: DatasourceInfo, driverAdapter?: `${AdapterProviders}`) {
const constructor = driverAdapter === AdapterProviders.JS_BETTER_SQLITE3 ? PrismaBetterSQLite3 : PrismaLibSQL
return newPrismaClient({
// @ts-test-if: driverAdapter !== undefined
adapter: new constructor(
{
url: info.databaseUrl,
},
{
timestampFormat: 'unixepoch-ms',
},
),
})
}