@accounter/server
Version:
Accounter GraphQL server
77 lines (58 loc) • 2.54 kB
text/typescript
import { describe, expect, it } from 'vitest';
import { makeUUID } from '../helpers/deterministic-uuid.js';
import { UUID5_REGEX } from '../../shared/constants.js';
describe('deterministic-uuid', () => {
describe('makeUUID', () => {
it('generates same UUID for same inputs', () => {
const uuid1 = makeUUID('business', 'acme-consulting-llc');
const uuid2 = makeUUID('business', 'acme-consulting-llc');
expect(uuid1).toBe(uuid2);
expect(uuid1).toMatch(UUID5_REGEX);
});
it('generates different UUIDs for different names', () => {
const uuid1 = makeUUID('business', 'acme-llc');
const uuid2 = makeUUID('business', 'acme-corp');
expect(uuid1).not.toBe(uuid2);
});
it('generates different UUIDs for different namespaces', () => {
const businessUUID = makeUUID('business', 'acme');
const chargeUUID = makeUUID('charge', 'acme');
expect(businessUUID).not.toBe(chargeUUID);
});
it('includes namespace in composite key', () => {
// Same name, different namespace types
const bizUUID = makeUUID('business', 'test-entity');
const transactionUUID = makeUUID('transaction', 'test-entity');
const documentUUID = makeUUID('document', 'test-entity');
expect(bizUUID).not.toBe(transactionUUID);
expect(bizUUID).not.toBe(documentUUID);
expect(transactionUUID).not.toBe(documentUUID);
});
it('generates valid UUID v5 format', () => {
const uuid = makeUUID('charge', 'monthly-invoice-2024-11');
// UUID v5 format: xxxxxxxx-xxxx-5xxx-yxxx-xxxxxxxxxxxx
// where y is one of [8, 9, a, b]
expect(uuid).toMatch(UUID5_REGEX);
});
it('handles kebab-case names correctly', () => {
const uuid1 = makeUUID('business', 'us-supplier-acme-llc');
const uuid2 = makeUUID('business', 'us-supplier-acme-llc');
expect(uuid1).toBe(uuid2);
});
it('handles numeric components in names', () => {
const uuid1 = makeUUID('charge', 'invoice-2024-11-15');
const uuid2 = makeUUID('charge', 'invoice-2024-11-15');
expect(uuid1).toBe(uuid2);
});
it('is case-sensitive for names', () => {
const uuid1 = makeUUID('business', 'acme-llc');
const uuid2 = makeUUID('business', 'ACME-LLC');
expect(uuid1).not.toBe(uuid2);
});
it('is case-sensitive for namespaces', () => {
const uuid1 = makeUUID('business', 'acme');
const uuid2 = makeUUID('Business', 'acme');
expect(uuid1).not.toBe(uuid2);
});
});
});