From 08be737d2ed02a7fd93233f24be793432f06ea47 Mon Sep 17 00:00:00 2001 From: ymc9 <104139426+ymc9@users.noreply.github.com> Date: Sun, 29 Jun 2025 08:23:19 +0200 Subject: [PATCH 1/3] test: policy + client extension interaction --- .../test/policy/client-extensions.test.ts | 182 ++++++++++++++++++ 1 file changed, 182 insertions(+) create mode 100644 packages/runtime/test/policy/client-extensions.test.ts diff --git a/packages/runtime/test/policy/client-extensions.test.ts b/packages/runtime/test/policy/client-extensions.test.ts new file mode 100644 index 00000000..58ff703e --- /dev/null +++ b/packages/runtime/test/policy/client-extensions.test.ts @@ -0,0 +1,182 @@ +import { describe, expect, it } from 'vitest'; +import { definePlugin } from '../../src/client'; +import { createPolicyTestClient } from './utils'; + +describe('client extensions tests for polices', () => { + it('query override one model', async () => { + const db = await createPolicyTestClient( + ` + model Model { + id String @id @default(uuid()) + x Int + y Int + + @@allow('read', x > 0) + } + `, + ); + + const rawDb = db.$unuseAll(); + await rawDb.model.create({ data: { x: 0, y: 100 } }); + await rawDb.model.create({ data: { x: 1, y: 200 } }); + await rawDb.model.create({ data: { x: 2, y: 300 } }); + + const ext = definePlugin({ + id: 'prisma-extension-queryOverride', + onQuery: { + model: { + findMany({ args, query }: any) { + args = args ?? {}; + args.where = { ...args.where, y: { lt: 300 } }; + return query(args); + }, + }, + }, + }); + + await expect(db.$use(ext).model.findMany()).resolves.toHaveLength(1); + await expect(db.$use(ext).model.findMany()).resolves.toHaveLength(1); + }); + + it('query override all models', async () => { + const db = await createPolicyTestClient( + ` + model Model { + id String @id @default(uuid()) + x Int + y Int + + @@allow('read', x > 0) + } + `, + ); + + const rawDb = db.$unuseAll(); + await rawDb.model.create({ data: { x: 0, y: 100 } }); + await rawDb.model.create({ data: { x: 1, y: 200 } }); + await rawDb.model.create({ data: { x: 2, y: 300 } }); + + const ext = definePlugin({ + id: 'prisma-extension-queryOverride', + onQuery: { + $allModels: { + async findMany({ args, query }: any) { + args = args ?? {}; + args.where = { ...args.where, y: { lt: 300 } }; + console.log('findMany args:', args); + return query(args); + }, + }, + }, + }); + + await expect(db.$use(ext).model.findMany()).resolves.toHaveLength(1); + await expect(db.$use(ext).model.findMany()).resolves.toHaveLength(1); + }); + + it('query override all operations', async () => { + const db = await createPolicyTestClient( + ` + model Model { + id String @id @default(uuid()) + x Int + y Int + + @@allow('read', x > 0) + } + `, + ); + + const rawDb = db.$unuseAll(); + await rawDb.model.create({ data: { x: 0, y: 100 } }); + await rawDb.model.create({ data: { x: 1, y: 200 } }); + await rawDb.model.create({ data: { x: 2, y: 300 } }); + + const ext = definePlugin({ + id: 'prisma-extension-queryOverride', + onQuery: { + model: { + async $allOperations({ args, query }: any) { + args = args ?? {}; + args.where = { ...args.where, y: { lt: 300 } }; + return query(args); + }, + }, + }, + }); + + await expect(db.$use(ext).model.findMany()).resolves.toHaveLength(1); + await expect(db.$use(ext).model.findMany()).resolves.toHaveLength(1); + }); + + it('query override everything', async () => { + const db = await createPolicyTestClient( + ` + model Model { + id String @id @default(uuid()) + x Int + y Int + + @@allow('read', x > 0) + } + `, + ); + + const rawDb = db.$unuseAll(); + await rawDb.model.create({ data: { x: 0, y: 100 } }); + await rawDb.model.create({ data: { x: 1, y: 200 } }); + await rawDb.model.create({ data: { x: 2, y: 300 } }); + + const ext = definePlugin({ + id: 'prisma-extension-queryOverride', + onQuery: { + $allModels: { + $allOperations({ args, query }: any) { + args = args ?? {}; + args.where = { ...args.where, y: { lt: 300 } }; + return query(args); + }, + }, + }, + }); + + await expect(db.$use(ext).model.findMany()).resolves.toHaveLength(1); + await expect(db.$use(ext).model.findMany()).resolves.toHaveLength(1); + }); + + it('result mutation', async () => { + const db = await createPolicyTestClient( + ` + model Model { + id String @id @default(uuid()) + value Int + + @@allow('read', value > 0) + } + `, + ); + + const rawDb = db.$unuseAll(); + await rawDb.model.create({ data: { value: 0 } }); + await rawDb.model.create({ data: { value: 1 } }); + + const ext = definePlugin({ + id: 'prisma-extension-resultMutation', + onQuery: { + model: { + async findMany({ args, query }: any) { + const r: any = await query(args); + for (let i = 0; i < r.length; i++) { + r[i].value = r[i].value + 1; + } + return r; + }, + }, + }, + }); + + const expected = [expect.objectContaining({ value: 2 })]; + await expect(db.$use(ext).model.findMany()).resolves.toEqual(expected); + await expect(db.$use(ext).model.findMany()).resolves.toEqual(expected); + }); +}); From bab702767abed6b43f4b332513a54e224d6043c5 Mon Sep 17 00:00:00 2001 From: Yiming Cao Date: Sun, 29 Jun 2025 08:27:02 +0200 Subject: [PATCH 2/3] Update packages/runtime/test/policy/client-extensions.test.ts Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- packages/runtime/test/policy/client-extensions.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/runtime/test/policy/client-extensions.test.ts b/packages/runtime/test/policy/client-extensions.test.ts index 58ff703e..3474f491 100644 --- a/packages/runtime/test/policy/client-extensions.test.ts +++ b/packages/runtime/test/policy/client-extensions.test.ts @@ -2,7 +2,7 @@ import { describe, expect, it } from 'vitest'; import { definePlugin } from '../../src/client'; import { createPolicyTestClient } from './utils'; -describe('client extensions tests for polices', () => { +describe('client extensions tests for policies', () => { it('query override one model', async () => { const db = await createPolicyTestClient( ` From a312c0720759d1173ec204d3909a1f5018a5fd50 Mon Sep 17 00:00:00 2001 From: ymc9 <104139426+ymc9@users.noreply.github.com> Date: Sun, 29 Jun 2025 08:30:10 +0200 Subject: [PATCH 3/3] remove log --- packages/runtime/test/policy/client-extensions.test.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/runtime/test/policy/client-extensions.test.ts b/packages/runtime/test/policy/client-extensions.test.ts index 3474f491..813ab518 100644 --- a/packages/runtime/test/policy/client-extensions.test.ts +++ b/packages/runtime/test/policy/client-extensions.test.ts @@ -63,7 +63,6 @@ describe('client extensions tests for policies', () => { async findMany({ args, query }: any) { args = args ?? {}; args.where = { ...args.where, y: { lt: 300 } }; - console.log('findMany args:', args); return query(args); }, },