Skip to content

Commit 1488bcf

Browse files
authored
fix(polymorphism): createMany is handled incorrectly (#1151)
1 parent 2d82218 commit 1488bcf

File tree

3 files changed

+150
-1
lines changed

3 files changed

+150
-1
lines changed

packages/runtime/src/enhancements/delegate.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -390,7 +390,7 @@ export class DelegateProxyHandler extends DefaultPrismaProxyHandler {
390390
return this.queryUtils.transaction(this.prisma, async (tx) => {
391391
const r = await Promise.all(
392392
enumerate(args.data).map(async (item) => {
393-
return this.doCreate(tx, this.model, item);
393+
return this.doCreate(tx, this.model, { data: item });
394394
})
395395
);
396396

tests/integration/tests/enhancements/with-delegate/enhanced-client.test.ts

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,43 @@ describe('Polymorphism Test', () => {
121121
).resolves.toMatchObject({ owner: { id: 2 } });
122122
});
123123

124+
it('create many polymorphic model', async () => {
125+
const { enhance } = await loadSchema(schema, { logPrismaQuery: true, enhancements: ['delegate'] });
126+
const db = enhance();
127+
128+
await expect(
129+
db.ratedVideo.createMany({ data: { viewCount: 1, duration: 100, url: 'xyz', rating: 100 } })
130+
).resolves.toMatchObject({ count: 1 });
131+
132+
await expect(
133+
db.ratedVideo.createMany({
134+
data: [
135+
{ viewCount: 2, duration: 200, url: 'xyz', rating: 100 },
136+
{ viewCount: 3, duration: 300, url: 'xyz', rating: 100 },
137+
],
138+
})
139+
).resolves.toMatchObject({ count: 2 });
140+
});
141+
142+
it('create many polymorphic relation', async () => {
143+
const { enhance } = await loadSchema(schema, { logPrismaQuery: true, enhancements: ['delegate'] });
144+
const db = enhance();
145+
146+
const video1 = await db.ratedVideo.create({
147+
data: { viewCount: 1, duration: 100, url: 'xyz', rating: 100 },
148+
});
149+
await expect(
150+
db.user.createMany({ data: { id: 1, assets: { connect: { id: video1.id } } } })
151+
).resolves.toMatchObject({ count: 1 });
152+
153+
const video2 = await db.ratedVideo.create({
154+
data: { viewCount: 1, duration: 100, url: 'xyz', rating: 100 },
155+
});
156+
await expect(
157+
db.user.createMany({ data: [{ id: 2, assets: { connect: { id: video2.id } } }, { id: 3 }] })
158+
).resolves.toMatchObject({ count: 2 });
159+
});
160+
124161
it('read with concrete', async () => {
125162
const { db, user, video } = await setup();
126163

Lines changed: 112 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,112 @@
1+
import { createPostgresDb, dropPostgresDb, loadSchema } from '@zenstackhq/testtools';
2+
3+
describe('Regression for issue 1149', () => {
4+
let prisma: any;
5+
let dbUrl: string;
6+
7+
beforeAll(async () => {
8+
dbUrl = await createPostgresDb('issue-1149');
9+
});
10+
11+
afterAll(async () => {
12+
if (prisma) {
13+
await prisma.$disconnect();
14+
}
15+
dropPostgresDb('issue-1149');
16+
});
17+
18+
it('test', async () => {
19+
const schema = `
20+
model User {
21+
id String @id @default(cuid())
22+
name String
23+
24+
userRankings UserRanking[]
25+
userFavorites UserFavorite[]
26+
}
27+
28+
model Entity {
29+
id String @id @default(cuid())
30+
name String
31+
type String
32+
userRankings UserRanking[]
33+
userFavorites UserFavorite[]
34+
35+
@@delegate(type)
36+
}
37+
38+
model Person extends Entity {
39+
}
40+
41+
model Studio extends Entity {
42+
}
43+
44+
45+
model UserRanking {
46+
id String @id @default(cuid())
47+
rank Int
48+
49+
entityId String
50+
entity Entity @relation(fields: [entityId], references: [id], onUpdate: NoAction)
51+
userId String
52+
user User @relation(fields: [userId], references: [id], onDelete: Cascade, onUpdate: NoAction)
53+
}
54+
55+
model UserFavorite {
56+
id String @id @default(cuid())
57+
58+
entityId String
59+
entity Entity @relation(fields: [entityId], references: [id], onUpdate: NoAction)
60+
userId String
61+
user User @relation(fields: [userId], references: [id], onDelete: Cascade, onUpdate: NoAction)
62+
}
63+
`;
64+
65+
const { enhance, prisma: _prisma } = await loadSchema(schema, {
66+
provider: 'postgresql',
67+
dbUrl,
68+
enhancements: ['delegate'],
69+
});
70+
71+
prisma = _prisma;
72+
const db = enhance();
73+
74+
const user = await db.user.create({ data: { name: 'user' } });
75+
const person = await db.person.create({ data: { name: 'person' } });
76+
77+
await expect(
78+
db.userRanking.createMany({
79+
data: {
80+
rank: 1,
81+
entity: { connect: { id: person.id } },
82+
user: { connect: { id: user.id } },
83+
},
84+
})
85+
).resolves.toMatchObject({ count: 1 });
86+
87+
await expect(
88+
db.userRanking.createMany({
89+
data: [
90+
{
91+
rank: 2,
92+
entity: { connect: { id: person.id } },
93+
user: { connect: { id: user.id } },
94+
},
95+
{
96+
rank: 3,
97+
entity: { connect: { id: person.id } },
98+
user: { connect: { id: user.id } },
99+
},
100+
],
101+
})
102+
).resolves.toMatchObject({ count: 2 });
103+
104+
await expect(db.userRanking.findMany()).resolves.toEqual(
105+
expect.arrayContaining([
106+
expect.objectContaining({ rank: 1 }),
107+
expect.objectContaining({ rank: 2 }),
108+
expect.objectContaining({ rank: 3 }),
109+
])
110+
);
111+
});
112+
});

0 commit comments

Comments
 (0)