@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.
111 lines (94 loc) • 3.68 kB
text/typescript
import { beforeEach, describe, expect, it, vi } from 'vitest';
import { S3StaticFileImpl } from './s3';
const config = {
S3_ENABLE_PATH_STYLE: false,
S3_PUBLIC_DOMAIN: 'https://example.com',
S3_BUCKET: 'my-bucket',
S3_SET_ACL: true,
};
// 模拟 fileEnv
vi.mock('@/config/file', () => ({
get fileEnv() {
return config;
},
}));
// 模拟 S3 类
vi.mock('@/server/modules/S3', () => ({
S3: vi.fn().mockImplementation(() => ({
createPreSignedUrlForPreview: vi
.fn()
.mockResolvedValue('https://presigned.example.com/test.jpg'),
getFileContent: vi.fn().mockResolvedValue('file content'),
getFileByteArray: vi.fn().mockResolvedValue(new Uint8Array([1, 2, 3])),
deleteFile: vi.fn().mockResolvedValue({}),
deleteFiles: vi.fn().mockResolvedValue({}),
createPreSignedUrl: vi.fn().mockResolvedValue('https://upload.example.com/test.jpg'),
uploadContent: vi.fn().mockResolvedValue({}),
})),
}));
describe('S3StaticFileImpl', () => {
let fileService: S3StaticFileImpl;
beforeEach(() => {
fileService = new S3StaticFileImpl();
});
describe('getFullFileUrl', () => {
it('should return empty string for null or undefined input', async () => {
expect(await fileService.getFullFileUrl(null)).toBe('');
expect(await fileService.getFullFileUrl(undefined)).toBe('');
});
it('当S3_SET_ACL为false时应返回预签名URL', async () => {
config.S3_SET_ACL = false;
const url = 'path/to/file.jpg';
expect(await fileService.getFullFileUrl(url)).toBe('https://presigned.example.com/test.jpg');
config.S3_SET_ACL = true;
});
it('should return correct URL when S3_ENABLE_PATH_STYLE is false', async () => {
const url = 'path/to/file.jpg';
expect(await fileService.getFullFileUrl(url)).toBe('https://example.com/path/to/file.jpg');
});
it('should return correct URL when S3_ENABLE_PATH_STYLE is true', async () => {
config.S3_ENABLE_PATH_STYLE = true;
const url = 'path/to/file.jpg';
expect(await fileService.getFullFileUrl(url)).toBe(
'https://example.com/my-bucket/path/to/file.jpg',
);
config.S3_ENABLE_PATH_STYLE = false;
});
});
describe('getFileContent', () => {
it('应该返回文件内容', async () => {
expect(await fileService.getFileContent('test.txt')).toBe('file content');
});
});
describe('getFileByteArray', () => {
it('应该返回文件字节数组', async () => {
const result = await fileService.getFileByteArray('test.jpg');
expect(result).toBeInstanceOf(Uint8Array);
expect(result.length).toBe(3);
});
});
describe('deleteFile', () => {
it('应该调用S3的deleteFile方法', async () => {
await fileService.deleteFile('test.jpg');
expect(fileService['s3'].deleteFile).toHaveBeenCalledWith('test.jpg');
});
});
describe('deleteFiles', () => {
it('应该调用S3的deleteFiles方法', async () => {
await fileService.deleteFiles(['test1.jpg', 'test2.jpg']);
expect(fileService['s3'].deleteFiles).toHaveBeenCalledWith(['test1.jpg', 'test2.jpg']);
});
});
describe('createPreSignedUrl', () => {
it('应该调用S3的createPreSignedUrl方法', async () => {
const result = await fileService.createPreSignedUrl('test.jpg');
expect(result).toBe('https://upload.example.com/test.jpg');
});
});
describe('uploadContent', () => {
it('应该调用S3的uploadContent方法', async () => {
await fileService.uploadContent('test.jpg', 'content');
expect(fileService['s3'].uploadContent).toHaveBeenCalledWith('test.jpg', 'content');
});
});
});