193 lines
4.5 KiB
TypeScript
193 lines
4.5 KiB
TypeScript
import { describe, it, expect } from 'vitest';
|
|
import { parsePrismaSchema, detectPrismaVersion, validatePrismaSchema } from '../index';
|
|
|
|
describe('Prisma Schema Parser', () => {
|
|
it('should parse a basic Prisma 5 schema', async () => {
|
|
const schema = `
|
|
datasource db {
|
|
provider = "postgresql"
|
|
url = env("DATABASE_URL")
|
|
}
|
|
|
|
generator client {
|
|
provider = "prisma-client-js"
|
|
}
|
|
|
|
model User {
|
|
id Int @id @default(autoincrement())
|
|
email String @unique
|
|
name String?
|
|
}
|
|
`;
|
|
|
|
const result = await parsePrismaSchema(schema);
|
|
|
|
expect(result.version).toBe(5);
|
|
expect(result.models).toHaveLength(1);
|
|
expect(result.models[0].name).toBe('User');
|
|
expect(result.models[0].fields).toHaveLength(3);
|
|
});
|
|
|
|
it('should detect Prisma 6 features', () => {
|
|
const schema = `
|
|
datasource db {
|
|
provider = "postgresql"
|
|
url = env("DATABASE_URL")
|
|
}
|
|
|
|
model User {
|
|
id Int @id
|
|
password String @omit
|
|
}
|
|
`;
|
|
|
|
expect(detectPrismaVersion(schema)).toBe(6);
|
|
});
|
|
|
|
it('should detect Prisma 7 features', () => {
|
|
const schema = `
|
|
datasource db {
|
|
provider = "postgresql"
|
|
url = env("DATABASE_URL")
|
|
}
|
|
|
|
generator client {
|
|
provider = "prisma-client"
|
|
}
|
|
|
|
model User {
|
|
id Int @id
|
|
}
|
|
`;
|
|
|
|
expect(detectPrismaVersion(schema)).toBe(7);
|
|
});
|
|
|
|
it('should handle relations correctly', async () => {
|
|
const schema = `
|
|
datasource db {
|
|
provider = "postgresql"
|
|
url = env("DATABASE_URL")
|
|
}
|
|
|
|
model User {
|
|
id Int @id
|
|
posts Post[]
|
|
}
|
|
|
|
model Post {
|
|
id Int @id
|
|
author User @relation(fields: [authorId], references: [id])
|
|
authorId Int
|
|
}
|
|
`;
|
|
|
|
const result = await parsePrismaSchema(schema);
|
|
|
|
const userModel = result.models.find((m) => m.name === 'User');
|
|
const postModel = result.models.find((m) => m.name === 'Post');
|
|
|
|
expect(userModel?.fields.find((f) => f.name === 'posts')?.kind).toBe('object');
|
|
expect(postModel?.fields.find((f) => f.name === 'author')?.relationFromFields).toEqual([
|
|
'authorId',
|
|
]);
|
|
});
|
|
|
|
it('should parse enums correctly', async () => {
|
|
const schema = `
|
|
datasource db {
|
|
provider = "postgresql"
|
|
url = env("DATABASE_URL")
|
|
}
|
|
|
|
enum Role {
|
|
ADMIN
|
|
USER
|
|
GUEST
|
|
}
|
|
|
|
model User {
|
|
id Int @id
|
|
role Role @default(USER)
|
|
}
|
|
`;
|
|
|
|
const result = await parsePrismaSchema(schema);
|
|
|
|
expect(result.enums).toHaveLength(1);
|
|
expect(result.enums[0].name).toBe('Role');
|
|
expect(result.enums[0].values).toHaveLength(3);
|
|
expect(result.enums[0].values.map((v) => v.name)).toEqual(['ADMIN', 'USER', 'GUEST']);
|
|
});
|
|
|
|
it('should validate schema correctly', () => {
|
|
const validSchema = `
|
|
datasource db {
|
|
provider = "postgresql"
|
|
url = env("DATABASE_URL")
|
|
}
|
|
|
|
model User {
|
|
id Int @id
|
|
}
|
|
`;
|
|
|
|
const invalidSchema = `
|
|
model User {
|
|
id Int @id
|
|
`;
|
|
|
|
expect(validatePrismaSchema(validSchema).valid).toBe(true);
|
|
expect(validatePrismaSchema(invalidSchema).valid).toBe(false);
|
|
});
|
|
|
|
it('should parse composite primary keys', async () => {
|
|
const schema = `
|
|
datasource db {
|
|
provider = "postgresql"
|
|
url = env("DATABASE_URL")
|
|
}
|
|
|
|
model PostTag {
|
|
postId Int
|
|
tagId Int
|
|
|
|
@@id([postId, tagId])
|
|
}
|
|
`;
|
|
|
|
const result = await parsePrismaSchema(schema);
|
|
const model = result.models[0];
|
|
|
|
expect(model.primaryKey).toBeDefined();
|
|
expect(model.primaryKey?.fields).toEqual(['postId', 'tagId']);
|
|
});
|
|
|
|
it('should parse indexes and unique constraints', async () => {
|
|
const schema = `
|
|
datasource db {
|
|
provider = "postgresql"
|
|
url = env("DATABASE_URL")
|
|
}
|
|
|
|
model User {
|
|
id Int @id
|
|
email String
|
|
firstName String
|
|
lastName String
|
|
|
|
@@unique([email])
|
|
@@index([firstName, lastName])
|
|
}
|
|
`;
|
|
|
|
const result = await parsePrismaSchema(schema);
|
|
const model = result.models[0];
|
|
|
|
expect(model.uniqueConstraints).toHaveLength(1);
|
|
expect(model.uniqueConstraints[0].fields).toEqual(['email']);
|
|
expect(model.indexes).toHaveLength(1);
|
|
expect(model.indexes[0].fields).toEqual(['firstName', 'lastName']);
|
|
});
|
|
});
|