zenstack/packages/language/test/function-invocation.test.ts
sanny-io 4f06c2007c
Add support for generated identifier format strings (id prefixing). (#509)
* Add support for generated identifier format strings (ID prefixing).

* Add tests.

* Add missing semicolon.

* Cleanup logic.

* Fix typo.

* Use `replaceAll` instead.

* Add language support and tests.

* Simplify logic.

* allow using '\\%s' to escape replacement pattern, improve tests

* Shorten some test names.

---------

Co-authored-by: ymc9 <104139426+ymc9@users.noreply.github.com>
2025-12-25 16:04:59 +08:00

209 lines
4.6 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'))
}
`,
);
});
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(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',
);
});
});