tests.ts•9.07 kB
import { copycat } from '@snaplet/copycat'
import { Providers } from '../../_utils/providers'
import testMatrix from './_matrix'
// @ts-ignore
import type * as $ from './generated/prisma/client'
declare let prisma: $.PrismaClient
declare let Prisma: typeof $.Prisma
// ported from: blog
testMatrix.setupTestSuite(
  ({ provider, driverAdapter }) => {
    const isD1DriverAdapter = driverAdapter === 'js_d1'
    beforeAll(async () => {
      await prisma.user.create({
        data: {
          id: copycat.uuid(1).replaceAll('-', '').slice(-24),
          email: copycat.email(1),
          age: 20,
        },
      })
      await prisma.user.create({
        data: {
          id: copycat.uuid(2).replaceAll('-', '').slice(-24),
          email: copycat.email(2),
          age: 45,
        },
      })
      await prisma.user.create({
        data: {
          id: copycat.uuid(3).replaceAll('-', '').slice(-24),
          email: copycat.email(3),
          age: 60,
        },
      })
      await prisma.user.create({
        data: {
          id: copycat.uuid(4).replaceAll('-', '').slice(-24),
          email: copycat.email(4),
          age: 63,
        },
      })
    })
    // TODO snapshot for planetscale is `":vtg1 /* INT64 */": 1n` while mysql is `"1": 1n`, maybe it's normal?
    test('select 1 via queryRaw', async () => {
      const result: any = await prisma.$queryRaw`
        SELECT 1
      `
      const results = {
        postgresql: [{ '?column?': 1 }],
        cockroachdb: [{ '?column?': BigInt('1') }],
        mysql: [{ '1': BigInt('1') }],
        sqlite: [{ '1': isD1DriverAdapter ? 1 : BigInt('1') }],
        sqlserver: [{ '': 1 }],
      }
      const resultsByDriverAdapter = {
        js_planetscale: [{ ':vtg1 /* INT64 */': BigInt('1') }],
      }
      if (driverAdapter && resultsByDriverAdapter[driverAdapter]) {
        expect(result).toStrictEqual(resultsByDriverAdapter[driverAdapter])
      } else {
        expect(result).toStrictEqual(results[provider])
      }
    })
    test('select 1 via queryRawUnsafe', async () => {
      const result: any = await prisma.$queryRawUnsafe(`
        SELECT 1 as "number"
      `)
      const results = {
        postgresql: [{ number: 1 }],
        cockroachdb: [{ number: BigInt('1') }],
        mysql: [{ number: BigInt('1') }],
        sqlite: [{ number: isD1DriverAdapter ? 1 : BigInt('1') }],
        sqlserver: [{ number: 1 }],
      }
      expect(result).toStrictEqual(results[provider])
    })
    test('select with alias via queryRaw', async () => {
      const result: any = await prisma.$queryRaw`
        SELECT 1 as "number"
      `
      const results = {
        postgresql: [{ number: 1 }],
        cockroachdb: [{ number: BigInt('1') }],
        mysql: [{ number: BigInt('1') }],
        sqlite: [{ number: isD1DriverAdapter ? 1 : BigInt('1') }],
        sqlserver: [{ number: 1 }],
      }
      expect(result).toStrictEqual(results[provider])
    })
    // TODO snapshot for planetscale is `":vtg1 /* INT64 */": 1n` while mysql is `"1": 1n`, maybe it's normal?
    test('select values via queryRawUnsafe', async () => {
      const result: any = await prisma.$queryRawUnsafe(`
        SELECT 1
      `)
      const results = {
        postgresql: [{ '?column?': 1 }],
        cockroachdb: [{ '?column?': BigInt('1') }],
        mysql: [{ '1': BigInt('1') }],
        sqlite: [{ '1': isD1DriverAdapter ? 1 : BigInt('1') }],
        sqlserver: [{ '': 1 }],
      }
      const resultsByDriverAdapter = {
        js_planetscale: [{ ':vtg1 /* INT64 */': BigInt('1') }],
      }
      if (driverAdapter && resultsByDriverAdapter[driverAdapter]) {
        expect(result).toStrictEqual(resultsByDriverAdapter[driverAdapter])
      } else {
        expect(result).toStrictEqual(results[provider])
      }
    })
    test('select * via queryRawUnsafe', async () => {
      let result: any[] = []
      if (provider === Providers.MYSQL) {
        result = await prisma.$queryRawUnsafe(`
          SELECT * FROM User WHERE age >= ${45} AND age <= ${60}
        `)
      } else {
        result = await prisma.$queryRawUnsafe(`
          SELECT * FROM "User" WHERE age >= ${45} AND age <= ${60}
        `)
      }
      result.sort((a, b) => a.id.localeCompare(b.id))
      expect(result).toMatchInlineSnapshot(`
        [
          {
            "age": 60,
            "email": "Kyla_Crist96556@cancollaboration.biz",
            "id": "a7fe5dac91ab6b0f529430c5",
            "name": null,
          },
          {
            "age": 45,
            "email": "Sam.Dickinson32909@memorableparticular.org",
            "id": "a85d5d75a3a886cb61eb3a0e",
            "name": null,
          },
        ]
      `)
    })
    test('select * via queryRawUnsafe with values', async () => {
      let result: any[] = []
      if (provider === Providers.MYSQL || driverAdapter === 'js_better_sqlite3') {
        result = await prisma.$queryRawUnsafe(`SELECT * FROM User WHERE age >= ? AND age <= ?`, 45, 60)
      } else if (provider === Providers.SQLSERVER) {
        result = await prisma.$queryRawUnsafe(`SELECT * FROM "User" WHERE age >= @P1 AND age <= @P2`, 45, 60)
      } else {
        result = await prisma.$queryRawUnsafe(`SELECT * FROM "User" WHERE age >= $1 AND age <= $2`, 45, 60)
      }
      result.sort((a, b) => a.id.localeCompare(b.id))
      expect(result).toMatchInlineSnapshot(`
        [
          {
            "age": 60,
            "email": "Kyla_Crist96556@cancollaboration.biz",
            "id": "a7fe5dac91ab6b0f529430c5",
            "name": null,
          },
          {
            "age": 45,
            "email": "Sam.Dickinson32909@memorableparticular.org",
            "id": "a85d5d75a3a886cb61eb3a0e",
            "name": null,
          },
        ]
      `)
    })
    test('select * via queryRaw', async () => {
      let result: any[] = []
      if (provider === Providers.MYSQL) {
        result = await prisma.$queryRaw`
          SELECT * FROM User WHERE age >= ${45} AND age <= ${60}
        `
      } else {
        result = await prisma.$queryRaw`
          SELECT * FROM "User" WHERE age >= ${45} AND age <= ${60}
        `
      }
      result.sort((a, b) => a.id.localeCompare(b.id))
      expect(result).toMatchInlineSnapshot(`
        [
          {
            "age": 60,
            "email": "Kyla_Crist96556@cancollaboration.biz",
            "id": "a7fe5dac91ab6b0f529430c5",
            "name": null,
          },
          {
            "age": 45,
            "email": "Sam.Dickinson32909@memorableparticular.org",
            "id": "a85d5d75a3a886cb61eb3a0e",
            "name": null,
          },
        ]
      `)
    })
    test('select fields via queryRaw using Prisma.join', async () => {
      let result: any[] = []
      if (provider === Providers.MYSQL) {
        result = await prisma.$queryRaw`
          SELECT ${Prisma.join([
            Prisma.raw('age'),
            Prisma.raw('email'),
            Prisma.raw('id'),
          ])} FROM User WHERE age IN (${Prisma.join([45, 60])})
        `
      } else {
        result = await prisma.$queryRaw`
          SELECT ${Prisma.join([
            Prisma.raw('age'),
            Prisma.raw('email'),
            Prisma.raw('id'),
          ])} FROM "User" WHERE age IN (${Prisma.join([45, 60])})
        `
      }
      result.sort((a, b) => a.id.localeCompare(b.id))
      expect(result).toMatchInlineSnapshot(`
        [
          {
            "age": 60,
            "email": "Kyla_Crist96556@cancollaboration.biz",
            "id": "a7fe5dac91ab6b0f529430c5",
          },
          {
            "age": 45,
            "email": "Sam.Dickinson32909@memorableparticular.org",
            "id": "a85d5d75a3a886cb61eb3a0e",
          },
        ]
      `)
    })
    test('select fields via queryRaw using Prisma.join and Prisma.sql', async () => {
      let result: any[] = []
      if (provider === Providers.MYSQL) {
        result = await prisma.$queryRaw(Prisma.sql`
          SELECT ${Prisma.join([
            Prisma.raw('age'),
            Prisma.raw('email'),
            Prisma.raw('id'),
          ])} FROM User WHERE age IN (${Prisma.join([45, 60])})
        `)
      } else {
        result = await prisma.$queryRaw(Prisma.sql`
          SELECT ${Prisma.join([
            Prisma.raw('age'),
            Prisma.raw('email'),
            Prisma.raw('id'),
          ])} FROM "User" WHERE age IN (${Prisma.join([45, 60])})
        `)
      }
      result.sort((a, b) => a.id.localeCompare(b.id))
      expect(result).toMatchInlineSnapshot(`
        [
          {
            "age": 60,
            "email": "Kyla_Crist96556@cancollaboration.biz",
            "id": "a7fe5dac91ab6b0f529430c5",
          },
          {
            "age": 45,
            "email": "Sam.Dickinson32909@memorableparticular.org",
            "id": "a85d5d75a3a886cb61eb3a0e",
          },
        ]
      `)
    })
  },
  {
    optOut: {
      from: [Providers.MONGODB],
      reason: 'MongoDB does not support raw queries',
    },
  },
)