zenstack/tests/e2e/orm/client-api/error-handling.test.ts
Yiming Cao ff0808d359
refactor: revised error system (#377)
* refactor: revised error system

* addressing PR comments
2025-11-06 21:59:27 -08:00

52 lines
2 KiB
TypeScript

import { ORMError, ORMErrorReason, RejectedByPolicyReason } from '@zenstackhq/orm';
import { createPolicyTestClient, createTestClient } from '@zenstackhq/testtools';
import { describe, expect, it } from 'vitest';
describe('Error handling tests', () => {
const schema = `
model User {
id String @id @default(cuid())
name String?
email String @unique @email
}
`;
it('throws invalid input errors', async () => {
const db: any = await createTestClient(schema);
await expect(db.user.create({ data: { name: 'user' } })).toBeRejectedByValidation();
await expect(db.user.create({ data: { name: 'user', email: 'foo' } })).toBeRejectedByValidation([
'Invalid email',
]);
});
it('throws not found errors', async () => {
const db: any = await createTestClient(schema);
await expect(db.user.findUniqueOrThrow({ where: { id: 'non-existent-id' } })).toBeRejectedNotFound();
});
it('throws rejected by policy errors', async () => {
const db: any = await createPolicyTestClient(schema);
await expect(db.user.create({ data: { name: 'user', email: 'user@example.com' } })).rejects.toSatisfy(
(e) =>
e instanceof ORMError &&
e.reason === ORMErrorReason.REJECTED_BY_POLICY &&
e.rejectedByPolicyReason === RejectedByPolicyReason.NO_ACCESS,
);
});
it('throws db query errors', async () => {
const db: any = await createTestClient(schema);
await db.user.create({ data: { email: 'user1@example.com' } });
const provider = db.$schema.provider.type;
const expectedCode = provider === 'sqlite' ? 'SQLITE_CONSTRAINT_UNIQUE' : '23505';
await expect(db.user.create({ data: { email: 'user1@example.com' } })).rejects.toSatisfy(
(e) =>
e instanceof ORMError &&
e.reason === ORMErrorReason.DB_QUERY_ERROR &&
e.dbErrorCode === expectedCode &&
!!e.dbErrorMessage?.includes('constraint'),
);
});
});