diff --git a/packages/2-sql/1-core/contract/test/entity-kinds.test.ts b/packages/2-sql/1-core/contract/test/entity-kinds.test.ts index 3fd6f4223194..a516f6094d75 100644 --- a/packages/2-sql/1-core/contract/test/entity-kinds.test.ts +++ b/packages/2-sql/1-core/contract/test/entity-kinds.test.ts @@ -1,8 +1,12 @@ import { hydrateNamespaceEntities, UNBOUND_NAMESPACE_ID } from '@internal/framework-components/ir'; import { describe, expect, it } from 'vitest'; import { composeSqlEntityKinds, tableEntityKind, valueSetEntityKind } from '../src/entity-kinds'; +import { index } from '../src/factories'; +import { CheckConstraint } from '../src/ir/check-constraint'; import { StorageTable } from '../src/ir/storage-table'; import { StorageValueSet } from '../src/ir/storage-value-set'; +import type { SerializedCheckConstraint } from '../src/serialized-check-constraint'; +import type { SerializedIndex } from '../src/serialized-index'; const emptyTableInput = { columns: {}, @@ -18,6 +22,67 @@ describe('tableEntityKind', () => { const result = tableEntityKind.construct(emptyTableInput); expect(result).toBeInstanceOf(StorageTable); }); + + describe('given stored records from contract.json', () => { + it('hydrates a stored index record into an Index node', () => { + const serialized: SerializedIndex = { + name: 'users_email_idx_ab12cd34', + prefix: 'users_email_idx', + columns: ['email'], + unique: true, + }; + const result = tableEntityKind.construct({ + ...emptyTableInput, + indexes: [serialized], + }); + expect(result.indexes).toStrictEqual([ + index('users_email_idx_ab12cd34', ['email'], { prefix: 'users_email_idx', unique: true }), + ]); + }); + + it('hydrates a stored check record into a CheckConstraint node', () => { + const serialized: SerializedCheckConstraint = { + name: 'users_email_check_ab12cd34', + prefix: 'users_email_check', + expression: "email <> ''", + }; + const result = tableEntityKind.construct({ + ...emptyTableInput, + checks: [serialized], + }); + expect(result.checks).toStrictEqual([ + new CheckConstraint({ + naming: { kind: 'wire', prefix: 'users_email_check', hash: 'ab12cd34' }, + expression: "email <> ''", + }), + ]); + }); + }); + + describe('given IR nodes from authoring or an earlier hydration pass', () => { + it('keeps an existing Index node as the same instance', () => { + const idx = index('idx_users_email', ['email'], { unique: true }); + const result = tableEntityKind.construct({ + ...emptyTableInput, + indexes: [idx], + }); + expect(result.indexes).toEqual([idx]); + expect(result.indexes[0]).toBe(idx); + }); + + it('keeps an existing CheckConstraint node as the same instance', () => { + const check = new CheckConstraint({ + naming: { kind: 'exact', name: 'chk_users_age' }, + expression: 'age >= 0', + }); + const result = tableEntityKind.construct({ + ...emptyTableInput, + checks: [check], + }); + expect(result.checks).toEqual([check]); + expect(result.checks?.[0]).toBe(check); + }); + }); }); describe('valueSetEntityKind', () => {