159 lines
5.1 KiB
TypeScript
159 lines
5.1 KiB
TypeScript
/*
|
|
* Copyright 2025 coze-dev Authors
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
|
|
import { describe, expect, it } from 'vitest';
|
|
|
|
import { getFileInfo } from '../src/util';
|
|
import { FileTypeEnum } from '../src/const';
|
|
|
|
// Create a simulated File object
|
|
function createMockFile(name: string, type: string): File {
|
|
return {
|
|
name,
|
|
type,
|
|
size: 1024,
|
|
lastModified: Date.now(),
|
|
slice: () => new Blob(),
|
|
arrayBuffer: () => Promise.resolve(new ArrayBuffer(0)),
|
|
stream: () => new ReadableStream(),
|
|
text: () => Promise.resolve(''),
|
|
} as File;
|
|
}
|
|
|
|
describe('getFileInfo', () => {
|
|
it('应该根据文件类型识别图片文件', () => {
|
|
const file = createMockFile('test.jpg', 'image/jpeg');
|
|
const fileInfo = getFileInfo(file);
|
|
|
|
expect(fileInfo).not.toBeNull();
|
|
expect(fileInfo?.fileType).toBe(FileTypeEnum.IMAGE);
|
|
});
|
|
|
|
it('应该根据文件类型识别音频文件', () => {
|
|
const file = createMockFile('test.mp3', 'audio/mpeg');
|
|
const fileInfo = getFileInfo(file);
|
|
|
|
expect(fileInfo).not.toBeNull();
|
|
expect(fileInfo?.fileType).toBe(FileTypeEnum.AUDIO);
|
|
});
|
|
|
|
it('应该根据文件类型识别视频文件', () => {
|
|
const file = createMockFile('test.mp4', 'video/mp4');
|
|
const fileInfo = getFileInfo(file);
|
|
|
|
expect(fileInfo).not.toBeNull();
|
|
expect(fileInfo?.fileType).toBe(FileTypeEnum.VIDEO);
|
|
});
|
|
|
|
it('应该根据文件扩展名识别 PDF 文件', () => {
|
|
const file = createMockFile('document.pdf', 'application/pdf');
|
|
const fileInfo = getFileInfo(file);
|
|
|
|
expect(fileInfo).not.toBeNull();
|
|
expect(fileInfo?.fileType).toBe(FileTypeEnum.PDF);
|
|
});
|
|
|
|
it('应该根据文件扩展名识别 DOCX 文件', () => {
|
|
const file = createMockFile(
|
|
'document.docx',
|
|
'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
|
|
);
|
|
const fileInfo = getFileInfo(file);
|
|
|
|
expect(fileInfo).not.toBeNull();
|
|
expect(fileInfo?.fileType).toBe(FileTypeEnum.DOCX);
|
|
});
|
|
|
|
it('应该根据文件扩展名识别 EXCEL 文件', () => {
|
|
const file = createMockFile(
|
|
'spreadsheet.xlsx',
|
|
'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
|
|
);
|
|
const fileInfo = getFileInfo(file);
|
|
|
|
expect(fileInfo).not.toBeNull();
|
|
expect(fileInfo?.fileType).toBe(FileTypeEnum.EXCEL);
|
|
});
|
|
|
|
it('应该根据文件扩展名识别 CSV 文件', () => {
|
|
const file = createMockFile('data.csv', 'text/csv');
|
|
const fileInfo = getFileInfo(file);
|
|
|
|
expect(fileInfo).not.toBeNull();
|
|
expect(fileInfo?.fileType).toBe(FileTypeEnum.CSV);
|
|
});
|
|
|
|
it('应该根据文件扩展名识别压缩文件', () => {
|
|
const file = createMockFile('archive.zip', 'application/zip');
|
|
const fileInfo = getFileInfo(file);
|
|
|
|
expect(fileInfo).not.toBeNull();
|
|
expect(fileInfo?.fileType).toBe(FileTypeEnum.ARCHIVE);
|
|
});
|
|
|
|
it('应该根据文件扩展名识别代码文件', () => {
|
|
const file = createMockFile('script.js', 'text/javascript');
|
|
const fileInfo = getFileInfo(file);
|
|
|
|
expect(fileInfo).not.toBeNull();
|
|
expect(fileInfo?.fileType).toBe(FileTypeEnum.CODE);
|
|
});
|
|
|
|
it('应该根据文件扩展名识别文本文件', () => {
|
|
const file = createMockFile('notes.txt', 'text/plain');
|
|
const fileInfo = getFileInfo(file);
|
|
|
|
expect(fileInfo).not.toBeNull();
|
|
expect(fileInfo?.fileType).toBe(FileTypeEnum.TXT);
|
|
});
|
|
|
|
it('应该根据文件扩展名识别 PPT 文件', () => {
|
|
const file = createMockFile(
|
|
'presentation.pptx',
|
|
'application/vnd.openxmlformats-officedocument.presentationml.presentation',
|
|
);
|
|
const fileInfo = getFileInfo(file);
|
|
|
|
expect(fileInfo).not.toBeNull();
|
|
expect(fileInfo?.fileType).toBe(FileTypeEnum.PPT);
|
|
});
|
|
|
|
it('应该对未知文件类型返回默认类型', () => {
|
|
const file = createMockFile('unknown.xyz', 'application/octet-stream');
|
|
const fileInfo = getFileInfo(file);
|
|
|
|
expect(fileInfo).not.toBeNull();
|
|
expect(fileInfo?.fileType).toBe(FileTypeEnum.DEFAULT_UNKNOWN);
|
|
});
|
|
|
|
it('当文件类型和扩展名不匹配时,应该优先使用文件类型判断', () => {
|
|
// The file name is .txt, but the MIME type is image
|
|
const file = createMockFile('image.txt', 'image/jpeg');
|
|
const fileInfo = getFileInfo(file);
|
|
|
|
expect(fileInfo).not.toBeNull();
|
|
expect(fileInfo?.fileType).toBe(FileTypeEnum.IMAGE);
|
|
});
|
|
|
|
it('当文件没有 MIME 类型时,应该使用扩展名判断', () => {
|
|
const file = createMockFile('document.docx', '');
|
|
const fileInfo = getFileInfo(file);
|
|
|
|
expect(fileInfo).not.toBeNull();
|
|
expect(fileInfo?.fileType).toBe(FileTypeEnum.DOCX);
|
|
});
|
|
});
|