| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855 |
- import mime from 'mime'
- import { upload } from '@/service/base'
- import {
- downloadFile,
- fileIsUploaded,
- fileUpload,
- getFileAppearanceType,
- getFileExtension,
- getFileNameFromUrl,
- getFilesInLogs,
- getProcessedFiles,
- getProcessedFilesFromResponse,
- getSupportFileExtensionList,
- getSupportFileType,
- isAllowedFileExtension,
- } from './utils'
- import { FileAppearanceTypeEnum } from './types'
- import { SupportUploadFileTypes } from '@/app/components/workflow/types'
- import { TransferMethod } from '@/types/app'
- import { FILE_EXTS } from '../prompt-editor/constants'
-
- jest.mock('mime', () => ({
- __esModule: true,
- default: {
- getAllExtensions: jest.fn(),
- },
- }))
-
- jest.mock('@/service/base', () => ({
- upload: jest.fn(),
- }))
-
- describe('file-uploader utils', () => {
- beforeEach(() => {
- jest.clearAllMocks()
- })
-
- describe('fileUpload', () => {
- it('should handle successful file upload', () => {
- const mockFile = new File(['test'], 'test.txt')
- const mockCallbacks = {
- onProgressCallback: jest.fn(),
- onSuccessCallback: jest.fn(),
- onErrorCallback: jest.fn(),
- }
-
- jest.mocked(upload).mockResolvedValue({ id: '123' })
-
- fileUpload({
- file: mockFile,
- ...mockCallbacks,
- })
-
- expect(upload).toHaveBeenCalled()
- })
- })
-
- describe('getFileExtension', () => {
- it('should get extension from mimetype', () => {
- jest.mocked(mime.getAllExtensions).mockReturnValue(new Set(['pdf']))
- expect(getFileExtension('file', 'application/pdf')).toBe('pdf')
- })
-
- it('should get extension from mimetype and file name 1', () => {
- jest.mocked(mime.getAllExtensions).mockReturnValue(new Set(['pdf']))
- expect(getFileExtension('file.pdf', 'application/pdf')).toBe('pdf')
- })
-
- it('should get extension from mimetype with multiple ext candidates with filename hint', () => {
- jest.mocked(mime.getAllExtensions).mockReturnValue(new Set(['der', 'crt', 'pem']))
- expect(getFileExtension('file.pem', 'application/x-x509-ca-cert')).toBe('pem')
- })
-
- it('should get extension from mimetype with multiple ext candidates without filename hint', () => {
- jest.mocked(mime.getAllExtensions).mockReturnValue(new Set(['der', 'crt', 'pem']))
- expect(getFileExtension('file', 'application/x-x509-ca-cert')).toBe('der')
- })
-
- it('should get extension from filename if mimetype fails', () => {
- jest.mocked(mime.getAllExtensions).mockReturnValue(null)
- expect(getFileExtension('file.txt', '')).toBe('txt')
- expect(getFileExtension('file.txt.docx', '')).toBe('docx')
- expect(getFileExtension('file', '')).toBe('')
- })
-
- it('should return empty string for remote files', () => {
- expect(getFileExtension('file.txt', '', true)).toBe('')
- })
- })
-
- describe('getFileAppearanceType', () => {
- it('should identify gif files', () => {
- jest.mocked(mime.getAllExtensions).mockReturnValue(new Set(['gif']))
- expect(getFileAppearanceType('image.gif', 'image/gif'))
- .toBe(FileAppearanceTypeEnum.gif)
- })
-
- it('should identify image files', () => {
- jest.mocked(mime.getAllExtensions).mockReturnValue(new Set(['jpg']))
- expect(getFileAppearanceType('image.jpg', 'image/jpeg'))
- .toBe(FileAppearanceTypeEnum.image)
-
- jest.mocked(mime.getAllExtensions).mockReturnValue(new Set(['jpeg']))
- expect(getFileAppearanceType('image.jpeg', 'image/jpeg'))
- .toBe(FileAppearanceTypeEnum.image)
-
- jest.mocked(mime.getAllExtensions).mockReturnValue(new Set(['png']))
- expect(getFileAppearanceType('image.png', 'image/png'))
- .toBe(FileAppearanceTypeEnum.image)
-
- jest.mocked(mime.getAllExtensions).mockReturnValue(new Set(['webp']))
- expect(getFileAppearanceType('image.webp', 'image/webp'))
- .toBe(FileAppearanceTypeEnum.image)
-
- jest.mocked(mime.getAllExtensions).mockReturnValue(new Set(['svg']))
- expect(getFileAppearanceType('image.svg', 'image/svgxml'))
- .toBe(FileAppearanceTypeEnum.image)
- })
-
- it('should identify video files', () => {
- jest.mocked(mime.getAllExtensions).mockReturnValue(new Set(['mp4']))
- expect(getFileAppearanceType('video.mp4', 'video/mp4'))
- .toBe(FileAppearanceTypeEnum.video)
-
- jest.mocked(mime.getAllExtensions).mockReturnValue(new Set(['mov']))
- expect(getFileAppearanceType('video.mov', 'video/quicktime'))
- .toBe(FileAppearanceTypeEnum.video)
-
- jest.mocked(mime.getAllExtensions).mockReturnValue(new Set(['mpeg']))
- expect(getFileAppearanceType('video.mpeg', 'video/mpeg'))
- .toBe(FileAppearanceTypeEnum.video)
-
- jest.mocked(mime.getAllExtensions).mockReturnValue(new Set(['webm']))
- expect(getFileAppearanceType('video.web', 'video/webm'))
- .toBe(FileAppearanceTypeEnum.video)
- })
-
- it('should identify audio files', () => {
- jest.mocked(mime.getAllExtensions).mockReturnValue(new Set(['mp3']))
- expect(getFileAppearanceType('audio.mp3', 'audio/mpeg'))
- .toBe(FileAppearanceTypeEnum.audio)
-
- jest.mocked(mime.getAllExtensions).mockReturnValue(new Set(['m4a']))
- expect(getFileAppearanceType('audio.m4a', 'audio/mp4'))
- .toBe(FileAppearanceTypeEnum.audio)
-
- jest.mocked(mime.getAllExtensions).mockReturnValue(new Set(['wav']))
- expect(getFileAppearanceType('audio.wav', 'audio/vnd.wav'))
- .toBe(FileAppearanceTypeEnum.audio)
-
- jest.mocked(mime.getAllExtensions).mockReturnValue(new Set(['amr']))
- expect(getFileAppearanceType('audio.amr', 'audio/AMR'))
- .toBe(FileAppearanceTypeEnum.audio)
-
- jest.mocked(mime.getAllExtensions).mockReturnValue(new Set(['mpga']))
- expect(getFileAppearanceType('audio.mpga', 'audio/mpeg'))
- .toBe(FileAppearanceTypeEnum.audio)
- })
-
- it('should identify code files', () => {
- jest.mocked(mime.getAllExtensions).mockReturnValue(new Set(['html']))
- expect(getFileAppearanceType('index.html', 'text/html'))
- .toBe(FileAppearanceTypeEnum.code)
- })
-
- it('should identify PDF files', () => {
- jest.mocked(mime.getAllExtensions).mockReturnValue(new Set(['pdf']))
- expect(getFileAppearanceType('doc.pdf', 'application/pdf'))
- .toBe(FileAppearanceTypeEnum.pdf)
- })
-
- it('should identify markdown files', () => {
- jest.mocked(mime.getAllExtensions).mockReturnValue(new Set(['md']))
- expect(getFileAppearanceType('file.md', 'text/markdown'))
- .toBe(FileAppearanceTypeEnum.markdown)
-
- jest.mocked(mime.getAllExtensions).mockReturnValue(new Set(['markdown']))
- expect(getFileAppearanceType('file.markdown', 'text/markdown'))
- .toBe(FileAppearanceTypeEnum.markdown)
-
- jest.mocked(mime.getAllExtensions).mockReturnValue(new Set(['mdx']))
- expect(getFileAppearanceType('file.mdx', 'text/mdx'))
- .toBe(FileAppearanceTypeEnum.markdown)
- })
-
- it('should identify excel files', () => {
- jest.mocked(mime.getAllExtensions).mockReturnValue(new Set(['xlsx']))
- expect(getFileAppearanceType('doc.xlsx', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'))
- .toBe(FileAppearanceTypeEnum.excel)
-
- jest.mocked(mime.getAllExtensions).mockReturnValue(new Set(['xls']))
- expect(getFileAppearanceType('doc.xls', 'application/vnd.ms-excel'))
- .toBe(FileAppearanceTypeEnum.excel)
- })
-
- it('should identify word files', () => {
- jest.mocked(mime.getAllExtensions).mockReturnValue(new Set(['doc']))
- expect(getFileAppearanceType('doc.doc', 'application/msword'))
- .toBe(FileAppearanceTypeEnum.word)
-
- jest.mocked(mime.getAllExtensions).mockReturnValue(new Set(['docx']))
- expect(getFileAppearanceType('doc.docx', 'application/vnd.openxmlformats-officedocument.wordprocessingml.document'))
- .toBe(FileAppearanceTypeEnum.word)
- })
-
- it('should identify word files', () => {
- jest.mocked(mime.getAllExtensions).mockReturnValue(new Set(['ppt']))
- expect(getFileAppearanceType('doc.ppt', 'application/vnd.ms-powerpoint'))
- .toBe(FileAppearanceTypeEnum.ppt)
-
- jest.mocked(mime.getAllExtensions).mockReturnValue(new Set(['pptx']))
- expect(getFileAppearanceType('doc.pptx', 'application/vnd.openxmlformats-officedocument.presentationml.presentation'))
- .toBe(FileAppearanceTypeEnum.ppt)
- })
-
- it('should identify document files', () => {
- jest.mocked(mime.getAllExtensions).mockReturnValue(new Set(['txt']))
- expect(getFileAppearanceType('file.txt', 'text/plain'))
- .toBe(FileAppearanceTypeEnum.document)
-
- jest.mocked(mime.getAllExtensions).mockReturnValue(new Set(['csv']))
- expect(getFileAppearanceType('file.csv', 'text/csv'))
- .toBe(FileAppearanceTypeEnum.document)
-
- jest.mocked(mime.getAllExtensions).mockReturnValue(new Set(['msg']))
- expect(getFileAppearanceType('file.msg', 'application/vnd.ms-outlook'))
- .toBe(FileAppearanceTypeEnum.document)
-
- jest.mocked(mime.getAllExtensions).mockReturnValue(new Set(['eml']))
- expect(getFileAppearanceType('file.eml', 'message/rfc822'))
- .toBe(FileAppearanceTypeEnum.document)
-
- jest.mocked(mime.getAllExtensions).mockReturnValue(new Set(['xml']))
- expect(getFileAppearanceType('file.xml', 'application/rssxml'))
- .toBe(FileAppearanceTypeEnum.document)
-
- jest.mocked(mime.getAllExtensions).mockReturnValue(new Set(['epub']))
- expect(getFileAppearanceType('file.epub', 'application/epubzip'))
- .toBe(FileAppearanceTypeEnum.document)
- })
-
- it('should handle null mime extension', () => {
- jest.mocked(mime.getAllExtensions).mockReturnValue(null)
- expect(getFileAppearanceType('file.txt', 'text/plain'))
- .toBe(FileAppearanceTypeEnum.document)
- })
- })
-
- describe('getSupportFileType', () => {
- it('should return custom type when isCustom is true', () => {
- expect(getSupportFileType('file.txt', '', true))
- .toBe(SupportUploadFileTypes.custom)
- })
-
- it('should return file type when isCustom is false', () => {
- expect(getSupportFileType('file.txt', 'text/plain'))
- .toBe(SupportUploadFileTypes.document)
- })
- })
-
- describe('getProcessedFiles', () => {
- it('should process files correctly', () => {
- const files = [{
- id: '123',
- name: 'test.txt',
- size: 1024,
- type: 'text/plain',
- progress: 100,
- supportFileType: 'document',
- transferMethod: TransferMethod.remote_url,
- url: 'http://example.com',
- uploadedId: '123',
- }]
-
- const result = getProcessedFiles(files)
- expect(result[0]).toEqual({
- type: 'document',
- transfer_method: TransferMethod.remote_url,
- url: 'http://example.com',
- upload_file_id: '123',
- })
- })
- })
-
- describe('getProcessedFilesFromResponse', () => {
- beforeEach(() => {
- jest.mocked(mime.getAllExtensions).mockImplementation((mimeType: string) => {
- const mimeMap: Record<string, Set<string>> = {
- 'image/jpeg': new Set(['jpg', 'jpeg']),
- 'image/png': new Set(['png']),
- 'image/gif': new Set(['gif']),
- 'video/mp4': new Set(['mp4']),
- 'audio/mp3': new Set(['mp3']),
- 'application/pdf': new Set(['pdf']),
- 'text/plain': new Set(['txt']),
- 'application/json': new Set(['json']),
- }
- return mimeMap[mimeType] || new Set()
- })
- })
-
- it('should process files correctly without type correction', () => {
- const files = [{
- related_id: '2a38e2ca-1295-415d-a51d-65d4ff9912d9',
- extension: '.jpeg',
- filename: 'test.jpeg',
- size: 2881761,
- mime_type: 'image/jpeg',
- transfer_method: TransferMethod.local_file,
- type: 'image',
- url: 'https://upload.dify.dev/files/xxx/file-preview',
- upload_file_id: '2a38e2ca-1295-415d-a51d-65d4ff9912d9',
- remote_url: '',
- }]
-
- const result = getProcessedFilesFromResponse(files)
- expect(result[0]).toEqual({
- id: '2a38e2ca-1295-415d-a51d-65d4ff9912d9',
- name: 'test.jpeg',
- size: 2881761,
- type: 'image/jpeg',
- progress: 100,
- transferMethod: TransferMethod.local_file,
- supportFileType: 'image',
- uploadedId: '2a38e2ca-1295-415d-a51d-65d4ff9912d9',
- url: 'https://upload.dify.dev/files/xxx/file-preview',
- })
- })
-
- it('should correct image file misclassified as document', () => {
- const files = [{
- related_id: '123',
- extension: '.jpg',
- filename: 'image.jpg',
- size: 1024,
- mime_type: 'image/jpeg',
- transfer_method: TransferMethod.local_file,
- type: 'document',
- url: 'https://example.com/image.jpg',
- upload_file_id: '123',
- remote_url: '',
- }]
-
- const result = getProcessedFilesFromResponse(files)
- expect(result[0].supportFileType).toBe('image')
- })
-
- it('should correct video file misclassified as document', () => {
- const files = [{
- related_id: '123',
- extension: '.mp4',
- filename: 'video.mp4',
- size: 1024,
- mime_type: 'video/mp4',
- transfer_method: TransferMethod.local_file,
- type: 'document',
- url: 'https://example.com/video.mp4',
- upload_file_id: '123',
- remote_url: '',
- }]
-
- const result = getProcessedFilesFromResponse(files)
- expect(result[0].supportFileType).toBe('video')
- })
-
- it('should correct audio file misclassified as document', () => {
- const files = [{
- related_id: '123',
- extension: '.mp3',
- filename: 'audio.mp3',
- size: 1024,
- mime_type: 'audio/mp3',
- transfer_method: TransferMethod.local_file,
- type: 'document',
- url: 'https://example.com/audio.mp3',
- upload_file_id: '123',
- remote_url: '',
- }]
-
- const result = getProcessedFilesFromResponse(files)
- expect(result[0].supportFileType).toBe('audio')
- })
-
- it('should correct document file misclassified as image', () => {
- const files = [{
- related_id: '123',
- extension: '.pdf',
- filename: 'document.pdf',
- size: 1024,
- mime_type: 'application/pdf',
- transfer_method: TransferMethod.local_file,
- type: 'image',
- url: 'https://example.com/document.pdf',
- upload_file_id: '123',
- remote_url: '',
- }]
-
- const result = getProcessedFilesFromResponse(files)
- expect(result[0].supportFileType).toBe('document')
- })
-
- it('should NOT correct when filename and MIME type conflict', () => {
- const files = [{
- related_id: '123',
- extension: '.pdf',
- filename: 'document.pdf',
- size: 1024,
- mime_type: 'image/jpeg',
- transfer_method: TransferMethod.local_file,
- type: 'document',
- url: 'https://example.com/document.pdf',
- upload_file_id: '123',
- remote_url: '',
- }]
-
- const result = getProcessedFilesFromResponse(files)
- expect(result[0].supportFileType).toBe('document')
- })
-
- it('should NOT correct when filename and MIME type both point to wrong type', () => {
- const files = [{
- related_id: '123',
- extension: '.jpg',
- filename: 'image.jpg',
- size: 1024,
- mime_type: 'image/jpeg',
- transfer_method: TransferMethod.local_file,
- type: 'image',
- url: 'https://example.com/image.jpg',
- upload_file_id: '123',
- remote_url: '',
- }]
-
- const result = getProcessedFilesFromResponse(files)
- expect(result[0].supportFileType).toBe('image')
- })
-
- it('should handle files with missing filename', () => {
- const files = [{
- related_id: '123',
- extension: '',
- filename: '',
- size: 1024,
- mime_type: 'image/jpeg',
- transfer_method: TransferMethod.local_file,
- type: 'document',
- url: 'https://example.com/file',
- upload_file_id: '123',
- remote_url: '',
- }]
-
- const result = getProcessedFilesFromResponse(files)
- expect(result[0].supportFileType).toBe('document')
- })
-
- it('should handle files with missing MIME type', () => {
- const files = [{
- related_id: '123',
- extension: '.jpg',
- filename: 'image.jpg',
- size: 1024,
- mime_type: '',
- transfer_method: TransferMethod.local_file,
- type: 'document',
- url: 'https://example.com/image.jpg',
- upload_file_id: '123',
- remote_url: '',
- }]
-
- const result = getProcessedFilesFromResponse(files)
- expect(result[0].supportFileType).toBe('document')
- })
-
- it('should handle files with unknown extensions', () => {
- const files = [{
- related_id: '123',
- extension: '.unknown',
- filename: 'file.unknown',
- size: 1024,
- mime_type: 'application/unknown',
- transfer_method: TransferMethod.local_file,
- type: 'document',
- url: 'https://example.com/file.unknown',
- upload_file_id: '123',
- remote_url: '',
- }]
-
- const result = getProcessedFilesFromResponse(files)
- expect(result[0].supportFileType).toBe('document')
- })
-
- it('should handle multiple different file types correctly', () => {
- const files = [
- {
- related_id: '1',
- extension: '.jpg',
- filename: 'correct-image.jpg',
- mime_type: 'image/jpeg',
- type: 'image',
- size: 1024,
- transfer_method: TransferMethod.local_file,
- url: 'https://example.com/correct-image.jpg',
- upload_file_id: '1',
- remote_url: '',
- },
- {
- related_id: '2',
- extension: '.png',
- filename: 'misclassified-image.png',
- mime_type: 'image/png',
- type: 'document',
- size: 2048,
- transfer_method: TransferMethod.local_file,
- url: 'https://example.com/misclassified-image.png',
- upload_file_id: '2',
- remote_url: '',
- },
- {
- related_id: '3',
- extension: '.pdf',
- filename: 'conflicted.pdf',
- mime_type: 'image/jpeg',
- type: 'document',
- size: 3072,
- transfer_method: TransferMethod.local_file,
- url: 'https://example.com/conflicted.pdf',
- upload_file_id: '3',
- remote_url: '',
- },
- ]
-
- const result = getProcessedFilesFromResponse(files)
-
- expect(result[0].supportFileType).toBe('image') // correct, no change
- expect(result[1].supportFileType).toBe('image') // corrected from document to image
- expect(result[2].supportFileType).toBe('document') // conflict, no change
- })
- })
-
- describe('getFileNameFromUrl', () => {
- it('should extract filename from URL', () => {
- expect(getFileNameFromUrl('http://example.com/path/file.txt'))
- .toBe('file.txt')
- })
- })
-
- describe('getSupportFileExtensionList', () => {
- it('should handle custom file types', () => {
- const result = getSupportFileExtensionList(
- [SupportUploadFileTypes.custom],
- ['.pdf', '.txt', '.doc'],
- )
- expect(result).toEqual(['PDF', 'TXT', 'DOC'])
- })
-
- it('should handle standard file types', () => {
- const mockFileExts = {
- image: ['JPG', 'PNG'],
- document: ['PDF', 'TXT'],
- video: ['MP4', 'MOV'],
- }
-
- // Temporarily mock FILE_EXTS
- const originalFileExts = { ...FILE_EXTS }
- Object.assign(FILE_EXTS, mockFileExts)
-
- const result = getSupportFileExtensionList(
- ['image', 'document'],
- [],
- )
- expect(result).toEqual(['JPG', 'PNG', 'PDF', 'TXT'])
-
- // Restore original FILE_EXTS
- Object.assign(FILE_EXTS, originalFileExts)
- })
-
- it('should return empty array for empty inputs', () => {
- const result = getSupportFileExtensionList([], [])
- expect(result).toEqual([])
- })
-
- it('should prioritize custom types over standard types', () => {
- const mockFileExts = {
- image: ['JPG', 'PNG'],
- }
-
- // Temporarily mock FILE_EXTS
- const originalFileExts = { ...FILE_EXTS }
- Object.assign(FILE_EXTS, mockFileExts)
-
- const result = getSupportFileExtensionList(
- [SupportUploadFileTypes.custom, 'image'],
- ['.csv', '.xml'],
- )
- expect(result).toEqual(['CSV', 'XML'])
-
- // Restore original FILE_EXTS
- Object.assign(FILE_EXTS, originalFileExts)
- })
- })
-
- describe('isAllowedFileExtension', () => {
- it('should validate allowed file extensions', () => {
- jest.mocked(mime.getAllExtensions).mockReturnValue(new Set(['pdf']))
- expect(isAllowedFileExtension(
- 'test.pdf',
- 'application/pdf',
- ['document'],
- ['.pdf'],
- )).toBe(true)
- })
- })
-
- describe('getFilesInLogs', () => {
- const mockFileData = {
- dify_model_identity: '__dify__file__',
- related_id: '123',
- filename: 'test.pdf',
- size: 1024,
- mime_type: 'application/pdf',
- transfer_method: 'local_file',
- type: 'document',
- url: 'http://example.com/test.pdf',
- }
-
- it('should handle empty or null input', () => {
- expect(getFilesInLogs(null)).toEqual([])
- expect(getFilesInLogs({})).toEqual([])
- expect(getFilesInLogs(undefined)).toEqual([])
- })
-
- it('should process single file object', () => {
- const input = {
- file1: mockFileData,
- }
-
- const expected = [{
- varName: 'file1',
- list: [{
- id: '123',
- name: 'test.pdf',
- size: 1024,
- type: 'application/pdf',
- progress: 100,
- transferMethod: 'local_file',
- supportFileType: 'document',
- uploadedId: '123',
- url: 'http://example.com/test.pdf',
- }],
- }]
-
- expect(getFilesInLogs(input)).toEqual(expected)
- })
-
- it('should process array of files', () => {
- const input = {
- files: [mockFileData, mockFileData],
- }
-
- const expected = [{
- varName: 'files',
- list: [
- {
- id: '123',
- name: 'test.pdf',
- size: 1024,
- type: 'application/pdf',
- progress: 100,
- transferMethod: 'local_file',
- supportFileType: 'document',
- uploadedId: '123',
- url: 'http://example.com/test.pdf',
- },
- {
- id: '123',
- name: 'test.pdf',
- size: 1024,
- type: 'application/pdf',
- progress: 100,
- transferMethod: 'local_file',
- supportFileType: 'document',
- uploadedId: '123',
- url: 'http://example.com/test.pdf',
- },
- ],
- }]
-
- expect(getFilesInLogs(input)).toEqual(expected)
- })
-
- it('should ignore non-file objects and arrays', () => {
- const input = {
- regularString: 'not a file',
- regularNumber: 123,
- regularArray: [1, 2, 3],
- regularObject: { key: 'value' },
- file: mockFileData,
- }
-
- const expected = [{
- varName: 'file',
- list: [{
- id: '123',
- name: 'test.pdf',
- size: 1024,
- type: 'application/pdf',
- progress: 100,
- transferMethod: 'local_file',
- supportFileType: 'document',
- uploadedId: '123',
- url: 'http://example.com/test.pdf',
- }],
- }]
-
- expect(getFilesInLogs(input)).toEqual(expected)
- })
-
- it('should handle mixed file types in array', () => {
- const input = {
- mixedFiles: [
- mockFileData,
- { notAFile: true },
- mockFileData,
- ],
- }
-
- const expected = [{
- varName: 'mixedFiles',
- list: [
- {
- id: '123',
- name: 'test.pdf',
- size: 1024,
- type: 'application/pdf',
- progress: 100,
- transferMethod: 'local_file',
- supportFileType: 'document',
- uploadedId: '123',
- url: 'http://example.com/test.pdf',
- },
- {
- id: undefined,
- name: undefined,
- progress: 100,
- size: 0,
- supportFileType: undefined,
- transferMethod: undefined,
- type: undefined,
- uploadedId: undefined,
- url: undefined,
- },
- {
- id: '123',
- name: 'test.pdf',
- size: 1024,
- type: 'application/pdf',
- progress: 100,
- transferMethod: 'local_file',
- supportFileType: 'document',
- uploadedId: '123',
- url: 'http://example.com/test.pdf',
- },
- ],
- }]
-
- expect(getFilesInLogs(input)).toEqual(expected)
- })
- })
-
- describe('fileIsUploaded', () => {
- it('should identify uploaded files', () => {
- expect(fileIsUploaded({
- uploadedId: '123',
- progress: 100,
- } as any)).toBe(true)
- })
-
- it('should identify remote files as uploaded', () => {
- expect(fileIsUploaded({
- transferMethod: TransferMethod.remote_url,
- progress: 100,
- } as any)).toBe(true)
- })
- })
-
- describe('downloadFile', () => {
- let mockAnchor: HTMLAnchorElement
- let createElementMock: jest.SpyInstance
- let appendChildMock: jest.SpyInstance
- let removeChildMock: jest.SpyInstance
-
- beforeEach(() => {
- // Mock createElement and appendChild
- mockAnchor = {
- href: '',
- download: '',
- style: { display: '' },
- target: '',
- title: '',
- click: jest.fn(),
- } as unknown as HTMLAnchorElement
-
- createElementMock = jest.spyOn(document, 'createElement').mockReturnValue(mockAnchor as any)
- appendChildMock = jest.spyOn(document.body, 'appendChild').mockImplementation((node: Node) => {
- return node
- })
- removeChildMock = jest.spyOn(document.body, 'removeChild').mockImplementation((node: Node) => {
- return node
- })
- })
-
- afterEach(() => {
- jest.resetAllMocks()
- })
-
- it('should create and trigger download with correct attributes', () => {
- const url = 'https://example.com/test.pdf'
- const filename = 'test.pdf'
-
- downloadFile(url, filename)
-
- // Verify anchor element was created with correct properties
- expect(createElementMock).toHaveBeenCalledWith('a')
- expect(mockAnchor.href).toBe(url)
- expect(mockAnchor.download).toBe(filename)
- expect(mockAnchor.style.display).toBe('none')
- expect(mockAnchor.target).toBe('_blank')
- expect(mockAnchor.title).toBe(filename)
-
- // Verify DOM operations
- expect(appendChildMock).toHaveBeenCalledWith(mockAnchor)
- expect(mockAnchor.click).toHaveBeenCalled()
- expect(removeChildMock).toHaveBeenCalledWith(mockAnchor)
- })
-
- it('should handle empty filename', () => {
- const url = 'https://example.com/test.pdf'
- const filename = ''
-
- downloadFile(url, filename)
-
- expect(mockAnchor.download).toBe('')
- expect(mockAnchor.title).toBe('')
- })
-
- it('should handle empty url', () => {
- const url = ''
- const filename = 'test.pdf'
-
- downloadFile(url, filename)
-
- expect(mockAnchor.href).toBe('')
- })
- })
- })
|