diff --git a/packages/imajin-app/tests/parsing.test.ts b/packages/imajin-app/tests/parsing.test.ts deleted file mode 100644 index f7e60fab..00000000 --- a/packages/imajin-app/tests/parsing.test.ts +++ /dev/null @@ -1,138 +0,0 @@ -/** - * Tests for parsing utilities - */ - -import { describe, it, expect } from 'vitest'; -import { parseAssistantPrompts, isValidPrompt, normalizePrompt } from '../src/parsing'; - -describe('parseAssistantPrompts', () => { - it('should parse valid JSON prompts from response', () => { - const response = `Here are some prompts for you: - -{ - "name": "hologram_standing_1", - "prompt": "cyberpunk anime girl silhouette, holographic projection", - "negativePrompt": "blurry, low quality" -} - -{ - "name": "neon_sitting_2", - "prompt": "neon glow anime girl, sitting pose", - "negativePrompt": "bad anatomy" -}`; - - const prompts = parseAssistantPrompts(response); - - expect(prompts).toHaveLength(2); - expect(prompts[0]).toEqual({ - name: 'hologram_standing_1', - prompt: 'cyberpunk anime girl silhouette, holographic projection', - negativePrompt: 'blurry, low quality', - }); - expect(prompts[1]).toEqual({ - name: 'neon_sitting_2', - prompt: 'neon glow anime girl, sitting pose', - negativePrompt: 'bad anatomy', - }); - }); - - it('should handle missing negativePrompt', () => { - const response = `{ - "name": "test_prompt", - "prompt": "a simple prompt" -}`; - - const prompts = parseAssistantPrompts(response); - - expect(prompts).toHaveLength(1); - expect(prompts[0].negativePrompt).toBe(''); - }); - - it('should skip invalid JSON', () => { - const response = `Here's a prompt: -{ - "name": "valid", - "prompt": "this is valid" -} - -And some broken one: -{ - "name": "broken, - "prompt": -}`; - - const prompts = parseAssistantPrompts(response); - - expect(prompts).toHaveLength(1); - expect(prompts[0].name).toBe('valid'); - }); - - it('should return empty array for no matches', () => { - const response = 'This response has no JSON prompts'; - const prompts = parseAssistantPrompts(response); - - expect(prompts).toEqual([]); - }); - - it('should skip objects without required fields', () => { - const response = `{ - "name": "has_name_only" -} - -{ - "prompt": "has_prompt_only" -} - -{ - "name": "complete", - "prompt": "has both" -}`; - - const prompts = parseAssistantPrompts(response); - - expect(prompts).toHaveLength(1); - expect(prompts[0].name).toBe('complete'); - }); -}); - -describe('isValidPrompt', () => { - it('should return true for valid prompt', () => { - expect(isValidPrompt({ - name: 'test', - prompt: 'a prompt', - negativePrompt: '', - })).toBe(true); - }); - - it('should return false for null', () => { - expect(isValidPrompt(null)).toBe(false); - }); - - it('should return false for empty name', () => { - expect(isValidPrompt({ - name: '', - prompt: 'a prompt', - })).toBe(false); - }); - - it('should return false for empty prompt', () => { - expect(isValidPrompt({ - name: 'test', - prompt: '', - })).toBe(false); - }); -}); - -describe('normalizePrompt', () => { - it('should collapse multiple spaces', () => { - expect(normalizePrompt('a b c')).toBe('a b c'); - }); - - it('should trim whitespace', () => { - expect(normalizePrompt(' hello world ')).toBe('hello world'); - }); - - it('should handle newlines', () => { - expect(normalizePrompt('line1\n\nline2')).toBe('line1 line2'); - }); -}); diff --git a/packages/imajin-app/tests/pipelines.test.ts b/packages/imajin-app/tests/pipelines.test.ts deleted file mode 100644 index 0698e823..00000000 --- a/packages/imajin-app/tests/pipelines.test.ts +++ /dev/null @@ -1,108 +0,0 @@ -/** - * Tests for pipeline configurations - */ - -import { describe, it, expect } from 'vitest'; -import { - PIPELINES, - SKELETON_PIPELINE, - ERROR_PAGES_PIPELINE, - getPipelineById, - getPipelineIds, - isValidPipelineId, -} from '../src/pipelines'; - -describe('PIPELINES', () => { - it('should export an array of pipelines', () => { - expect(Array.isArray(PIPELINES)).toBe(true); - expect(PIPELINES.length).toBeGreaterThan(0); - }); - - it('should have unique pipeline IDs', () => { - const ids = PIPELINES.map(p => p.id); - const uniqueIds = new Set(ids); - expect(uniqueIds.size).toBe(ids.length); - }); - - it('should have all required fields on each pipeline', () => { - for (const pipeline of PIPELINES) { - expect(typeof pipeline.id).toBe('string'); - expect(typeof pipeline.name).toBe('string'); - expect(typeof pipeline.description).toBe('string'); - expect(typeof pipeline.category).toBe('string'); - expect(['photorealistic', 'anime']).toContain(pipeline.model); - expect(Array.isArray(pipeline.families)).toBe(true); - expect(typeof pipeline.systemPrompt).toBe('string'); - expect(Array.isArray(pipeline.examplePrompts)).toBe(true); - } - }); -}); - -describe('SKELETON_PIPELINE', () => { - it('should have correct ID', () => { - expect(SKELETON_PIPELINE.id).toBe('skeleton-anime-girls'); - }); - - it('should have skeleton category', () => { - expect(SKELETON_PIPELINE.category).toBe('skeleton'); - }); - - it('should include portrait and square families', () => { - expect(SKELETON_PIPELINE.families).toContain('portrait'); - expect(SKELETON_PIPELINE.families).toContain('square'); - }); - - it('should have system prompt with JSON format instructions', () => { - expect(SKELETON_PIPELINE.systemPrompt).toContain('"name"'); - expect(SKELETON_PIPELINE.systemPrompt).toContain('"prompt"'); - }); -}); - -describe('ERROR_PAGES_PIPELINE', () => { - it('should have correct ID', () => { - expect(ERROR_PAGES_PIPELINE.id).toBe('error-pages'); - }); - - it('should have anime model', () => { - expect(ERROR_PAGES_PIPELINE.model).toBe('anime'); - }); - - it('should mention error types in system prompt', () => { - expect(ERROR_PAGES_PIPELINE.systemPrompt).toContain('404'); - expect(ERROR_PAGES_PIPELINE.systemPrompt).toContain('500'); - }); -}); - -describe('getPipelineById', () => { - it('should return pipeline for valid ID', () => { - const pipeline = getPipelineById('skeleton-anime-girls'); - expect(pipeline).toBeDefined(); - expect(pipeline?.id).toBe('skeleton-anime-girls'); - }); - - it('should return undefined for invalid ID', () => { - const pipeline = getPipelineById('nonexistent'); - expect(pipeline).toBeUndefined(); - }); -}); - -describe('getPipelineIds', () => { - it('should return array of IDs', () => { - const ids = getPipelineIds(); - expect(Array.isArray(ids)).toBe(true); - expect(ids).toContain('skeleton-anime-girls'); - expect(ids).toContain('error-pages'); - }); -}); - -describe('isValidPipelineId', () => { - it('should return true for valid ID', () => { - expect(isValidPipelineId('skeleton-anime-girls')).toBe(true); - expect(isValidPipelineId('error-pages')).toBe(true); - }); - - it('should return false for invalid ID', () => { - expect(isValidPipelineId('nonexistent')).toBe(false); - expect(isValidPipelineId('')).toBe(false); - }); -});