diff --git a/packages/core/src/binary-data/__tests__/object-store.manager.test.ts b/packages/core/src/binary-data/__tests__/object-store.manager.test.ts index 82ac4ee2168..f7ffe0bc042 100644 --- a/packages/core/src/binary-data/__tests__/object-store.manager.test.ts +++ b/packages/core/src/binary-data/__tests__/object-store.manager.test.ts @@ -26,8 +26,8 @@ const otherFileId = toFileId(otherWorkflowId, otherExecutionId, otherFileUuid); const mockBuffer = Buffer.from('Test data'); const mockStream = toStream(mockBuffer); -beforeAll(() => { - vi.restoreAllMocks(); +beforeEach(() => { + vi.resetAllMocks(); }); describe('store()', () => { @@ -112,14 +112,27 @@ describe('getMetadata()', () => { }); describe('copyByFileId()', () => { - it('should copy by file ID and return the file ID', async () => { + it('should copy by file ID, forwarding source metadata, and return the file ID', async () => { + const mimeType = 'text/plain'; + const fileName = 'file.txt'; + objectStoreService.getMetadata.mockResolvedValue( + mock({ + 'content-length': String(mockBuffer.length), + 'content-type': mimeType, + 'x-amz-meta-filename': fileName, + }), + ); + const targetFileId = await objectStoreManager.copyByFileId( { type: 'execution', workflowId, executionId }, fileId, ); + const lastPutCall = objectStoreService.put.mock.lastCall; expect(targetFileId.startsWith(prefix)).toBe(true); expect(objectStoreService.get).toHaveBeenCalledWith(fileId, { mode: 'buffer' }); + expect(lastPutCall?.[0]).toBe(targetFileId); + expect(lastPutCall?.[2]).toEqual(expect.objectContaining({ mimeType, fileName })); }); }); @@ -143,13 +156,26 @@ describe('copyByFilePath()', () => { }); describe('rename()', () => { - it('should rename a file', async () => { + it('should rename a file, forwarding the original metadata', async () => { + const mimeType = 'text/plain'; + const fileName = 'file.txt'; + objectStoreService.getMetadata.mockResolvedValue( + mock({ + 'content-length': String(mockBuffer.length), + 'content-type': mimeType, + 'x-amz-meta-filename': fileName, + }), + ); + const promise = objectStoreManager.rename(fileId, otherFileId); await expect(promise).resolves.not.toThrow(); + const lastPutCall = objectStoreService.put.mock.lastCall; expect(objectStoreService.get).toHaveBeenCalledWith(fileId, { mode: 'buffer' }); expect(objectStoreService.getMetadata).toHaveBeenCalledWith(fileId); + expect(lastPutCall?.[0]).toBe(otherFileId); + expect(lastPutCall?.[2]).toEqual(expect.objectContaining({ mimeType, fileName })); expect(objectStoreService.deleteOne).toHaveBeenCalledWith(fileId); }); }); diff --git a/packages/core/src/binary-data/object-store.manager.ts b/packages/core/src/binary-data/object-store.manager.ts index 05377e39f3b..12553b7dd6a 100644 --- a/packages/core/src/binary-data/object-store.manager.ts +++ b/packages/core/src/binary-data/object-store.manager.ts @@ -59,8 +59,9 @@ export class ObjectStoreManager implements BinaryData.Manager { const targetFileId = this.toFileId(targetLocation); const sourceFile = await this.objectStoreService.get(sourceFileId, { mode: 'buffer' }); + const sourceMetadata = await this.getMetadata(sourceFileId); - await this.objectStoreService.put(targetFileId, sourceFile); + await this.objectStoreService.put(targetFileId, sourceFile, sourceMetadata); return targetFileId; } @@ -83,7 +84,7 @@ export class ObjectStoreManager implements BinaryData.Manager { async rename(oldFileId: string, newFileId: string) { const oldFile = await this.objectStoreService.get(oldFileId, { mode: 'buffer' }); - const oldFileMetadata = await this.objectStoreService.getMetadata(oldFileId); + const oldFileMetadata = await this.getMetadata(oldFileId); await this.objectStoreService.put(newFileId, oldFile, oldFileMetadata); await this.objectStoreService.deleteOne(oldFileId);