import { it, describe, expect } from 'vitest'; const itEffect = (name: string, fn: () => Effect.Effect) => it(name, () => Effect.runPromise(fn())); import { Effect, Schema } from 'effect'; import { EntityESchema } from '../index.js'; describe('ESchema', () => { describe('Encoding', () => { describe('Encode', () => { itEffect('encodes value with version metadata', () => Effect.gen(function* () { const schema = EntityESchema.make('User', 'id', { name: Schema.String, }).build(); const encoded = yield* schema.encode({ id: 'u1', name: 'Alice' }); expect(encoded).toEqual({ _v: 'v1', id: 'u1', name: 'Alice' }); }), ); itEffect('encodes with latest version after evolution', () => Effect.gen(function* () { const schema = EntityESchema.make('Test', 'id', { a: Schema.String, }) .evolve('v2', { b: Schema.Number }, (v) => ({ ...v, b: 0 })) .build(); const encoded = yield* schema.encode({ id: 't1', a: 'hello', b: 123, }); expect(encoded).toEqual({ _v: 'v2', id: 't1', a: 'hello', b: 123 }); }), ); itEffect('strips _v from input before encoding', () => Effect.gen(function* () { const schema = EntityESchema.make('Test', 'id', { name: Schema.String, }).build(); const encoded = yield* schema.encode({ _v: 'old', id: 't1', name: 'test', } as any); expect(encoded).toEqual({ _v: 'v1', id: 't1', name: 'test' }); }), ); }); describe('roundtrip encode/decode', () => { itEffect('preserves data through encode → decode cycle', () => Effect.gen(function* () { const schema = EntityESchema.make('Test', 'id', { name: Schema.String, count: Schema.Number, }).build(); const original = { id: 't1', name: 'test', count: 42 }; const encoded = yield* schema.encode(original); const decoded = yield* schema.decode(encoded); expect(decoded).toEqual({ id: 't1', name: 'test', count: 42 }); }), ); itEffect('preserves data through decode → encode cycle', () => Effect.gen(function* () { const schema = EntityESchema.make('Test', 'id', { count: Schema.Number, }).build(); const raw = { _v: 'v1', id: 't1', count: 123 }; const decoded = yield* schema.decode(raw); const encoded = yield* schema.encode(decoded); expect(encoded).toEqual({ _v: 'v1', id: 't1', count: 123 }); }), ); }); }); });