tests.ts•3.77 kB
import { AdapterProviders, Providers } from '../../_utils/providers'
import testMatrix from './_matrix'
// @ts-ignore
import type { Prisma as PrismaNamespace, PrismaClient } from './generated/prisma/client'
declare let prisma: PrismaClient
declare let Prisma: typeof PrismaNamespace
// https://github.com/prisma/prisma/issues/11233
testMatrix.setupTestSuite(
  ({ provider, driverAdapter, clientEngineExecutor }) => {
    const usesMariadbDriver =
      driverAdapter === AdapterProviders.JS_MARIADB ||
      (clientEngineExecutor === 'remote' && provider === Providers.MYSQL)
    test('should not throw when using Prisma.empty inside $executeRaw', async () => {
      expect.assertions(1)
      let result: any
      try {
        result = await prisma.$executeRaw(Prisma.empty)
      } catch (error) {
        result = error
      }
      switch (provider) {
        case Providers.SQLITE:
          // TODO the error does not match to the usual one
          if (driverAdapter === AdapterProviders.JS_LIBSQL) {
            expect((result as Error).message).toContain(': not an error')
          } else if (driverAdapter === AdapterProviders.JS_D1) {
            expect((result as Error).message).toContain('D1_ERROR: No SQL statements detected.')
          } else if (driverAdapter === AdapterProviders.JS_BETTER_SQLITE3) {
            expect((result as Error).message).toContain('The supplied SQL string contains no statements')
          } else {
            expect((result as Error).message).toContain('Raw query failed. Code: `21`. Message: `not an error`')
          }
          break
        case Providers.POSTGRESQL:
        case Providers.COCKROACHDB:
        case Providers.SQLSERVER:
          expect(result).toEqual(0)
          break
        case Providers.MYSQL:
          if (usesMariadbDriver) {
            expect((result as Error).message).toContain('sql parameter is mandatory')
          } else {
            expect((result as Error).message).toContain('Query was empty')
          }
          break
        default:
          throw new Error('invalid provider')
      }
    })
    test('should not throw when using Prisma.empty inside $queryRaw', async () => {
      expect.assertions(1)
      let result: any
      try {
        result = await prisma.$queryRaw(Prisma.empty)
      } catch (error) {
        result = error
      }
      switch (provider) {
        case Providers.SQLITE:
          // TODO the error does not match to the usual one
          if (driverAdapter === AdapterProviders.JS_LIBSQL) {
            expect((result as Error).message).toContain(': not an error')
          } else if (driverAdapter === AdapterProviders.JS_D1) {
            expect((result as Error).message).toContain('D1_ERROR: No SQL statements detected.')
          } else if (driverAdapter === AdapterProviders.JS_BETTER_SQLITE3) {
            expect((result as Error).message).toContain('The supplied SQL string contains no statements')
          } else {
            expect((result as Error).message).toContain('Raw query failed. Code: `21`. Message: `not an error`')
          }
          break
        case Providers.POSTGRESQL:
        case Providers.COCKROACHDB:
        case Providers.SQLSERVER:
          expect(result).toEqual([])
          break
        case Providers.MYSQL:
          if (usesMariadbDriver) {
            expect((result as Error).message).toContain('sql parameter is mandatory')
          } else {
            expect((result as Error).message).toContain('Query was empty')
          }
          break
        default:
          throw new Error('invalid provider')
      }
    })
  },
  {
    optOut: {
      from: [Providers.MONGODB],
      reason: '$raw methods not allowed when using mongodb',
    },
  },
)