UNPKG

@lobehub/chat

Version:

Lobe Chat - an open-source, high-performance chatbot framework that supports speech synthesis, multimodal, and extensible Function Call plugin system. Supports one-click free deployment of your private ChatGPT/LLM web application.

139 lines (117 loc) 4.72 kB
// @vitest-environment node import { PromptBuilder } from '@saintno/comfyui-sdk'; import { beforeEach, describe, expect, it, vi } from 'vitest'; import { parametersFixture } from '@/server/services/comfyui/__tests__/fixtures/parameters.fixture'; import { supportedFixture } from '@/server/services/comfyui/__tests__/fixtures/supported.fixture'; import { mockContext } from '@/server/services/comfyui/__tests__/helpers/mockContext'; import { setupAllMocks } from '@/server/services/comfyui/__tests__/setup/unifiedMocks'; // Import workflow builders import { buildFluxDevWorkflow } from '@/server/services/comfyui/workflows/flux-dev'; import { buildFluxKontextWorkflow } from '@/server/services/comfyui/workflows/flux-kontext'; import { buildFluxSchnellWorkflow } from '@/server/services/comfyui/workflows/flux-schnell'; import { buildSD35Workflow } from '@/server/services/comfyui/workflows/sd35'; import { buildSimpleSDWorkflow } from '@/server/services/comfyui/workflows/simple-sd'; describe('Parameter Mapping - Core Business Logic', () => { const { models } = parametersFixture; let inputCalls: Map<string, any>; beforeEach(() => { const mocks = setupAllMocks(); inputCalls = mocks.inputCalls; }); // Workflow builder mapping const workflowBuilders = { 'flux-dev': buildFluxDevWorkflow, 'flux-schnell': buildFluxSchnellWorkflow, 'flux-kontext': buildFluxKontextWorkflow, 'sd15': buildSimpleSDWorkflow, 'sdxl': buildSimpleSDWorkflow, 'sd35': buildSD35Workflow, }; // Parameterized tests for all supported models describe.each( Object.entries(models).filter( ([name]) => workflowBuilders[name as keyof typeof workflowBuilders], ), )('%s parameter mapping', (modelName, modelConfig) => { const builder = workflowBuilders[modelName as keyof typeof workflowBuilders]; it('should map schema parameters to workflow', async () => { const params: any = { prompt: 'test prompt', ...modelConfig.defaults, }; // Special parameter handling if (modelName === 'flux-kontext') { params.imageUrl = 'test.png'; } if (modelName.startsWith('sd')) { params.width = 512; params.height = 512; } else if (modelName.startsWith('flux') && modelName !== 'flux-kontext') { params.width = 1024; params.height = 1024; } // Build workflow const workflow = await builder(`${modelName}.safetensors`, params, mockContext); // Verify workflow is built successfully expect(workflow).toBeDefined(); // Verify PromptBuilder was used for workflow construction expect(workflow).toBeDefined(); expect(typeof workflow).toBe('object'); }); it('should handle boundary values', async () => { const { min, max } = modelConfig.boundaries!; const baseParams = { prompt: 'test prompt', width: 512, height: 512, }; // Minimum values should not error const minResult = await builder( `${modelName}.safetensors`, { ...baseParams, ...modelConfig.defaults, ...min }, mockContext, ); expect(minResult).toBeDefined(); // Maximum values should not error const maxResult = await builder( `${modelName}.safetensors`, { ...baseParams, ...modelConfig.defaults, ...max }, mockContext, ); expect(maxResult).toBeDefined(); }); }); // Parameter transformation tests describe('Parameter Transformations', () => { it.each(parametersFixture.transformations.aspectRatio)( 'should transform aspectRatio $input to width/height', async ({ input, expected }) => { const params = { prompt: 'test prompt', ...models['flux-dev'].defaults, aspectRatio: input, }; const workflow = await buildFluxDevWorkflow('flux-dev.safetensors', params, mockContext); // Verify workflow builds successfully expect(workflow).toBeDefined(); // aspectRatio should be processed (verified through successful workflow build) const workflowStr = JSON.stringify(workflow.workflow || workflow); expect(workflowStr).not.toContain('aspectRatio'); }, ); it('should handle imageUrl for img2img mode', async () => { const params = { prompt: 'test prompt', imageUrl: 'test-image.png', strength: 0.8, }; const workflow = await buildFluxKontextWorkflow( 'flux-kontext.safetensors', params, mockContext, ); // Verify workflow builds successfully (img2img parameters processed) expect(workflow).toBeDefined(); }); }); });