165 lines
6.7 KiB
TypeScript
165 lines
6.7 KiB
TypeScript
import { describe, expect, it } from 'vitest';
|
|
|
|
import { ERROR_CODES, errorCodeSchema } from '@insforge/shared-schemas';
|
|
|
|
const sharedErrorCodes = ERROR_CODES;
|
|
|
|
describe('shared error codes', () => {
|
|
it('exports a non-empty canonical error code map', () => {
|
|
expect(Object.keys(sharedErrorCodes).length).toBeGreaterThan(0);
|
|
});
|
|
|
|
/**
|
|
* Every error code must be a self-describing string — the value equals
|
|
* the key. This invariant lets consumers compare error.code against a
|
|
* plain string literal without importing the enum.
|
|
*/
|
|
it('every code is a self-describing string (value === key)', () => {
|
|
for (const [key, value] of Object.entries(sharedErrorCodes)) {
|
|
expect(value).toBe(key);
|
|
}
|
|
});
|
|
|
|
it('validates every exported error code through the Zod schema', () => {
|
|
for (const value of Object.values(sharedErrorCodes)) {
|
|
expect(errorCodeSchema.parse(value)).toBe(value);
|
|
}
|
|
});
|
|
|
|
it('rejects unknown error codes', () => {
|
|
expect(errorCodeSchema.safeParse('NOT_A_REAL_ERROR_CODE').success).toBe(false);
|
|
});
|
|
|
|
/**
|
|
* Domain-specific codes introduced in the error-code migration.
|
|
* These replace the generic NOT_FOUND / INVALID_INPUT / ALREADY_EXISTS
|
|
* codes on the affected routes. Asserting them here makes the migration
|
|
* contract explicit and gives a clear failure message if a code is
|
|
* accidentally reverted.
|
|
*/
|
|
describe('domain-specific codes (migration from generic codes)', () => {
|
|
// Secrets module — replaced NOT_FOUND / ALREADY_EXISTS
|
|
it('SECRET_NOT_FOUND is stable', () => {
|
|
expect(sharedErrorCodes.SECRET_NOT_FOUND).toBe('SECRET_NOT_FOUND');
|
|
});
|
|
it('SECRET_ALREADY_EXISTS is stable', () => {
|
|
expect(sharedErrorCodes.SECRET_ALREADY_EXISTS).toBe('SECRET_ALREADY_EXISTS');
|
|
});
|
|
|
|
// Deployments module — replaced NOT_FOUND / ALREADY_EXISTS / INVALID_INPUT
|
|
it('DEPLOYMENT_NOT_FOUND is stable', () => {
|
|
expect(sharedErrorCodes.DEPLOYMENT_NOT_FOUND).toBe('DEPLOYMENT_NOT_FOUND');
|
|
});
|
|
it('DEPLOYMENT_ALREADY_EXISTS is stable', () => {
|
|
expect(sharedErrorCodes.DEPLOYMENT_ALREADY_EXISTS).toBe('DEPLOYMENT_ALREADY_EXISTS');
|
|
});
|
|
it('DEPLOYMENT_INVALID_FILE is stable', () => {
|
|
expect(sharedErrorCodes.DEPLOYMENT_INVALID_FILE).toBe('DEPLOYMENT_INVALID_FILE');
|
|
});
|
|
it('DEPLOYMENT_UPLOAD_CANCELED is stable', () => {
|
|
expect(sharedErrorCodes.DEPLOYMENT_UPLOAD_CANCELED).toBe('DEPLOYMENT_UPLOAD_CANCELED');
|
|
});
|
|
|
|
// Domain management — replaced ALREADY_EXISTS / INVALID_INPUT / NOT_FOUND
|
|
it('DOMAIN_ALREADY_EXISTS is stable', () => {
|
|
expect(sharedErrorCodes.DOMAIN_ALREADY_EXISTS).toBe('DOMAIN_ALREADY_EXISTS');
|
|
});
|
|
it('DOMAIN_INVALID is stable', () => {
|
|
expect(sharedErrorCodes.DOMAIN_INVALID).toBe('DOMAIN_INVALID');
|
|
});
|
|
it('DOMAIN_NOT_FOUND is stable', () => {
|
|
expect(sharedErrorCodes.DOMAIN_NOT_FOUND).toBe('DOMAIN_NOT_FOUND');
|
|
});
|
|
|
|
// Schedules module — replaced INVALID_INPUT / NOT_FOUND
|
|
it('SCHEDULE_INVALID_CRON is stable', () => {
|
|
expect(sharedErrorCodes.SCHEDULE_INVALID_CRON).toBe('SCHEDULE_INVALID_CRON');
|
|
});
|
|
it('SCHEDULE_NOT_FOUND is stable', () => {
|
|
expect(sharedErrorCodes.SCHEDULE_NOT_FOUND).toBe('SCHEDULE_NOT_FOUND');
|
|
});
|
|
|
|
// Payments module — replaced INVALID_INPUT / NOT_FOUND / ALREADY_EXISTS
|
|
it('PAYMENT_CONFIG_INVALID is stable', () => {
|
|
expect(sharedErrorCodes.PAYMENT_CONFIG_INVALID).toBe('PAYMENT_CONFIG_INVALID');
|
|
});
|
|
it('PAYMENT_NOT_FOUND is stable', () => {
|
|
expect(sharedErrorCodes.PAYMENT_NOT_FOUND).toBe('PAYMENT_NOT_FOUND');
|
|
});
|
|
it('PAYMENT_CONFIG_NOT_FOUND is stable', () => {
|
|
expect(sharedErrorCodes.PAYMENT_CONFIG_NOT_FOUND).toBe('PAYMENT_CONFIG_NOT_FOUND');
|
|
});
|
|
it('PAYMENT_PRICE_NOT_FOUND is stable', () => {
|
|
expect(sharedErrorCodes.PAYMENT_PRICE_NOT_FOUND).toBe('PAYMENT_PRICE_NOT_FOUND');
|
|
});
|
|
it('PAYMENT_PRODUCT_NOT_FOUND is stable', () => {
|
|
expect(sharedErrorCodes.PAYMENT_PRODUCT_NOT_FOUND).toBe('PAYMENT_PRODUCT_NOT_FOUND');
|
|
});
|
|
it('PAYMENT_CHECKOUT_ALREADY_EXISTS is stable', () => {
|
|
expect(sharedErrorCodes.PAYMENT_CHECKOUT_ALREADY_EXISTS).toBe(
|
|
'PAYMENT_CHECKOUT_ALREADY_EXISTS'
|
|
);
|
|
});
|
|
|
|
// Auth module — replaced user and OAuth config generic errors
|
|
it('AUTH_USER_NOT_FOUND is stable', () => {
|
|
expect(sharedErrorCodes.AUTH_USER_NOT_FOUND).toBe('AUTH_USER_NOT_FOUND');
|
|
});
|
|
it('AUTH_OAUTH_CONFIG_NOT_FOUND is stable', () => {
|
|
expect(sharedErrorCodes.AUTH_OAUTH_CONFIG_NOT_FOUND).toBe('AUTH_OAUTH_CONFIG_NOT_FOUND');
|
|
});
|
|
it('AUTH_OAUTH_CONFIG_ALREADY_EXISTS is stable', () => {
|
|
expect(sharedErrorCodes.AUTH_OAUTH_CONFIG_ALREADY_EXISTS).toBe(
|
|
'AUTH_OAUTH_CONFIG_ALREADY_EXISTS'
|
|
);
|
|
});
|
|
|
|
// Database module — replaced generic migration duplicate errors
|
|
it('DATABASE_MIGRATION_ALREADY_EXISTS is stable', () => {
|
|
expect(sharedErrorCodes.DATABASE_MIGRATION_ALREADY_EXISTS).toBe(
|
|
'DATABASE_MIGRATION_ALREADY_EXISTS'
|
|
);
|
|
});
|
|
|
|
// Functions module — replaced generic NOT_FOUND / ALREADY_EXISTS
|
|
it('FUNCTION_NOT_FOUND is stable', () => {
|
|
expect(sharedErrorCodes.FUNCTION_NOT_FOUND).toBe('FUNCTION_NOT_FOUND');
|
|
});
|
|
it('FUNCTION_ALREADY_EXISTS is stable', () => {
|
|
expect(sharedErrorCodes.FUNCTION_ALREADY_EXISTS).toBe('FUNCTION_ALREADY_EXISTS');
|
|
});
|
|
|
|
// Realtime module — replaced generic channel errors
|
|
it('REALTIME_CHANNEL_NOT_FOUND is stable', () => {
|
|
expect(sharedErrorCodes.REALTIME_CHANNEL_NOT_FOUND).toBe('REALTIME_CHANNEL_NOT_FOUND');
|
|
});
|
|
it('REALTIME_NOT_SUBSCRIBED is stable', () => {
|
|
expect(sharedErrorCodes.REALTIME_NOT_SUBSCRIBED).toBe('REALTIME_NOT_SUBSCRIBED');
|
|
});
|
|
|
|
// Analytics module — replaced generic not-connected errors
|
|
it('ANALYTICS_NOT_CONNECTED is stable', () => {
|
|
expect(sharedErrorCodes.ANALYTICS_NOT_CONNECTED).toBe('ANALYTICS_NOT_CONNECTED');
|
|
});
|
|
|
|
// Docs module — replaced generic documentation lookup errors
|
|
it('DOCS_NOT_FOUND is stable', () => {
|
|
expect(sharedErrorCodes.DOCS_NOT_FOUND).toBe('DOCS_NOT_FOUND');
|
|
});
|
|
|
|
// General codes that remain in the schema for backward compatibility
|
|
it('generic NOT_FOUND is preserved for backward compatibility', () => {
|
|
expect(sharedErrorCodes.NOT_FOUND).toBe('NOT_FOUND');
|
|
});
|
|
it('generic ALREADY_EXISTS is preserved for backward compatibility', () => {
|
|
expect(sharedErrorCodes.ALREADY_EXISTS).toBe('ALREADY_EXISTS');
|
|
});
|
|
it('generic INVALID_INPUT is preserved for backward compatibility', () => {
|
|
expect(sharedErrorCodes.INVALID_INPUT).toBe('INVALID_INPUT');
|
|
});
|
|
it('INTERNAL_ERROR is stable', () => {
|
|
expect(sharedErrorCodes.INTERNAL_ERROR).toBe('INTERNAL_ERROR');
|
|
});
|
|
});
|
|
});
|