|
@@ -1,7 +1,7 @@
|
|
|
import { describe, it, expect, beforeEach, vi, afterEach } from 'vitest';
|
|
import { describe, it, expect, beforeEach, vi, afterEach } from 'vitest';
|
|
|
import { DataSource } from 'typeorm';
|
|
import { DataSource } from 'typeorm';
|
|
|
-import { FileService } from '../../src/services/file.service';
|
|
|
|
|
-import { File } from '../../src/entities/file.entity';
|
|
|
|
|
|
|
+import { FileServiceMt } from '../../src/services/file.service.mt';
|
|
|
|
|
+import { FileMt } from '../../src/entities/file.entity';
|
|
|
import { MinioService } from '../../src/services/minio.service';
|
|
import { MinioService } from '../../src/services/minio.service';
|
|
|
import { logger } from '@d8d/shared-utils';
|
|
import { logger } from '@d8d/shared-utils';
|
|
|
|
|
|
|
@@ -18,7 +18,7 @@ vi.mock('uuid', () => ({
|
|
|
v4: () => 'test-uuid-123'
|
|
v4: () => 'test-uuid-123'
|
|
|
}));
|
|
}));
|
|
|
|
|
|
|
|
-describe('FileService', () => {
|
|
|
|
|
|
|
+describe('FileServiceMt', () => {
|
|
|
let mockDataSource: DataSource;
|
|
let mockDataSource: DataSource;
|
|
|
|
|
|
|
|
beforeEach(() => {
|
|
beforeEach(() => {
|
|
@@ -66,10 +66,10 @@ describe('FileService', () => {
|
|
|
generateUploadPolicy: mockGenerateUploadPolicy
|
|
generateUploadPolicy: mockGenerateUploadPolicy
|
|
|
} as unknown as MinioService));
|
|
} as unknown as MinioService));
|
|
|
|
|
|
|
|
- const fileService = new FileService(mockDataSource);
|
|
|
|
|
|
|
+ const fileService = new FileServiceMt(mockDataSource);
|
|
|
|
|
|
|
|
// Mock GenericCrudService methods
|
|
// Mock GenericCrudService methods
|
|
|
- vi.spyOn(fileService, 'create').mockResolvedValue(mockSavedFile as File);
|
|
|
|
|
|
|
+ vi.spyOn(fileService, 'create').mockResolvedValue(mockSavedFile as FileMt);
|
|
|
|
|
|
|
|
const result = await fileService.createFile(mockFileData);
|
|
const result = await fileService.createFile(mockFileData);
|
|
|
|
|
|
|
@@ -96,7 +96,7 @@ describe('FileService', () => {
|
|
|
generateUploadPolicy: mockGenerateUploadPolicy
|
|
generateUploadPolicy: mockGenerateUploadPolicy
|
|
|
} as unknown as MinioService));
|
|
} as unknown as MinioService));
|
|
|
|
|
|
|
|
- const fileService = new FileService(mockDataSource);
|
|
|
|
|
|
|
+ const fileService = new FileServiceMt(mockDataSource);
|
|
|
|
|
|
|
|
await expect(fileService.createFile(mockFileData)).rejects.toThrow('文件创建失败');
|
|
await expect(fileService.createFile(mockFileData)).rejects.toThrow('文件创建失败');
|
|
|
expect(logger.error).toHaveBeenCalled();
|
|
expect(logger.error).toHaveBeenCalled();
|
|
@@ -109,7 +109,7 @@ describe('FileService', () => {
|
|
|
id: 1,
|
|
id: 1,
|
|
|
path: '1/test-file.txt',
|
|
path: '1/test-file.txt',
|
|
|
name: 'test-file.txt'
|
|
name: 'test-file.txt'
|
|
|
- } as File;
|
|
|
|
|
|
|
+ } as FileMt;
|
|
|
|
|
|
|
|
const mockObjectExists = vi.fn().mockResolvedValue(true);
|
|
const mockObjectExists = vi.fn().mockResolvedValue(true);
|
|
|
const mockDeleteObject = vi.fn().mockResolvedValue(undefined);
|
|
const mockDeleteObject = vi.fn().mockResolvedValue(undefined);
|
|
@@ -120,13 +120,15 @@ describe('FileService', () => {
|
|
|
bucketName: 'd8dai'
|
|
bucketName: 'd8dai'
|
|
|
} as unknown as MinioService));
|
|
} as unknown as MinioService));
|
|
|
|
|
|
|
|
- const fileService = new FileService(mockDataSource);
|
|
|
|
|
- vi.spyOn(fileService, 'getById').mockResolvedValue(mockFile);
|
|
|
|
|
|
|
+ const fileService = new FileServiceMt(mockDataSource);
|
|
|
|
|
+ vi.spyOn(fileService.repository, 'findOne').mockResolvedValue(mockFile);
|
|
|
vi.spyOn(fileService, 'delete').mockResolvedValue(true);
|
|
vi.spyOn(fileService, 'delete').mockResolvedValue(true);
|
|
|
|
|
|
|
|
const result = await fileService.deleteFile(1);
|
|
const result = await fileService.deleteFile(1);
|
|
|
|
|
|
|
|
- expect(fileService.getById).toHaveBeenCalledWith(1);
|
|
|
|
|
|
|
+ expect(fileService.repository.findOne).toHaveBeenCalledWith({
|
|
|
|
|
+ where: { id: 1 }
|
|
|
|
|
+ });
|
|
|
expect(mockObjectExists).toHaveBeenCalledWith('d8dai', '1/test-file.txt');
|
|
expect(mockObjectExists).toHaveBeenCalledWith('d8dai', '1/test-file.txt');
|
|
|
expect(mockDeleteObject).toHaveBeenCalledWith('d8dai', '1/test-file.txt');
|
|
expect(mockDeleteObject).toHaveBeenCalledWith('d8dai', '1/test-file.txt');
|
|
|
expect(fileService.delete).toHaveBeenCalledWith(1);
|
|
expect(fileService.delete).toHaveBeenCalledWith(1);
|
|
@@ -138,7 +140,7 @@ describe('FileService', () => {
|
|
|
id: 1,
|
|
id: 1,
|
|
|
path: '1/test-file.txt',
|
|
path: '1/test-file.txt',
|
|
|
name: 'test-file.txt'
|
|
name: 'test-file.txt'
|
|
|
- } as File;
|
|
|
|
|
|
|
+ } as FileMt;
|
|
|
|
|
|
|
|
const mockObjectExists = vi.fn().mockResolvedValue(false);
|
|
const mockObjectExists = vi.fn().mockResolvedValue(false);
|
|
|
|
|
|
|
@@ -148,12 +150,15 @@ describe('FileService', () => {
|
|
|
bucketName: 'd8dai'
|
|
bucketName: 'd8dai'
|
|
|
} as unknown as MinioService));
|
|
} as unknown as MinioService));
|
|
|
|
|
|
|
|
- const fileService = new FileService(mockDataSource);
|
|
|
|
|
- vi.spyOn(fileService, 'getById').mockResolvedValue(mockFile);
|
|
|
|
|
|
|
+ const fileService = new FileServiceMt(mockDataSource);
|
|
|
|
|
+ vi.spyOn(fileService.repository, 'findOne').mockResolvedValue(mockFile);
|
|
|
vi.spyOn(fileService, 'delete').mockResolvedValue(true);
|
|
vi.spyOn(fileService, 'delete').mockResolvedValue(true);
|
|
|
|
|
|
|
|
const result = await fileService.deleteFile(1);
|
|
const result = await fileService.deleteFile(1);
|
|
|
|
|
|
|
|
|
|
+ expect(fileService.repository.findOne).toHaveBeenCalledWith({
|
|
|
|
|
+ where: { id: 1 }
|
|
|
|
|
+ });
|
|
|
expect(mockObjectExists).toHaveBeenCalledWith('d8dai', '1/test-file.txt');
|
|
expect(mockObjectExists).toHaveBeenCalledWith('d8dai', '1/test-file.txt');
|
|
|
expect(fileService.delete).toHaveBeenCalledWith(1);
|
|
expect(fileService.delete).toHaveBeenCalledWith(1);
|
|
|
expect(result).toBe(true);
|
|
expect(result).toBe(true);
|
|
@@ -161,8 +166,8 @@ describe('FileService', () => {
|
|
|
});
|
|
});
|
|
|
|
|
|
|
|
it('should throw error when file not found', async () => {
|
|
it('should throw error when file not found', async () => {
|
|
|
- const fileService = new FileService(mockDataSource);
|
|
|
|
|
- vi.spyOn(fileService, 'getById').mockResolvedValue(null);
|
|
|
|
|
|
|
+ const fileService = new FileServiceMt(mockDataSource);
|
|
|
|
|
+ vi.spyOn(fileService.repository, 'findOne').mockResolvedValue(null);
|
|
|
|
|
|
|
|
await expect(fileService.deleteFile(999)).rejects.toThrow('文件不存在');
|
|
await expect(fileService.deleteFile(999)).rejects.toThrow('文件不存在');
|
|
|
});
|
|
});
|
|
@@ -173,7 +178,7 @@ describe('FileService', () => {
|
|
|
const mockFile = {
|
|
const mockFile = {
|
|
|
id: 1,
|
|
id: 1,
|
|
|
path: '1/test-file.txt'
|
|
path: '1/test-file.txt'
|
|
|
- } as File;
|
|
|
|
|
|
|
+ } as FileMt;
|
|
|
|
|
|
|
|
const mockPresignedUrl = 'https://minio.example.com/presigned-url';
|
|
const mockPresignedUrl = 'https://minio.example.com/presigned-url';
|
|
|
|
|
|
|
@@ -184,7 +189,7 @@ describe('FileService', () => {
|
|
|
bucketName: 'd8dai'
|
|
bucketName: 'd8dai'
|
|
|
} as unknown as MinioService));
|
|
} as unknown as MinioService));
|
|
|
|
|
|
|
|
- const fileService = new FileService(mockDataSource);
|
|
|
|
|
|
|
+ const fileService = new FileServiceMt(mockDataSource);
|
|
|
vi.spyOn(fileService, 'getById').mockResolvedValue(mockFile);
|
|
vi.spyOn(fileService, 'getById').mockResolvedValue(mockFile);
|
|
|
|
|
|
|
|
const result = await fileService.getFileUrl(1);
|
|
const result = await fileService.getFileUrl(1);
|
|
@@ -195,7 +200,7 @@ describe('FileService', () => {
|
|
|
});
|
|
});
|
|
|
|
|
|
|
|
it('should throw error when file not found', async () => {
|
|
it('should throw error when file not found', async () => {
|
|
|
- const fileService = new FileService(mockDataSource);
|
|
|
|
|
|
|
+ const fileService = new FileServiceMt(mockDataSource);
|
|
|
vi.spyOn(fileService, 'getById').mockResolvedValue(null);
|
|
vi.spyOn(fileService, 'getById').mockResolvedValue(null);
|
|
|
|
|
|
|
|
await expect(fileService.getFileUrl(999)).rejects.toThrow('文件不存在');
|
|
await expect(fileService.getFileUrl(999)).rejects.toThrow('文件不存在');
|
|
@@ -208,7 +213,7 @@ describe('FileService', () => {
|
|
|
id: 1,
|
|
id: 1,
|
|
|
path: '1/test-file.txt',
|
|
path: '1/test-file.txt',
|
|
|
name: '测试文件.txt'
|
|
name: '测试文件.txt'
|
|
|
- } as File;
|
|
|
|
|
|
|
+ } as FileMt;
|
|
|
|
|
|
|
|
const mockPresignedUrl = 'https://minio.example.com/download-url';
|
|
const mockPresignedUrl = 'https://minio.example.com/download-url';
|
|
|
|
|
|
|
@@ -219,7 +224,7 @@ describe('FileService', () => {
|
|
|
bucketName: 'd8dai'
|
|
bucketName: 'd8dai'
|
|
|
} as unknown as MinioService));
|
|
} as unknown as MinioService));
|
|
|
|
|
|
|
|
- const fileService = new FileService(mockDataSource);
|
|
|
|
|
|
|
+ const fileService = new FileServiceMt(mockDataSource);
|
|
|
vi.spyOn(fileService, 'getById').mockResolvedValue(mockFile);
|
|
vi.spyOn(fileService, 'getById').mockResolvedValue(mockFile);
|
|
|
|
|
|
|
|
const result = await fileService.getFileDownloadUrl(1);
|
|
const result = await fileService.getFileDownloadUrl(1);
|
|
@@ -237,7 +242,7 @@ describe('FileService', () => {
|
|
|
});
|
|
});
|
|
|
|
|
|
|
|
it('should throw error when file not found', async () => {
|
|
it('should throw error when file not found', async () => {
|
|
|
- const fileService = new FileService(mockDataSource);
|
|
|
|
|
|
|
+ const fileService = new FileServiceMt(mockDataSource);
|
|
|
vi.spyOn(fileService, 'getById').mockResolvedValue(null);
|
|
vi.spyOn(fileService, 'getById').mockResolvedValue(null);
|
|
|
|
|
|
|
|
await expect(fileService.getFileDownloadUrl(999)).rejects.toThrow('文件不存在');
|
|
await expect(fileService.getFileDownloadUrl(999)).rejects.toThrow('文件不存在');
|
|
@@ -261,7 +266,7 @@ describe('FileService', () => {
|
|
|
uploadTime: new Date(),
|
|
uploadTime: new Date(),
|
|
|
createdAt: new Date(),
|
|
createdAt: new Date(),
|
|
|
updatedAt: new Date()
|
|
updatedAt: new Date()
|
|
|
- } as File;
|
|
|
|
|
|
|
+ } as FileMt;
|
|
|
|
|
|
|
|
const mockCreateMultipartUpload = vi.fn().mockResolvedValue(mockUploadId);
|
|
const mockCreateMultipartUpload = vi.fn().mockResolvedValue(mockUploadId);
|
|
|
const mockGenerateMultipartUploadUrls = vi.fn().mockResolvedValue(mockUploadUrls);
|
|
const mockGenerateMultipartUploadUrls = vi.fn().mockResolvedValue(mockUploadUrls);
|
|
@@ -272,7 +277,7 @@ describe('FileService', () => {
|
|
|
bucketName: 'd8dai'
|
|
bucketName: 'd8dai'
|
|
|
} as unknown as MinioService));
|
|
} as unknown as MinioService));
|
|
|
|
|
|
|
|
- const fileService = new FileService(mockDataSource);
|
|
|
|
|
|
|
+ const fileService = new FileServiceMt(mockDataSource);
|
|
|
vi.spyOn(fileService, 'create').mockResolvedValue(mockSavedFile);
|
|
vi.spyOn(fileService, 'create').mockResolvedValue(mockSavedFile);
|
|
|
|
|
|
|
|
const result = await fileService.createMultipartUploadPolicy(mockFileData, 3);
|
|
const result = await fileService.createMultipartUploadPolicy(mockFileData, 3);
|
|
@@ -306,7 +311,7 @@ describe('FileService', () => {
|
|
|
bucketName: 'd8dai'
|
|
bucketName: 'd8dai'
|
|
|
} as unknown as MinioService));
|
|
} as unknown as MinioService));
|
|
|
|
|
|
|
|
- const fileService = new FileService(mockDataSource);
|
|
|
|
|
|
|
+ const fileService = new FileServiceMt(mockDataSource);
|
|
|
|
|
|
|
|
await expect(fileService.createMultipartUploadPolicy(mockFileData, 3)).rejects.toThrow('创建多部分上传策略失败');
|
|
await expect(fileService.createMultipartUploadPolicy(mockFileData, 3)).rejects.toThrow('创建多部分上传策略失败');
|
|
|
expect(logger.error).toHaveBeenCalled();
|
|
expect(logger.error).toHaveBeenCalled();
|
|
@@ -330,7 +335,7 @@ describe('FileService', () => {
|
|
|
path: '1/test-file.txt',
|
|
path: '1/test-file.txt',
|
|
|
size: 0,
|
|
size: 0,
|
|
|
updatedAt: new Date()
|
|
updatedAt: new Date()
|
|
|
- } as File;
|
|
|
|
|
|
|
+ } as FileMt;
|
|
|
|
|
|
|
|
const mockCompleteResult = { size: 2048 };
|
|
const mockCompleteResult = { size: 2048 };
|
|
|
const mockFileUrl = 'https://minio.example.com/file.txt';
|
|
const mockFileUrl = 'https://minio.example.com/file.txt';
|
|
@@ -345,11 +350,11 @@ describe('FileService', () => {
|
|
|
|
|
|
|
|
const mockRepository = {
|
|
const mockRepository = {
|
|
|
findOneBy: vi.fn().mockResolvedValue(mockFile),
|
|
findOneBy: vi.fn().mockResolvedValue(mockFile),
|
|
|
- save: vi.fn().mockResolvedValue({ ...mockFile, size: 2048 } as File)
|
|
|
|
|
|
|
+ save: vi.fn().mockResolvedValue({ ...mockFile, size: 2048 } as FileMt)
|
|
|
};
|
|
};
|
|
|
|
|
|
|
|
mockDataSource.getRepository = vi.fn().mockReturnValue(mockRepository);
|
|
mockDataSource.getRepository = vi.fn().mockReturnValue(mockRepository);
|
|
|
- const fileService = new FileService(mockDataSource);
|
|
|
|
|
|
|
+ const fileService = new FileServiceMt(mockDataSource);
|
|
|
|
|
|
|
|
const result = await fileService.completeMultipartUpload(uploadData);
|
|
const result = await fileService.completeMultipartUpload(uploadData);
|
|
|
|
|
|
|
@@ -390,7 +395,7 @@ describe('FileService', () => {
|
|
|
};
|
|
};
|
|
|
|
|
|
|
|
mockDataSource.getRepository = vi.fn().mockReturnValue(mockRepository);
|
|
mockDataSource.getRepository = vi.fn().mockReturnValue(mockRepository);
|
|
|
- const fileService = new FileService(mockDataSource);
|
|
|
|
|
|
|
+ const fileService = new FileServiceMt(mockDataSource);
|
|
|
|
|
|
|
|
await expect(fileService.completeMultipartUpload(uploadData)).rejects.toThrow('文件记录不存在');
|
|
await expect(fileService.completeMultipartUpload(uploadData)).rejects.toThrow('文件记录不存在');
|
|
|
});
|
|
});
|
|
@@ -408,7 +413,7 @@ describe('FileService', () => {
|
|
|
path: '1/test-file.txt',
|
|
path: '1/test-file.txt',
|
|
|
size: 0,
|
|
size: 0,
|
|
|
updatedAt: new Date()
|
|
updatedAt: new Date()
|
|
|
- } as File;
|
|
|
|
|
|
|
+ } as FileMt;
|
|
|
|
|
|
|
|
const mockRepository = {
|
|
const mockRepository = {
|
|
|
findOneBy: vi.fn().mockResolvedValue(mockFile),
|
|
findOneBy: vi.fn().mockResolvedValue(mockFile),
|
|
@@ -422,7 +427,7 @@ describe('FileService', () => {
|
|
|
completeMultipartUpload: mockCompleteMultipartUpload
|
|
completeMultipartUpload: mockCompleteMultipartUpload
|
|
|
} as unknown as MinioService));
|
|
} as unknown as MinioService));
|
|
|
|
|
|
|
|
- const fileService = new FileService(mockDataSource);
|
|
|
|
|
|
|
+ const fileService = new FileServiceMt(mockDataSource);
|
|
|
|
|
|
|
|
await expect(fileService.completeMultipartUpload(uploadData)).rejects.toThrow('完成分片上传失败');
|
|
await expect(fileService.completeMultipartUpload(uploadData)).rejects.toThrow('完成分片上传失败');
|
|
|
expect(logger.error).toHaveBeenCalled();
|
|
expect(logger.error).toHaveBeenCalled();
|