mirror of
https://github.com/langgenius/dify.git
synced 2026-04-27 19:27:23 +08:00
179 lines
6.8 KiB
TypeScript
179 lines
6.8 KiB
TypeScript
/**
|
|
* Tests for multimodal image file handling in chat hooks.
|
|
* Tests the file object conversion logic without full hook integration.
|
|
*/
|
|
|
|
describe('Multimodal File Handling', () => {
|
|
describe('File type to MIME type mapping', () => {
|
|
it('should map image to image/png', () => {
|
|
const fileType: string = 'image'
|
|
const expectedMime = 'image/png'
|
|
const mimeType = fileType === 'image' ? 'image/png' : 'application/octet-stream'
|
|
expect(mimeType).toBe(expectedMime)
|
|
})
|
|
|
|
it('should map video to video/mp4', () => {
|
|
const fileType: string = 'video'
|
|
const expectedMime = 'video/mp4'
|
|
const mimeType = fileType === 'video' ? 'video/mp4' : 'application/octet-stream'
|
|
expect(mimeType).toBe(expectedMime)
|
|
})
|
|
|
|
it('should map audio to audio/mpeg', () => {
|
|
const fileType: string = 'audio'
|
|
const expectedMime = 'audio/mpeg'
|
|
const mimeType = fileType === 'audio' ? 'audio/mpeg' : 'application/octet-stream'
|
|
expect(mimeType).toBe(expectedMime)
|
|
})
|
|
|
|
it('should map unknown to application/octet-stream', () => {
|
|
const fileType: string = 'unknown'
|
|
const expectedMime = 'application/octet-stream'
|
|
const mimeType = ['image', 'video', 'audio'].includes(fileType) ? 'image/png' : 'application/octet-stream'
|
|
expect(mimeType).toBe(expectedMime)
|
|
})
|
|
})
|
|
|
|
describe('TransferMethod selection', () => {
|
|
it('should select remote_url for images', () => {
|
|
const fileType: string = 'image'
|
|
const transferMethod = fileType === 'image' ? 'remote_url' : 'local_file'
|
|
expect(transferMethod).toBe('remote_url')
|
|
})
|
|
|
|
it('should select local_file for non-images', () => {
|
|
const fileType: string = 'video'
|
|
const transferMethod = fileType === 'image' ? 'remote_url' : 'local_file'
|
|
expect(transferMethod).toBe('local_file')
|
|
})
|
|
})
|
|
|
|
describe('File extension mapping', () => {
|
|
it('should use .png extension for images', () => {
|
|
const fileType: string = 'image'
|
|
const expectedExtension = '.png'
|
|
const extension = fileType === 'image' ? 'png' : 'bin'
|
|
expect(extension).toBe(expectedExtension.replace('.', ''))
|
|
})
|
|
|
|
it('should use .mp4 extension for videos', () => {
|
|
const fileType: string = 'video'
|
|
const expectedExtension = '.mp4'
|
|
const extension = fileType === 'video' ? 'mp4' : 'bin'
|
|
expect(extension).toBe(expectedExtension.replace('.', ''))
|
|
})
|
|
|
|
it('should use .mp3 extension for audio', () => {
|
|
const fileType: string = 'audio'
|
|
const expectedExtension = '.mp3'
|
|
const extension = fileType === 'audio' ? 'mp3' : 'bin'
|
|
expect(extension).toBe(expectedExtension.replace('.', ''))
|
|
})
|
|
})
|
|
|
|
describe('File name generation', () => {
|
|
it('should generate correct file name for images', () => {
|
|
const fileType: string = 'image'
|
|
const expectedName = 'generated_image.png'
|
|
const fileName = `generated_${fileType}.${fileType === 'image' ? 'png' : 'bin'}`
|
|
expect(fileName).toBe(expectedName)
|
|
})
|
|
|
|
it('should generate correct file name for videos', () => {
|
|
const fileType: string = 'video'
|
|
const expectedName = 'generated_video.mp4'
|
|
const fileName = `generated_${fileType}.${fileType === 'video' ? 'mp4' : 'bin'}`
|
|
expect(fileName).toBe(expectedName)
|
|
})
|
|
|
|
it('should generate correct file name for audio', () => {
|
|
const fileType: string = 'audio'
|
|
const expectedName = 'generated_audio.mp3'
|
|
const fileName = `generated_${fileType}.${fileType === 'audio' ? 'mp3' : 'bin'}`
|
|
expect(fileName).toBe(expectedName)
|
|
})
|
|
})
|
|
|
|
describe('SupportFileType mapping', () => {
|
|
it('should map image type to image supportFileType', () => {
|
|
const fileType: string = 'image'
|
|
const supportFileType = fileType === 'image' ? 'image' : fileType === 'video' ? 'video' : fileType === 'audio' ? 'audio' : 'document'
|
|
expect(supportFileType).toBe('image')
|
|
})
|
|
|
|
it('should map video type to video supportFileType', () => {
|
|
const fileType: string = 'video'
|
|
const supportFileType = fileType === 'image' ? 'image' : fileType === 'video' ? 'video' : fileType === 'audio' ? 'audio' : 'document'
|
|
expect(supportFileType).toBe('video')
|
|
})
|
|
|
|
it('should map audio type to audio supportFileType', () => {
|
|
const fileType: string = 'audio'
|
|
const supportFileType = fileType === 'image' ? 'image' : fileType === 'video' ? 'video' : fileType === 'audio' ? 'audio' : 'document'
|
|
expect(supportFileType).toBe('audio')
|
|
})
|
|
|
|
it('should map unknown type to document supportFileType', () => {
|
|
const fileType: string = 'unknown'
|
|
const supportFileType = fileType === 'image' ? 'image' : fileType === 'video' ? 'video' : fileType === 'audio' ? 'audio' : 'document'
|
|
expect(supportFileType).toBe('document')
|
|
})
|
|
})
|
|
|
|
describe('File conversion logic', () => {
|
|
it('should detect existing transferMethod', () => {
|
|
const fileWithTransferMethod = {
|
|
id: 'file-123',
|
|
transferMethod: 'remote_url' as const,
|
|
type: 'image/png',
|
|
name: 'test.png',
|
|
size: 1024,
|
|
supportFileType: 'image',
|
|
progress: 100,
|
|
}
|
|
const hasTransferMethod = 'transferMethod' in fileWithTransferMethod
|
|
expect(hasTransferMethod).toBe(true)
|
|
})
|
|
|
|
it('should detect missing transferMethod', () => {
|
|
const fileWithoutTransferMethod = {
|
|
id: 'file-456',
|
|
type: 'image',
|
|
url: 'http://example.com/image.png',
|
|
belongs_to: 'assistant',
|
|
}
|
|
const hasTransferMethod = 'transferMethod' in fileWithoutTransferMethod
|
|
expect(hasTransferMethod).toBe(false)
|
|
})
|
|
|
|
it('should create file with size 0 for generated files', () => {
|
|
const expectedSize = 0
|
|
expect(expectedSize).toBe(0)
|
|
})
|
|
})
|
|
|
|
describe('Agent vs Non-Agent mode logic', () => {
|
|
it('should check for agent_thoughts to determine mode', () => {
|
|
const agentResponse: { agent_thoughts?: Array<Record<string, unknown>> } = {
|
|
agent_thoughts: [{}],
|
|
}
|
|
const isAgentMode = agentResponse.agent_thoughts && agentResponse.agent_thoughts.length > 0
|
|
expect(isAgentMode).toBe(true)
|
|
})
|
|
|
|
it('should detect non-agent mode when agent_thoughts is empty', () => {
|
|
const nonAgentResponse: { agent_thoughts?: Array<Record<string, unknown>> } = {
|
|
agent_thoughts: [],
|
|
}
|
|
const isAgentMode = nonAgentResponse.agent_thoughts && nonAgentResponse.agent_thoughts.length > 0
|
|
expect(isAgentMode).toBe(false)
|
|
})
|
|
|
|
it('should detect non-agent mode when agent_thoughts is undefined', () => {
|
|
const nonAgentResponse: { agent_thoughts?: Array<Record<string, unknown>> } = {}
|
|
const isAgentMode = nonAgentResponse.agent_thoughts && nonAgentResponse.agent_thoughts.length > 0
|
|
expect(isAgentMode).toBeFalsy()
|
|
})
|
|
})
|
|
})
|