From 4dd38274a3c212c156732fefc0cde7e5483a2ca0 Mon Sep 17 00:00:00 2001 From: daniel starns Date: Thu, 29 Sep 2022 10:10:51 +0100 Subject: [PATCH] test: add coverage for gh-12862 --- .../tests/functional/issues/12862/_matrix.ts | 4 ++ .../functional/issues/12862/prisma/_schema.ts | 36 ++++++++++ .../tests/functional/issues/12862/tests.ts | 67 +++++++++++++++++++ 3 files changed, 107 insertions(+) create mode 100644 packages/client/tests/functional/issues/12862/_matrix.ts create mode 100644 packages/client/tests/functional/issues/12862/prisma/_schema.ts create mode 100644 packages/client/tests/functional/issues/12862/tests.ts diff --git a/packages/client/tests/functional/issues/12862/_matrix.ts b/packages/client/tests/functional/issues/12862/_matrix.ts new file mode 100644 index 000000000000..d56f2f6b7702 --- /dev/null +++ b/packages/client/tests/functional/issues/12862/_matrix.ts @@ -0,0 +1,4 @@ +import { defineMatrix } from '../../_utils/defineMatrix' +import { allProviders } from '../../_utils/providers' + +export default defineMatrix(() => [allProviders]) diff --git a/packages/client/tests/functional/issues/12862/prisma/_schema.ts b/packages/client/tests/functional/issues/12862/prisma/_schema.ts new file mode 100644 index 000000000000..78c63837d740 --- /dev/null +++ b/packages/client/tests/functional/issues/12862/prisma/_schema.ts @@ -0,0 +1,36 @@ +import { idForProvider } from '../../../_utils/idForProvider' +import testMatrix from '../_matrix' + +export default testMatrix.setupSchema(({ provider }) => { + return /* Prisma */ ` + generator client { + provider = "prisma-client-js" + previewFeatures = ["interactiveTransactions"] + engineType = "binary" + } + + datasource db { + provider = "${provider}" + url = env("DATABASE_URI_${provider}") + } + + model User { + id ${idForProvider(provider)} + email String @unique + name String? + posts Post[] + } + + model Post { + id ${idForProvider(provider)} + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + title String + content String? + published Boolean @default(false) + viewCount Int @default(0) + author User? @relation(fields: [authorId], references: [id]) + authorId String? + } + ` +}) diff --git a/packages/client/tests/functional/issues/12862/tests.ts b/packages/client/tests/functional/issues/12862/tests.ts new file mode 100644 index 000000000000..1615db8f3165 --- /dev/null +++ b/packages/client/tests/functional/issues/12862/tests.ts @@ -0,0 +1,67 @@ +import { faker } from '@faker-js/faker' +import { ClientEngineType, getClientEngineType } from '@prisma/internals' + +import testMatrix from './_matrix' +// @ts-ignore +import type { PrismaClient } from './node_modules/@prisma/client' + +declare let prisma: PrismaClient + +// https://github.com/prisma/prisma/issues/12862 +testMatrix.setupTestSuite( + () => { + if (getClientEngineType() !== ClientEngineType.Binary) { + return + } + + test('should propagate the correct error when a method fails inside an transaction', async () => { + const user = await prisma.user.create({ + data: { + email: faker.internet.email(), + name: faker.name.firstName(), + }, + }) + + await expect( + prisma.$transaction([ + prisma.post.create({ + data: { + authorId: user.id, + title: faker.lorem.sentence(), + viewCount: -1, // should fail, must be >= 0 + }, + }), + ]), + ).rejects.toThrowError('violates check constraint \\"Post_viewCount_check\\"') + }) + + test('should propagate the correct error when a method fails inside an interactive transaction', async () => { + await expect( + prisma.$transaction(async (client) => { + const user = await client.user.create({ + data: { + email: faker.internet.email(), + name: faker.name.firstName(), + }, + }) + + const post = await client.post.create({ + data: { + authorId: user.id, + title: faker.lorem.sentence(), + viewCount: -1, // should fail, must be >= 0 + }, + }) + + return post + }), + ).rejects.toThrowError('violates check constraint \\"Post_viewCount_check\\"') + }) + }, + { + optOut: { + from: ['cockroachdb', 'mongodb', 'mysql', 'sqlite', 'sqlserver'], + reason: 'bla', + }, + }, +)