33 */
44import { beforeEach , describe , expect , it , vi } from 'vitest'
55
6- const { mockDownloadFile } = vi . hoisted ( ( ) => ( {
7- mockDownloadFile : vi . fn ( ) ,
8- } ) )
6+ const { mockDownloadFile, mockParseWorkspaceFileKey, mockResolveServableDocBytes } = vi . hoisted (
7+ ( ) => ( {
8+ mockDownloadFile : vi . fn ( ) ,
9+ mockParseWorkspaceFileKey : vi . fn ( ) ,
10+ mockResolveServableDocBytes : vi . fn ( ) ,
11+ } )
12+ )
913
1014vi . mock ( '@/lib/uploads/core/storage-service' , ( ) => ( {
1115 downloadFile : mockDownloadFile ,
1216 hasCloudStorage : vi . fn ( ( ) => true ) ,
1317} ) )
1418
19+ vi . mock ( '@/lib/uploads/contexts/execution/execution-file-manager' , ( ) => ( {
20+ downloadExecutionFile : mockDownloadFile ,
21+ } ) )
22+
23+ vi . mock ( '@/lib/uploads/contexts/workspace/workspace-file-manager' , ( ) => ( {
24+ parseWorkspaceFileKey : mockParseWorkspaceFileKey ,
25+ } ) )
26+
27+ vi . mock ( '@/lib/copilot/tools/server/files/doc-compile' , ( ) => ( {
28+ resolveServableDocBytes : mockResolveServableDocBytes ,
29+ } ) )
30+
1531vi . mock ( '@/app/api/files/authorization' , ( ) => ( {
1632 verifyFileAccess : vi . fn ( ) ,
1733} ) )
1834
1935import { createLogger } from '@sim/logger'
20- import { downloadFileFromStorage } from '@/lib/uploads/utils/file-utils.server'
36+ import {
37+ downloadFileFromStorage ,
38+ downloadServableFileFromStorage ,
39+ } from '@/lib/uploads/utils/file-utils.server'
2140import type { UserFile } from '@/executor/types'
2241
2342describe ( 'downloadFileFromStorage context derivation' , ( ) => {
2443 beforeEach ( ( ) => {
2544 vi . clearAllMocks ( )
2645 mockDownloadFile . mockResolvedValue ( Buffer . from ( 'bytes' ) )
46+ mockParseWorkspaceFileKey . mockReturnValue ( null )
47+ mockResolveServableDocBytes . mockImplementation ( async ( { rawBuffer } ) => ( {
48+ buffer : rawBuffer ,
49+ contentType : 'application/pdf' ,
50+ } ) )
2751 } )
2852
2953 it ( 'downloads with the key-derived context, ignoring a caller-supplied public context' , async ( ) => {
@@ -44,4 +68,23 @@ describe('downloadFileFromStorage context derivation', () => {
4468 expect . objectContaining ( { key : userFile . key , context : 'workspace' } )
4569 )
4670 } )
71+
72+ it ( 'uses the workspace ID embedded in an execution key to resolve generated artifacts' , async ( ) => {
73+ const workspaceId = '2f1d8c3e-5b6a-4c7d-8e9f-0a1b2c3d4e5f'
74+ const userFile : UserFile = {
75+ id : 'f1' ,
76+ name : 'report.pdf' ,
77+ url : '' ,
78+ size : 5 ,
79+ type : 'text/x-python-pdf' ,
80+ key : `execution/${ workspaceId } /3f2e9d4c-6a7b-4d8e-9f0a-1b2c3d4e5f6a/4a3b2c1d-7e8f-4a9b-8c0d-1e2f3a4b5c6d/report.pdf` ,
81+ context : 'execution' ,
82+ }
83+
84+ await downloadServableFileFromStorage ( userFile , 'req-1' , createLogger ( 'test' ) )
85+
86+ expect ( mockResolveServableDocBytes ) . toHaveBeenCalledWith (
87+ expect . objectContaining ( { workspaceId } )
88+ )
89+ } )
4790} )
0 commit comments