zenstack/packages/language/test/function-invocation.test.ts
Yiming Cao be330ff403
fix(orm): cuid() generator should respect version argument (#547)
* feat(orm): support where enum

* fix(orm): super transform for where

* feat(orm): support nested enum in where and/or

* fix: resolve field's model from scope instead of relying on table qualification

* fix(orm): cuid() generator should respect version argument

---------

Co-authored-by: FTB_lag <tabolskyy.git@gmail.com>
2025-12-29 23:18:35 +08:00

417 lines
10 KiB
TypeScript

import { describe, it } from 'vitest';
import { loadSchema, loadSchemaWithError } from './utils';
describe('Function Invocation Tests', () => {
it('id functions should not require format strings', async () => {
await loadSchema(
`
datasource db {
provider = 'sqlite'
url = 'file:./dev.db'
}
model User {
id String @id @default(uuid())
}
`,
);
await loadSchema(
`
datasource db {
provider = 'sqlite'
url = 'file:./dev.db'
}
model User {
id String @id @default(uuid(7))
}
`,
);
await loadSchema(
`
datasource db {
provider = 'sqlite'
url = 'file:./dev.db'
}
model User {
id String @id @default(nanoid())
}
`,
);
await loadSchema(
`
datasource db {
provider = 'sqlite'
url = 'file:./dev.db'
}
model User {
id String @id @default(nanoid(8))
}
`,
);
await loadSchema(
`
datasource db {
provider = 'sqlite'
url = 'file:./dev.db'
}
model User {
id String @id @default(ulid())
}
`,
);
await loadSchema(
`
datasource db {
provider = 'sqlite'
url = 'file:./dev.db'
}
model User {
id String @id @default(cuid())
}
`,
);
await loadSchema(
`
datasource db {
provider = 'sqlite'
url = 'file:./dev.db'
}
model User {
id String @id @default(cuid(2))
}
`,
);
});
it('id functions should allow valid format strings', async () => {
await loadSchema(
`
datasource db {
provider = 'sqlite'
url = 'file:./dev.db'
}
model User {
id String @id @default(uuid(7, '%s_user'))
}
`,
);
await loadSchema(
`
datasource db {
provider = 'sqlite'
url = 'file:./dev.db'
}
model User {
id String @id @default(cuid(2, '%s'))
}
`,
);
await loadSchema(
`
datasource db {
provider = 'sqlite'
url = 'file:./dev.db'
}
model User {
id String @id @default(ulid('user_%s'))
}
`,
);
await loadSchema(
`
datasource db {
provider = 'sqlite'
url = 'file:./dev.db'
}
model User {
id String @id @default(nanoid(8, 'user_%s'))
}
`,
);
await loadSchema(
`
datasource db {
provider = 'sqlite'
url = 'file:./dev.db'
}
model User {
id String @id @default(uuid(7, '\\\\%s_%s'))
}
`,
);
await loadSchema(
`
datasource db {
provider = 'sqlite'
url = 'file:./dev.db'
}
model User {
id String @id @default(uuid(7, '%s_\\\\%s'))
}
`,
);
});
it('id functions should reject invalid format strings', async () => {
await loadSchemaWithError(
`
datasource db {
provider = 'sqlite'
url = 'file:./dev.db'
}
model User {
id String @id @default(cuid(2, ''))
}
`,
'argument must include',
);
await loadSchemaWithError(
`
datasource db {
provider = 'sqlite'
url = 'file:./dev.db'
}
model User {
id String @id @default(uuid(4, '\\\\%s'))
}
`,
'argument must include',
);
await loadSchemaWithError(
`
datasource db {
provider = 'sqlite'
url = 'file:./dev.db'
}
model User {
id String @id @default(uuid(4, '\\\\%s\\\\%s'))
}
`,
'argument must include',
);
await loadSchemaWithError(
`
datasource db {
provider = 'sqlite'
url = 'file:./dev.db'
}
model User {
id String @id @default(uuid(7, 'user_%'))
}
`,
'argument must include',
);
await loadSchemaWithError(
`
datasource db {
provider = 'sqlite'
url = 'file:./dev.db'
}
model User {
id String @id @default(nanoid(8, 'user'))
}
`,
'argument must include',
);
await loadSchemaWithError(
`
datasource db {
provider = 'sqlite'
url = 'file:./dev.db'
}
model User {
id String @id @default(ulid('user_%'))
}
`,
'argument must include',
);
await loadSchemaWithError(
`
datasource db {
provider = 'sqlite'
url = 'file:./dev.db'
}
model User {
id String @id @default(cuid(2, 'user_%'))
}
`,
'argument must include',
);
});
describe('uuid() version validation', () => {
it('should accept valid uuid versions', async () => {
await loadSchema(`
datasource db {
provider = 'sqlite'
url = 'file:./dev.db'
}
model User {
id String @id @default(uuid(4))
}
`);
await loadSchema(`
datasource db {
provider = 'sqlite'
url = 'file:./dev.db'
}
model User {
id String @id @default(uuid(7))
}
`);
});
it('should reject invalid uuid versions', async () => {
await loadSchemaWithError(
`
datasource db {
provider = 'sqlite'
url = 'file:./dev.db'
}
model User {
id String @id @default(uuid(1))
}
`,
'first argument must be 4 or 7',
);
});
});
describe('cuid() version validation', () => {
it('should accept valid cuid versions', async () => {
await loadSchema(`
datasource db {
provider = 'sqlite'
url = 'file:./dev.db'
}
model User {
id String @id @default(cuid(1))
}
`);
await loadSchema(`
datasource db {
provider = 'sqlite'
url = 'file:./dev.db'
}
model User {
id String @id @default(cuid(2))
}
`);
});
it('should reject invalid cuid versions', async () => {
await loadSchemaWithError(
`
datasource db {
provider = 'sqlite'
url = 'file:./dev.db'
}
model User {
id String @id @default(cuid(0))
}
`,
'first argument must be 1 or 2',
);
});
});
describe('nanoid() length validation', () => {
it('should accept positive nanoid lengths', async () => {
await loadSchema(`
datasource db {
provider = 'sqlite'
url = 'file:./dev.db'
}
model User {
id String @id @default(nanoid(1))
}
`);
await loadSchema(`
datasource db {
provider = 'sqlite'
url = 'file:./dev.db'
}
model User {
id String @id @default(nanoid(21))
}
`);
});
it('should reject non-positive nanoid lengths', async () => {
await loadSchemaWithError(
`
datasource db {
provider = 'sqlite'
url = 'file:./dev.db'
}
model User {
id String @id @default(nanoid(0))
}
`,
'first argument must be a positive number',
);
await loadSchemaWithError(
`
datasource db {
provider = 'sqlite'
url = 'file:./dev.db'
}
model User {
id String @id @default(nanoid(-1))
}
`,
'first argument must be a positive number',
);
});
});
});