Generate.test.ts•28 kB
import path from 'node:path'
import { defaultTestConfig } from '@prisma/config'
import { BaseContext, jestConsoleContext, jestContext } from '@prisma/get-platform'
import { ClientEngineType, getClientEngineType } from '@prisma/internals'
import { Generate } from '../../Generate'
import { promotions, renderPromotion } from '../../utils/handlePromotions'
const ctx = jestContext.new().add(jestConsoleContext()).assemble()
function restoreEnvSnapshot(snapshot: NodeJS.ProcessEnv) {
  for (const key of Object.keys(process.env)) {
    if (!(key in snapshot)) {
      delete process.env[key]
    }
  }
  for (const [key, value] of Object.entries(snapshot)) {
    if (value === undefined) {
      delete process.env[key]
    } else {
      process.env[key] = value
    }
  }
}
describe('using cli', () => {
  // Replace any possible entry in `promotions`'s texts with a fixed string to make the snapshot stable
  function sanitiseStdout(stdout: string): string {
    return Object.values(promotions)
      .map((promotion) => renderPromotion(promotion))
      .reduce((acc, curr) => {
        return acc.replace(curr, 'Tip: MOCKED RANDOM TIP')
      }, stdout)
      .trimEnd()
  }
  it('should work with a custom output dir', async () => {
    ctx.fixture('example-project')
    const data = await ctx.cli('generate')
    const stdout = sanitiseStdout(data.stdout)
    if (typeof data.signal === 'number' && data.signal !== 0) {
      throw new Error(data.stderr + data.stdout)
    }
    const { main } = await import(ctx.fs.path('main.ts'))
    if (getClientEngineType() === ClientEngineType.Binary) {
      expect(stdout).toMatchInlineSnapshot(`
        "Prisma schema loaded from prisma/schema.prisma
        ✔ Generated Prisma Client (v0.0.0, engine=binary) to ./generated/client in XXXms
        Start by importing your Prisma Client (See: https://pris.ly/d/importing-client)
        Tip: MOCKED RANDOM TIP"
      `)
    } else {
      expect(stdout).toMatchInlineSnapshot(`
        "Prisma schema loaded from prisma/schema.prisma
        ✔ Generated Prisma Client (v0.0.0) to ./generated/client in XXXms
        Start by importing your Prisma Client (See: https://pris.ly/d/importing-client)
        Tip: MOCKED RANDOM TIP"
      `)
    }
    await expect(main()).resolves.toMatchInlineSnapshot(`
      [
        {
          "email": "bob@bob.bob",
          "id": 1,
          "name": "Bobby Brown Sqlite",
        },
      ]
    `)
  }, 60_000) // timeout
  it('should work with prisma schema folder', async () => {
    ctx.fixture('multi-schema-files/valid-custom-output')
    const data = await ctx.cli('generate', '--schema=./prisma/schema')
    const stdout = sanitiseStdout(data.stdout)
    if (getClientEngineType() === ClientEngineType.Binary) {
      expect(stdout).toMatchInlineSnapshot(`
        "Prisma schema loaded from prisma/schema
        ✔ Generated Prisma Client (v0.0.0, engine=binary) to ./prisma/client in XXXms
        Start by importing your Prisma Client (See: https://pris.ly/d/importing-client)
        Tip: MOCKED RANDOM TIP"
      `)
    } else {
      expect(stdout).toMatchInlineSnapshot(`
        "Prisma schema loaded from prisma/schema
        ✔ Generated Prisma Client (v0.0.0) to ./prisma/client in XXXms
        Start by importing your Prisma Client (See: https://pris.ly/d/importing-client)
        Tip: MOCKED RANDOM TIP"
      `)
    }
    const { main } = await import(ctx.fs.path('main.ts'))
    await expect(main()).resolves.toMatchInlineSnapshot(`
      [
        {
          "id": "123",
        },
      ]
    `)
  })
  it('should display the right yarn command for custom outputs', async () => {
    ctx.fixture('custom-output-yarn')
    const data = await ctx.cli('generate')
    const stdout = sanitiseStdout(data.stdout)
    if (typeof data.signal === 'number' && data.signal !== 0) {
      throw new Error(data.stderr + data.stdout)
    }
    if (getClientEngineType() === ClientEngineType.Library) {
      expect(stdout).toMatchInlineSnapshot(`
        "Prisma schema loaded from prisma/schema.prisma
        ✔ Generated Prisma Client (v0.0.0) to ./generated/client in XXXms
        Start by importing your Prisma Client (See: https://pris.ly/d/importing-client)
        Tip: MOCKED RANDOM TIP"
      `)
    }
  })
  it('should display the right npm command for custom outputs', async () => {
    ctx.fixture('custom-output-npm')
    const data = await ctx.cli('generate')
    const stdout = sanitiseStdout(data.stdout)
    if (typeof data.signal === 'number' && data.signal !== 0) {
      throw new Error(data.stderr + data.stdout)
    }
    if (getClientEngineType() === ClientEngineType.Library) {
      expect(stdout).toMatchInlineSnapshot(`
        "Prisma schema loaded from prisma/schema.prisma
        ✔ Generated Prisma Client (v0.0.0) to ./generated/client in XXXms
        Start by importing your Prisma Client (See: https://pris.ly/d/importing-client)
        Tip: MOCKED RANDOM TIP"
      `)
    }
  })
  it('should display the right pnpm command for custom outputs', async () => {
    ctx.fixture('custom-output-pnpm')
    const data = await ctx.cli('generate')
    const stdout = sanitiseStdout(data.stdout)
    if (typeof data.signal === 'number' && data.signal !== 0) {
      throw new Error(data.stderr + data.stdout)
    }
    if (getClientEngineType() === ClientEngineType.Library) {
      expect(stdout).toMatchInlineSnapshot(`
        "Prisma schema loaded from prisma/schema.prisma
        ✔ Generated Prisma Client (v0.0.0) to ./generated/client in XXXms
        Start by importing your Prisma Client (See: https://pris.ly/d/importing-client)
        Tip: MOCKED RANDOM TIP"
      `)
    }
  })
  it('displays basic instructions in default outputs', async () => {
    ctx.fixture('default-output')
    const data = await ctx.cli('generate')
    if (typeof data.signal === 'number' && data.signal !== 0) {
      throw new Error(data.stderr + data.stdout)
    }
    // use regex to extract the output location below with a dummy location
    const outputLocation = data.stdout.match(/to (.*) in/)?.[1]
    let stdout = sanitiseStdout(data.stdout)
    stdout = stdout.replace(outputLocation!, '<output>')
    if (getClientEngineType() === ClientEngineType.Library) {
      expect(stdout).toMatchInlineSnapshot(`
        "Prisma schema loaded from prisma/schema.prisma
        ✔ Generated Prisma Client (v0.0.0) to <output> in XXXms
        Start by importing your Prisma Client (See: https://pris.ly/d/importing-client)
        Tip: MOCKED RANDOM TIP"
      `)
    } else {
      expect(stdout).toMatchInlineSnapshot(`
        "Prisma schema loaded from prisma/schema.prisma
        ✔ Generated Prisma Client (v0.0.0, engine=binary) to <output> in XXXms
        Start by importing your Prisma Client (See: https://pris.ly/d/importing-client)
        Tip: MOCKED RANDOM TIP"
      `)
    }
  })
  describe('prisma-client-js should work with no models', () => {
    const generateWithNoModels = async (ctx: BaseContext) => {
      const data = await ctx.cli('generate')
      if (typeof data.signal === 'number' && data.signal !== 0) {
        throw new Error(data.stderr + data.stdout)
      }
      return data
    }
    test('with sqlite', async () => {
      ctx.fixture('no-models-prisma-client-js/sqlite')
      await generateWithNoModels(ctx)
    })
    test('with mysql', async () => {
      ctx.fixture('no-models-prisma-client-js/mysql')
      await generateWithNoModels(ctx)
    })
    test('with postgresql', async () => {
      ctx.fixture('no-models-prisma-client-js/postgresql')
      await generateWithNoModels(ctx)
    })
    test('with sqlserver', async () => {
      ctx.fixture('no-models-prisma-client-js/sqlserver')
      await generateWithNoModels(ctx)
    })
    test('with mongo', async () => {
      ctx.fixture('no-models-prisma-client-js/mongo')
      await generateWithNoModels(ctx)
    })
  })
  describe('prisma-client should work with no models', () => {
    const generateWithNoModels = async (ctx: BaseContext) => {
      const data = await ctx.cli('generate')
      if (typeof data.signal === 'number' && data.signal !== 0) {
        throw new Error(data.stderr + data.stdout)
      }
      return data
    }
    test('with sqlite', async () => {
      ctx.fixture('no-models-prisma-client/sqlite')
      await generateWithNoModels(ctx)
    })
    test('with mysql', async () => {
      ctx.fixture('no-models-prisma-client/mysql')
      await generateWithNoModels(ctx)
    })
    test('with postgresql', async () => {
      ctx.fixture('no-models-prisma-client/postgresql')
      await generateWithNoModels(ctx)
    })
    test('with sqlserver', async () => {
      ctx.fixture('no-models-prisma-client/sqlserver')
      await generateWithNoModels(ctx)
    })
  })
  it('should work with --no-engine', async () => {
    ctx.fixture('example-project')
    const data = await ctx.cli('generate', '--no-engine')
    const stdout = sanitiseStdout(data.stdout)
    if (typeof data.signal === 'number' && data.signal !== 0) {
      throw new Error(data.stderr + data.stdout)
    }
    if (getClientEngineType() === ClientEngineType.Binary) {
      expect(stdout).toMatchInlineSnapshot(`
        "Prisma schema loaded from prisma/schema.prisma
        ✔ Generated Prisma Client (v0.0.0, engine=none) to ./generated/client in XXXms
        Start by importing your Prisma Client (See: https://pris.ly/d/importing-client)
        Tip: MOCKED RANDOM TIP"
      `)
    } else {
      expect(stdout).toMatchInlineSnapshot(`
        "Prisma schema loaded from prisma/schema.prisma
        ✔ Generated Prisma Client (v0.0.0, engine=none) to ./generated/client in XXXms
        Start by importing your Prisma Client (See: https://pris.ly/d/importing-client)
        Tip: MOCKED RANDOM TIP"
      `)
    }
  })
  it('should hide hints with --no-hints', async () => {
    ctx.fixture('example-project')
    const data = await ctx.cli('generate', '--no-hints')
    if (typeof data.signal === 'number' && data.signal !== 0) {
      throw new Error(data.stderr + data.stdout)
    }
    const engineType = getClientEngineType()
    if (engineType === ClientEngineType.Binary) {
      expect(data.stdout).toMatchInlineSnapshot(`
        "Prisma schema loaded from prisma/schema.prisma
        ✔ Generated Prisma Client (v0.0.0, engine=binary) to ./generated/client in XXXms
        "
      `)
    } else {
      expect(data.stdout).toMatchInlineSnapshot(`
        "Prisma schema loaded from prisma/schema.prisma
        ✔ Generated Prisma Client (v0.0.0) to ./generated/client in XXXms
        "
      `)
    }
  })
  it('should work and not show hints with --no-hints and --no-engine', async () => {
    ctx.fixture('example-project')
    const data = await ctx.cli('generate', '--no-hints', '--no-engine')
    if (typeof data.signal === 'number' && data.signal !== 0) {
      throw new Error(data.stderr + data.stdout)
    }
    expect(data.stdout).toMatchInlineSnapshot(`
      "Prisma schema loaded from prisma/schema.prisma
      ✔ Generated Prisma Client (v0.0.0, engine=none) to ./generated/client in XXXms
      "
    `)
  })
  it('should call the survey handler when hints are not disabled', async () => {
    ctx.fixture('example-project')
    const handler = jest.fn()
    const generate = new Generate(handler)
    await generate.parse([], defaultTestConfig())
    expect(handler).toHaveBeenCalledTimes(1)
  })
  it('should not call the survey handler when hints are disabled', async () => {
    ctx.fixture('example-project')
    const handler = jest.fn()
    const generate = new Generate(handler)
    await generate.parse(['--no-hints'], defaultTestConfig())
    expect(handler).not.toHaveBeenCalled()
  })
  it('should warn when `url` is hardcoded', async () => {
    ctx.fixture('hardcoded-url')
    const data = await ctx.cli('generate')
    const stdout = sanitiseStdout(data.stdout)
    if (typeof data.signal === 'number' && data.signal !== 0) {
      throw new Error(data.stderr + data.stdout)
    }
    if (getClientEngineType() === ClientEngineType.Binary) {
      expect(stdout).toMatchInlineSnapshot(`
        "Prisma schema loaded from prisma/schema.prisma
        ✔ Generated Prisma Client (v0.0.0, engine=binary) to ./generated/client in XXXms
        Start by importing your Prisma Client (See: https://pris.ly/d/importing-client)
        Tip: MOCKED RANDOM TIP"
      `)
    } else {
      expect(stdout).toMatchInlineSnapshot(`
        "Prisma schema loaded from prisma/schema.prisma
        ✔ Generated Prisma Client (v0.0.0) to ./generated/client in XXXms
        Start by importing your Prisma Client (See: https://pris.ly/d/importing-client)
        Tip: MOCKED RANDOM TIP
        🛑 Hardcoding URLs in your schema poses a security risk: https://pris.ly/d/datasource-env"
      `)
    }
  })
  it('should not warn when `url` is not hardcoded', async () => {
    ctx.fixture('env-url')
    const data = await ctx.cli('generate')
    const stdout = sanitiseStdout(data.stdout)
    if (typeof data.signal === 'number' && data.signal !== 0) {
      throw new Error(data.stderr + data.stdout)
    }
    if (getClientEngineType() === ClientEngineType.Binary) {
      expect(stdout).toMatchInlineSnapshot(`
        "Prisma schema loaded from prisma/schema.prisma
        ✔ Generated Prisma Client (v0.0.0, engine=binary) to ./generated/client in XXXms
        Start by importing your Prisma Client (See: https://pris.ly/d/importing-client)
        Tip: MOCKED RANDOM TIP"
      `)
    } else {
      expect(stdout).toMatchInlineSnapshot(`
        "Prisma schema loaded from prisma/schema.prisma
        ✔ Generated Prisma Client (v0.0.0) to ./generated/client in XXXms
        Start by importing your Prisma Client (See: https://pris.ly/d/importing-client)
        Tip: MOCKED RANDOM TIP"
      `)
    }
  })
  it('should not warn when `directUrl` is not hardcoded', async () => {
    ctx.fixture('env-direct-url')
    const data = await ctx.cli('generate')
    const stdout = sanitiseStdout(data.stdout)
    if (typeof data.signal === 'number' && data.signal !== 0) {
      throw new Error(data.stderr + data.stdout)
    }
    if (getClientEngineType() === ClientEngineType.Binary) {
      expect(stdout).toMatchInlineSnapshot(`
        "Prisma schema loaded from prisma/schema.prisma
        ✔ Generated Prisma Client (v0.0.0, engine=binary) to ./generated/client in XXXms
        Start by importing your Prisma Client (See: https://pris.ly/d/importing-client)
        Tip: MOCKED RANDOM TIP"
      `)
    } else {
      expect(stdout).toMatchInlineSnapshot(`
        "Prisma schema loaded from prisma/schema.prisma
        ✔ Generated Prisma Client (v0.0.0) to ./generated/client in XXXms
        Start by importing your Prisma Client (See: https://pris.ly/d/importing-client)
        Tip: MOCKED RANDOM TIP"
      `)
    }
  })
  it('should warn when `directUrl` is hardcoded', async () => {
    ctx.fixture('hardcoded-direct-url')
    const data = await ctx.cli('generate')
    const stdout = sanitiseStdout(data.stdout)
    if (typeof data.signal === 'number' && data.signal !== 0) {
      throw new Error(data.stderr + data.stdout)
    }
    if (getClientEngineType() === ClientEngineType.Binary) {
      expect(stdout).toMatchInlineSnapshot(`
        "Prisma schema loaded from prisma/schema.prisma
        ✔ Generated Prisma Client (v0.0.0, engine=binary) to ./generated/client in XXXms
        Start by importing your Prisma Client (See: https://pris.ly/d/importing-client)
        Tip: MOCKED RANDOM TIP"
      `)
    } else {
      expect(stdout).toMatchInlineSnapshot(`
        "Prisma schema loaded from prisma/schema.prisma
        ✔ Generated Prisma Client (v0.0.0) to ./generated/client in XXXms
        Start by importing your Prisma Client (See: https://pris.ly/d/importing-client)
        Tip: MOCKED RANDOM TIP
        🛑 Hardcoding URLs in your schema poses a security risk: https://pris.ly/d/datasource-env"
      `)
    }
  })
  it('should error with exit code 1 with incorrect schema', async () => {
    ctx.fixture('broken-example-project')
    await expect(ctx.cli('generate').catch((e) => e.exitCode)).resolves.toEqual(1)
  })
  it('should work with a custom generator', async () => {
    ctx.fixture('custom-generator')
    const data = await ctx.cli('generate')
    if (typeof data.signal === 'number' && data.signal !== 0) {
      throw new Error(data.stderr + data.stdout)
    }
    expect(data.stdout).toContain(`I am a minimal generator`)
  }, 75_000) // timeout
})
describe('--schema from project directory', () => {
  beforeEach(() => {
    jest.spyOn(Math, 'random').mockReturnValue(0.1)
  })
  afterEach(() => {
    jest.spyOn(Math, 'random').mockRestore()
  })
  it('--schema relative path: should work', async () => {
    expect.assertions(1)
    ctx.fixture('generate-from-project-dir')
    const result = await Generate.new().parse(['--schema=./schema.prisma'], defaultTestConfig())
    if (getClientEngineType() === ClientEngineType.Binary) {
      expect(result).toMatchInlineSnapshot(`
        "
        ✔ Generated Prisma Client (v0.0.0, engine=binary) to ./@prisma/client in XXXms
        Start by importing your Prisma Client (See: https://pris.ly/d/importing-client)
        Tip: Need your database queries to be 1000x faster? Accelerate offers you that and more: https://pris.ly/tip-2-accelerate
        "
      `)
    } else {
      expect(result).toMatchInlineSnapshot(`
        "
        ✔ Generated Prisma Client (v0.0.0) to ./@prisma/client in XXXms
        Start by importing your Prisma Client (See: https://pris.ly/d/importing-client)
        Tip: Need your database queries to be 1000x faster? Accelerate offers you that and more: https://pris.ly/tip-2-accelerate
        "
      `)
    }
  })
  it('--schema relative path: should fail - invalid path', async () => {
    ctx.fixture('generate-from-project-dir')
    const result = Generate.new().parse(['--schema=./doesnotexists.prisma'], defaultTestConfig())
    await expect(result).rejects.toThrowErrorMatchingInlineSnapshot(
      `"Could not load \`--schema\` from provided path \`doesnotexists.prisma\`: file or directory not found"`,
    )
  })
  it('--schema absolute path: should work', async () => {
    ctx.fixture('generate-from-project-dir')
    const absoluteSchemaPath = path.resolve('./schema.prisma')
    const output = await Generate.new().parse([`--schema=${absoluteSchemaPath}`], defaultTestConfig())
    if (getClientEngineType() === ClientEngineType.Binary) {
      expect(output).toMatchInlineSnapshot(`
        "
        ✔ Generated Prisma Client (v0.0.0, engine=binary) to ./@prisma/client in XXXms
        Start by importing your Prisma Client (See: https://pris.ly/d/importing-client)
        Tip: Need your database queries to be 1000x faster? Accelerate offers you that and more: https://pris.ly/tip-2-accelerate
        "
      `)
    } else {
      expect(output).toMatchInlineSnapshot(`
        "
        ✔ Generated Prisma Client (v0.0.0) to ./@prisma/client in XXXms
        Start by importing your Prisma Client (See: https://pris.ly/d/importing-client)
        Tip: Need your database queries to be 1000x faster? Accelerate offers you that and more: https://pris.ly/tip-2-accelerate
        "
      `)
    }
  })
  it('--schema absolute path: should fail - invalid path', async () => {
    ctx.fixture('generate-from-project-dir')
    const absoluteSchemaPath = path.resolve('./doesnotexists.prisma')
    const result = Generate.new().parse([`--schema=${absoluteSchemaPath}`], defaultTestConfig())
    await expect(result).rejects.toThrowErrorMatchingInlineSnapshot(
      `"Could not load \`--schema\` from provided path \`doesnotexists.prisma\`: file or directory not found"`,
    )
  })
  it('should throw errors if schema does not exist at default path', async () => {
    ctx.fixture('empty')
    const output = Generate.new().parse([], defaultTestConfig())
    await expect(output).rejects.toThrowErrorMatchingInlineSnapshot(`
      "Could not find Prisma Schema that is required for this command.
      You can either provide it with \`--schema\` argument,
      set it in your Prisma Config file (e.g., \`prisma.config.ts\`),
      set it as \`prisma.schema\` in your package.json,
      or put it into the default location (\`./prisma/schema.prisma\`, or \`./schema.prisma\`.
      Checked following paths:
      schema.prisma: file not found
      prisma/schema.prisma: file not found
      See also https://pris.ly/d/prisma-schema-location"
    `)
  })
})
describe('in postinstall', () => {
  let oldEnv: NodeJS.ProcessEnv
  beforeEach(() => {
    oldEnv = { ...process.env }
    process.env.PRISMA_GENERATE_IN_POSTINSTALL = 'true'
  })
  afterEach(() => {
    restoreEnvSnapshot(oldEnv)
  })
  it('should not throw errors if prisma schema not found', async () => {
    ctx.fixture('empty')
    const output = await Generate.new().parse([], defaultTestConfig())
    expect(output).toMatchInlineSnapshot(`""`)
  })
})
describe('--schema from parent directory', () => {
  beforeEach(() => {
    jest.spyOn(Math, 'random').mockReturnValue(0.1)
  })
  afterEach(() => {
    jest.spyOn(Math, 'random').mockRestore()
  })
  it('--schema relative path: should work', async () => {
    expect.assertions(1)
    ctx.fixture('generate-from-parent-dir')
    const result = await Generate.new().parse(['--schema=./subdirectory/schema.prisma'], defaultTestConfig())
    if (getClientEngineType() === ClientEngineType.Binary) {
      expect(result).toMatchInlineSnapshot(`
        "
        ✔ Generated Prisma Client (v0.0.0, engine=binary) to ./subdirectory/@prisma/client in XXXms
        Start by importing your Prisma Client (See: https://pris.ly/d/importing-client)
        Tip: Need your database queries to be 1000x faster? Accelerate offers you that and more: https://pris.ly/tip-2-accelerate
        "
      `)
    } else {
      expect(result).toMatchInlineSnapshot(`
        "
        ✔ Generated Prisma Client (v0.0.0) to ./subdirectory/@prisma/client in XXXms
        Start by importing your Prisma Client (See: https://pris.ly/d/importing-client)
        Tip: Need your database queries to be 1000x faster? Accelerate offers you that and more: https://pris.ly/tip-2-accelerate
        "
      `)
    }
  })
  it('--schema relative path: should fail - invalid path', async () => {
    ctx.fixture('generate-from-parent-dir')
    const result = Generate.new().parse(['--schema=./subdirectory/doesnotexists.prisma'], defaultTestConfig())
    await expect(result).rejects.toThrowErrorMatchingInlineSnapshot(
      `"Could not load \`--schema\` from provided path \`subdirectory/doesnotexists.prisma\`: file or directory not found"`,
    )
  })
  it('--schema absolute path: should work', async () => {
    expect.assertions(1)
    ctx.fixture('generate-from-parent-dir')
    const absoluteSchemaPath = path.resolve('./subdirectory/schema.prisma')
    const result = await Generate.new().parse([`--schema=${absoluteSchemaPath}`], defaultTestConfig())
    if (getClientEngineType() === ClientEngineType.Binary) {
      expect(result).toMatchInlineSnapshot(`
        "
        ✔ Generated Prisma Client (v0.0.0, engine=binary) to ./subdirectory/@prisma/client in XXXms
        Start by importing your Prisma Client (See: https://pris.ly/d/importing-client)
        Tip: Need your database queries to be 1000x faster? Accelerate offers you that and more: https://pris.ly/tip-2-accelerate
        "
      `)
    } else {
      expect(result).toMatchInlineSnapshot(`
        "
        ✔ Generated Prisma Client (v0.0.0) to ./subdirectory/@prisma/client in XXXms
        Start by importing your Prisma Client (See: https://pris.ly/d/importing-client)
        Tip: Need your database queries to be 1000x faster? Accelerate offers you that and more: https://pris.ly/tip-2-accelerate
        "
      `)
    }
  })
  it('--schema absolute path: should fail - invalid path', async () => {
    ctx.fixture('generate-from-parent-dir')
    const absoluteSchemaPath = path.resolve('./subdirectory/doesnotexists.prisma')
    const result = Generate.new().parse([`--schema=${absoluteSchemaPath}`], defaultTestConfig())
    await expect(result).rejects.toThrowErrorMatchingInlineSnapshot(
      `"Could not load \`--schema\` from provided path \`subdirectory/doesnotexists.prisma\`: file or directory not found"`,
    )
  })
  it('--generator: should work - valid generator names', async () => {
    ctx.fixture('example-project')
    const result = await Generate.new().parse(
      ['--schema=./prisma/multiple-generator.prisma', '--generator=client', '--generator=client_3'],
      defaultTestConfig(),
    )
    if (getClientEngineType() === ClientEngineType.Binary) {
      expect(result).toMatchInlineSnapshot(`
        "
        ✔ Generated Prisma Client (v0.0.0, engine=binary) to ./generated/client in XXXms
        ✔ Generated Prisma Client (v0.0.0, engine=binary) to ./generated/client_3 in XXXms
        Start by importing your Prisma Client (See: https://pris.ly/d/importing-client)
        Tip: Need your database queries to be 1000x faster? Accelerate offers you that and more: https://pris.ly/tip-2-accelerate
        "
      `)
    } else {
      expect(result).toMatchInlineSnapshot(`
        "
        ✔ Generated Prisma Client (v0.0.0) to ./generated/client in XXXms
        ✔ Generated Prisma Client (v0.0.0) to ./generated/client_3 in XXXms
        Start by importing your Prisma Client (See: https://pris.ly/d/importing-client)
        Tip: Need your database queries to be 1000x faster? Accelerate offers you that and more: https://pris.ly/tip-2-accelerate
        "
      `)
    }
  })
  it('--generator: should fail - single invalid generator name', async () => {
    ctx.fixture('example-project')
    await expect(
      Generate.new().parse(
        ['--schema=./prisma/multiple-generator.prisma', '--generator=client', '--generator=invalid_client'],
        defaultTestConfig(),
      ),
    ).rejects.toMatchInlineSnapshot(
      `"The generator invalid_client specified via --generator does not exist in your Prisma schema"`,
    )
  })
  it('--generator: should fail - multiple invalid generator names', async () => {
    ctx.fixture('example-project')
    await expect(
      Generate.new().parse(
        [
          '--schema=./prisma/multiple-generator.prisma',
          '--generator=client',
          '--generator=invalid_client',
          '--generator=invalid_client_2',
        ],
        defaultTestConfig(),
      ),
    ).rejects.toMatchInlineSnapshot(
      `"The generators invalid_client, invalid_client_2 specified via --generator do not exist in your Prisma schema"`,
    )
  })
})
describe('with --sql', () => {
  it('should throw error on invalid sql', async () => {
    ctx.fixture('typed-sql-invalid')
    await expect(Generate.new().parse(['--sql'], defaultTestConfig())).rejects.toMatchInlineSnapshot(`
      "Errors while reading sql files:
      In prisma/sql/invalidQuery.sql:
      Error: Error describing the query.
      error returned from database: (code: 1) near "Not": syntax error
      "
    `)
  })
  it('throws error on mssql', async () => {
    ctx.fixture('typed-sql-invalid-mssql')
    await expect(Generate.new().parse(['--sql'], defaultTestConfig())).rejects.toMatchInlineSnapshot(
      `"Typed SQL is supported only for postgresql, cockroachdb, mysql, sqlite providers"`,
    )
  })
  it('throws error on mongo', async () => {
    ctx.fixture('typed-sql-invalid-mongo')
    await expect(Generate.new().parse(['--sql'], defaultTestConfig())).rejects.toMatchInlineSnapshot(
      `"Typed SQL is supported only for postgresql, cockroachdb, mysql, sqlite providers"`,
    )
  })
})