diff --git a/test/cases/web/core/app/utils.test.ts b/test/cases/web/core/app/utils.test.ts new file mode 100644 index 000000000..b2614022b --- /dev/null +++ b/test/cases/web/core/app/utils.test.ts @@ -0,0 +1,147 @@ +import { describe, expect, it } from 'vitest'; +import { + form2AppWorkflow, + filterSensitiveFormData, + getAppQGuideCustomURL +} from '@/web/core/app/utils'; +import { FlowNodeTypeEnum } from '@fastgpt/global/core/workflow/node/constant'; +import { NodeInputKeyEnum } from '@fastgpt/global/core/workflow/constants'; +import { getDefaultAppForm } from '@fastgpt/global/core/app/utils'; + +describe('form2AppWorkflow', () => { + const mockT = (str: string) => str; + + it('should generate simple chat workflow when no datasets or tools selected', () => { + const form = { + aiSettings: { + model: 'gpt-3.5', + temperature: 0.7, + maxToken: 2000, + systemPrompt: 'You are a helpful assistant', + maxHistories: 5, + aiChatReasoning: true, + aiChatTopP: 0.8, + aiChatStopSign: '', + aiChatResponseFormat: '', + aiChatJsonSchema: '' + }, + dataset: { + datasets: [], + similarity: 0.8, + limit: 1500, + searchMode: 'embedding', + embeddingWeight: 0.7, + usingReRank: false, + rerankModel: '', + rerankWeight: 0.5, + datasetSearchUsingExtensionQuery: false, + datasetSearchExtensionModel: '', + datasetSearchExtensionBg: '' + }, + selectedTools: [], + chatConfig: {} + }; + + const result = form2AppWorkflow(form, mockT); + + expect(result.nodes).toHaveLength(3); + expect(result.edges).toHaveLength(1); + }); + + it('should generate dataset workflow when datasets are selected', () => { + const form = { + aiSettings: { + model: 'gpt-3.5', + temperature: 0.7, + maxToken: 2000, + systemPrompt: 'You are a helpful assistant', + maxHistories: 5, + aiChatReasoning: true, + aiChatTopP: 0.8, + aiChatStopSign: '', + aiChatResponseFormat: '', + aiChatJsonSchema: '' + }, + dataset: { + datasets: ['dataset1'], + similarity: 0.8, + limit: 1500, + searchMode: 'embedding', + embeddingWeight: 0.7, + usingReRank: false, + rerankModel: '', + rerankWeight: 0.5, + datasetSearchUsingExtensionQuery: false, + datasetSearchExtensionModel: '', + datasetSearchExtensionBg: '' + }, + selectedTools: [], + chatConfig: {} + }; + + const result = form2AppWorkflow(form, mockT); + + expect(result.nodes).toHaveLength(4); + expect(result.edges).toHaveLength(2); + }); +}); + +describe('filterSensitiveFormData', () => { + it('should filter sensitive data from app form', () => { + const appForm = { + aiSettings: { + model: 'gpt-4', + temperature: 0.8 + }, + dataset: { + datasets: ['sensitive-dataset'], + similarity: 0.9 + }, + selectedTools: [], + chatConfig: {} + }; + + const result = filterSensitiveFormData(appForm); + const defaultForm = getDefaultAppForm(); + + expect(result.dataset).toEqual(defaultForm.dataset); + expect(result.aiSettings).toEqual(appForm.aiSettings); + }); +}); + +describe('getAppQGuideCustomURL', () => { + it('should get custom URL from app detail', () => { + const appDetail = { + modules: [ + { + flowNodeType: FlowNodeTypeEnum.systemConfig, + inputs: [ + { + key: NodeInputKeyEnum.chatInputGuide, + value: { + customUrl: 'https://example.com' + } + } + ] + } + ] + }; + + const result = getAppQGuideCustomURL(appDetail); + expect(result).toBe('https://example.com'); + }); + + it('should return empty string if no custom URL found', () => { + const appDetail = { + modules: [ + { + flowNodeType: FlowNodeTypeEnum.systemConfig, + inputs: [] + } + ] + }; + + const result = getAppQGuideCustomURL(appDetail); + expect(result).toBe(''); + }); +});