import { describe, expect, it } from 'vitest' import { pickUiDesignOverlay, resolveEditMode, UiDesignOverlaySchema } from '../ui-design-overlay.js' describe('pickUiDesignOverlay', () => { it('extracts a plain-object uiDesign from a pagespec', () => { const overlay = pickUiDesignOverlay({ uiDesign: { formLayout: 'single-column' } }) expect(overlay).toEqual({ formLayout: 'single-column' }) }) it('returns undefined on missing / non-object / array shapes', () => { expect(pickUiDesignOverlay(undefined)).toBeUndefined() expect(pickUiDesignOverlay({})).toBeUndefined() expect(pickUiDesignOverlay({ uiDesign: null })).toBeUndefined() expect(pickUiDesignOverlay({ uiDesign: [1] })).toBeUndefined() expect(pickUiDesignOverlay('nope')).toBeUndefined() }) }) describe('resolveEditMode', () => { it('defaults to read-first', () => { expect(resolveEditMode(undefined, undefined)).toBe('read-first') expect(resolveEditMode({}, {})).toBe('read-first') }) it('overlay editMode wins over the pagespec editExperience', () => { expect(resolveEditMode({ editExperience: 'read-first' }, { editMode: 'direct' })).toBe('direct') }) it('falls back to the pagespec editExperience when the overlay is silent', () => { expect(resolveEditMode({ editExperience: 'direct' }, undefined)).toBe('direct') }) it('ignores unknown values instead of throwing (hand-edited pagespec)', () => { expect(resolveEditMode({ editExperience: 'weird' }, { editMode: 'weird' as never })).toBe('read-first') }) }) describe('UiDesignOverlaySchema', () => { it('accepts the full canonical shape (fields record + order + sections + editMode)', () => { const parsed = UiDesignOverlaySchema.safeParse({ formLayout: 'two-column', editMode: 'read-first', fields: { userId: { currentUserFk: true, section: 'identity', dateBounds: 'past' } }, order: ['userId'], sections: [{ key: 'identity', labelKey: 'form.section.identity', columns: 2 }], }) expect(parsed.success).toBe(true) }) it('rejects an invalid editMode and an out-of-range columns', () => { expect(UiDesignOverlaySchema.safeParse({ editMode: 'weird' }).success).toBe(false) expect(UiDesignOverlaySchema.safeParse({ sections: [{ key: 'a', columns: 4 }] }).success).toBe(false) }) it('tolerates unknown sibling keys (passthrough — forward compatible)', () => { const parsed = UiDesignOverlaySchema.safeParse({ futureKnob: true }) expect(parsed.success).toBe(true) }) })