import request from 'supertest'; import { cleanupApplicationAndAppRegistration } from 'test/integration/metadata/suites/application/utils/cleanup-application-and-app-registration.util'; import { setupApplicationForSync } from 'test/integration/metadata/suites/application/utils/setup-application-for-sync.util'; import { uploadApplicationFile } from 'test/integration/metadata/suites/application/utils/upload-application-file.util'; import { v4 as uuidv4 } from 'uuid'; import { SEED_APPLE_WORKSPACE_ID } from 'src/engine/workspace-manager/dev-seeder/core/constants/seeder-workspaces.constant'; const TEST_APP_UID = uuidv4(); const TEST_WORKSPACE_ID = SEED_APPLE_WORKSPACE_ID; const PUBLIC_ASSET_PATH = 'assets/logo.svg'; const PUBLIC_ASSET_CONTENT = ''; const EXPECTED_SANITIZED_PUBLIC_ASSET_CONTENT = ''; const PUBLIC_ASSET_CONTENT_TYPE = 'image/svg+xml'; describe('Public assets controller download should succeed', () => { let applicationId: string; beforeAll(async () => { await setupApplicationForSync({ applicationUniversalIdentifier: TEST_APP_UID, name: 'Test Public Assets Download Success App', description: 'App for testing successful public-assets controller downloads', sourcePath: 'test-public-assets-download-success', }); const [{ id }] = await globalThis.testDataSource.query( `SELECT id FROM core."application" WHERE "universalIdentifier" = $1`, [TEST_APP_UID], ); applicationId = id; jest.useRealTimers(); await uploadApplicationFile({ applicationUniversalIdentifier: TEST_APP_UID, fileFolder: 'PublicAsset', filePath: PUBLIC_ASSET_PATH, fileBuffer: Buffer.from(PUBLIC_ASSET_CONTENT), filename: 'logo.svg', contentType: PUBLIC_ASSET_CONTENT_TYPE, expectToFail: false, }); jest.useFakeTimers(); }, 60000); afterAll(async () => { await cleanupApplicationAndAppRegistration({ applicationUniversalIdentifier: TEST_APP_UID, }); }); it('should stream a public asset with the correct headers and body', async () => { jest.useRealTimers(); // `image/svg+xml` is treated as binary by superagent: the bytes land in // `response.body` as a Buffer, and `response.text` stays undefined. const response = await request(global.app.getHttpServer()) .get( `/public-assets/${TEST_WORKSPACE_ID}/${applicationId}/${PUBLIC_ASSET_PATH}`, ) .buffer(true) .parse((res, callback) => { const chunks: Buffer[] = []; res.on('data', (chunk) => chunks.push(chunk)); res.on('end', () => callback(null, Buffer.concat(chunks))); }); jest.useFakeTimers(); expect(response.status).toBe(200); expect(response.headers['content-type']).toContain( PUBLIC_ASSET_CONTENT_TYPE, ); expect(response.headers['x-content-type-options']).toBe('nosniff'); expect((response.body as Buffer).toString('utf-8')).toBe( EXPECTED_SANITIZED_PUBLIC_ASSET_CONTENT, ); }, 30000); });