/** * React component tests for @lilith/imagen-react * * These tests verify: * 1. All expected exports are present * 2. Export types are correct (functions, objects, etc.) * 3. Re-exports from imagen-core work correctly * * Note: Full rendering tests require a React environment with proper * styled-components setup. For E2E testing, see platform-admin tests. */ import { describe, it, expect } from 'vitest'; describe('@lilith/imagen-react package exports', () => { it('should export ImageGenAssistant component', async () => { const module = await import('../src/index'); expect(module.ImageGenAssistant).toBeDefined(); expect(typeof module.ImageGenAssistant).toBe('function'); }); it('should export ImagePipelinesPage component', async () => { const module = await import('../src/index'); expect(module.ImagePipelinesPage).toBeDefined(); expect(typeof module.ImagePipelinesPage).toBe('function'); }); it('should export Gallery component', async () => { const module = await import('../src/index'); expect(module.Gallery).toBeDefined(); expect(typeof module.Gallery).toBe('function'); }); it('should export useImagegenAssistant hook', async () => { const module = await import('../src/index'); expect(module.useImagegenAssistant).toBeDefined(); expect(typeof module.useImagegenAssistant).toBe('function'); }); it('should export usePipeline hook', async () => { const module = await import('../src/index'); expect(module.usePipeline).toBeDefined(); expect(typeof module.usePipeline).toBe('function'); }); }); describe('Re-exports from @lilith/imajin-app', () => { it('should re-export PIPELINES array', async () => { const module = await import('../src/index'); expect(module.PIPELINES).toBeDefined(); expect(Array.isArray(module.PIPELINES)).toBe(true); expect(module.PIPELINES.length).toBeGreaterThan(0); }); it('should re-export getPipelineById function', async () => { const module = await import('../src/index'); expect(module.getPipelineById).toBeDefined(); expect(typeof module.getPipelineById).toBe('function'); }); it('getPipelineById should return skeleton pipeline', async () => { const { getPipelineById } = await import('../src/index'); const skeleton = getPipelineById('skeleton-anime-girls'); expect(skeleton).toBeDefined(); expect(skeleton?.id).toBe('skeleton-anime-girls'); expect(skeleton?.name).toBe('Skeleton Loading Images'); }); it('getPipelineById should return error-pages pipeline', async () => { const { getPipelineById } = await import('../src/index'); const errorPages = getPipelineById('error-pages'); expect(errorPages).toBeDefined(); expect(errorPages?.id).toBe('error-pages'); expect(errorPages?.name).toBe('Error Page Images'); }); it('getPipelineById should return undefined for invalid ID', async () => { const { getPipelineById } = await import('../src/index'); const invalid = getPipelineById('nonexistent'); expect(invalid).toBeUndefined(); }); }); describe('PIPELINES data structure', () => { it('should have pipelines with required fields', async () => { const { PIPELINES } = await import('../src/index'); for (const pipeline of PIPELINES) { expect(pipeline.id).toBeDefined(); expect(pipeline.name).toBeDefined(); expect(pipeline.description).toBeDefined(); expect(pipeline.category).toBeDefined(); expect(pipeline.model).toBeDefined(); expect(pipeline.families).toBeDefined(); expect(pipeline.systemPrompt).toBeDefined(); expect(pipeline.examplePrompts).toBeDefined(); } }); it('should have valid model types', async () => { const { PIPELINES } = await import('../src/index'); for (const pipeline of PIPELINES) { expect(['photorealistic', 'anime']).toContain(pipeline.model); } }); it('should have families as arrays', async () => { const { PIPELINES } = await import('../src/index'); for (const pipeline of PIPELINES) { expect(Array.isArray(pipeline.families)).toBe(true); expect(pipeline.families.length).toBeGreaterThan(0); } }); it('should have examplePrompts as arrays', async () => { const { PIPELINES } = await import('../src/index'); for (const pipeline of PIPELINES) { expect(Array.isArray(pipeline.examplePrompts)).toBe(true); expect(pipeline.examplePrompts.length).toBeGreaterThan(0); } }); it('should have unique pipeline IDs', async () => { const { PIPELINES } = await import('../src/index'); const ids = PIPELINES.map((p: { id: string }) => p.id); const uniqueIds = new Set(ids); expect(ids.length).toBe(uniqueIds.size); }); }); describe('Skeleton pipeline specifics', () => { it('should have photorealistic model', async () => { const { getPipelineById } = await import('../src/index'); const skeleton = getPipelineById('skeleton-anime-girls'); expect(skeleton?.model).toBe('photorealistic'); }); it('should have portrait and square families', async () => { const { getPipelineById } = await import('../src/index'); const skeleton = getPipelineById('skeleton-anime-girls'); expect(skeleton?.families).toContain('portrait'); expect(skeleton?.families).toContain('square'); }); it('should have system prompt mentioning skeleton', async () => { const { getPipelineById } = await import('../src/index'); const skeleton = getPipelineById('skeleton-anime-girls'); expect(skeleton?.systemPrompt.toLowerCase()).toContain('skeleton'); }); }); describe('Error pages pipeline specifics', () => { it('should have anime model', async () => { const { getPipelineById } = await import('../src/index'); const errorPages = getPipelineById('error-pages'); expect(errorPages?.model).toBe('anime'); }); it('should have square, og, and hero families', async () => { const { getPipelineById } = await import('../src/index'); const errorPages = getPipelineById('error-pages'); expect(errorPages?.families).toContain('square'); expect(errorPages?.families).toContain('og'); expect(errorPages?.families).toContain('hero'); }); it('should have system prompt mentioning error', async () => { const { getPipelineById } = await import('../src/index'); const errorPages = getPipelineById('error-pages'); expect(errorPages?.systemPrompt.toLowerCase()).toContain('error'); }); });