Skip to content

Commit d5d3494

Browse files
committed
fix(m-n-relation): catch invalid m-n-relation
* check if second many part is available * invalid relation ```prisma model User { id Int @id @default(autoincrement()) receivedPosts Post[] @relation("userReceivesPosts") } model Post { id Int @id @default(autoincrement()) receivedBy User[] @relation("userReceivesPosts", references: [id]) } ``` * add new test for invalid m-n-relation * add rename m-n-relation test
1 parent caf4390 commit d5d3494

File tree

3 files changed

+92
-1
lines changed

3 files changed

+92
-1
lines changed

__tests__/dbml.test.ts

+66
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ import {
33
datamodelDbmlComments,
44
datamodelDbmlDefaults,
55
datamodelDbmlManyToMany,
6+
datamodelDbmlManyToManyInvalid,
7+
datamodelDbmlManyToManyRenameRelation,
68
datamodelDbmlManyToManySelfRelation,
79
datamodelDbmlRelations,
810
} from './fixtures/dbml.datamodel';
@@ -235,4 +237,68 @@ Table Followers {
235237

236238
expect(dbml).toEqual(expectedDbml);
237239
});
240+
241+
test('generating dbml schema with invalid many-to-many', async () => {
242+
const dmmf = await generateDMMF(datamodelDbmlManyToManyInvalid);
243+
244+
const expectedDbml = `${autoGeneratedComment}
245+
246+
Table User {
247+
id Int [pk, increment]
248+
receivedPosts Post [not null]
249+
}
250+
251+
Table Post {
252+
id Int [pk, increment]
253+
receivedBy User [not null]
254+
}`;
255+
256+
const dbml = generateDBMLSchema(dmmf);
257+
258+
expect(dbml).toEqual(expectedDbml);
259+
});
260+
test('generating dbml schema with invalid many-to-many', async () => {
261+
const dmmf = await generateDMMF(datamodelDbmlManyToManyInvalid);
262+
263+
const expectedDbml = `${autoGeneratedComment}
264+
265+
Table User {
266+
id Int [pk, increment]
267+
receivedPosts Post [not null]
268+
}
269+
270+
Table Post {
271+
id Int [pk, increment]
272+
receivedBy User [not null]
273+
}`;
274+
275+
const dbml = generateDBMLSchema(dmmf);
276+
277+
expect(dbml).toEqual(expectedDbml);
278+
});
279+
280+
test('generating dbml schema with rename many-to-many', async () => {
281+
const dmmf = await generateDMMF(datamodelDbmlManyToManyRenameRelation);
282+
283+
const expectedDbml = `${autoGeneratedComment}
284+
285+
Table User {
286+
id Int [pk, increment]
287+
receivedPosts Post [not null]
288+
}
289+
290+
Table Post {
291+
id Int [pk, increment]
292+
receivedBy User [not null]
293+
}
294+
295+
Table userReceivesPosts {
296+
receivedpostsId Int [ref: > Post.id]
297+
receivedbyId Int [ref: > User.id]
298+
}`;
299+
300+
const dbml = generateDBMLSchema(dmmf);
301+
302+
expect(dbml).toEqual(expectedDbml);
303+
});
238304
});

__tests__/fixtures/dbml.datamodel.ts

+22
Original file line numberDiff line numberDiff line change
@@ -109,3 +109,25 @@ export const datamodelDbmlManyToManySelfRelation = /* Prisma */ `
109109
following User[] @relation("Followers")
110110
}
111111
`;
112+
113+
export const datamodelDbmlManyToManyInvalid = /* Prisma */ `
114+
model User {
115+
id Int @id @default(autoincrement())
116+
receivedPosts Post[] @relation("userReceivesPosts")
117+
}
118+
model Post {
119+
id Int @id @default(autoincrement())
120+
receivedBy User[] @relation("userReceivesPosts", references: [id])
121+
}
122+
`;
123+
124+
export const datamodelDbmlManyToManyRenameRelation = /* Prisma */ `
125+
model User {
126+
id Int @id @default(autoincrement())
127+
receivedPosts Post[] @relation("userReceivesPosts")
128+
}
129+
model Post {
130+
id Int @id @default(autoincrement())
131+
receivedBy User[] @relation("userReceivesPosts")
132+
}
133+
`;

src/generator/many-to-many-tables.ts

+4-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ export function generateManyToManyTables(models: DMMF.Model[]): string[] {
55
if (manyToManyFields.length === 0) {
66
return [];
77
}
8-
98
return generateTables(manyToManyFields, models);
109
}
1110

@@ -23,6 +22,10 @@ function generateTables(
2322
(field) => field.relationName === manyFirst.relationName
2423
)!;
2524

25+
if (!manySecond) {
26+
return manyToManyTables;
27+
}
28+
2629
manyToManyTables.push(
2730
`Table ${manyFirst?.relationName} {\n` +
2831
`${generateJoinFields([manyFirst, manySecond], models)}` +

0 commit comments

Comments
 (0)