diff --git a/packages/components/src/storage/GCSStorageProvider.test.ts b/packages/components/src/storage/GCSStorageProvider.test.ts new file mode 100644 index 00000000000..9723f25950e --- /dev/null +++ b/packages/components/src/storage/GCSStorageProvider.test.ts @@ -0,0 +1,66 @@ +import { GCSStorageProvider } from './GCSStorageProvider' + +const bucketMock = {} +const multerMock = jest.fn((config) => config) +const storageCtorMock = jest.fn(() => ({ + bucket: jest.fn(() => bucketMock) +})) +const multerGoogleCloudStorageMock = jest.fn((config) => config) + +jest.mock('@google-cloud/storage', () => ({ + Storage: storageCtorMock +})) + +jest.mock('multer', () => multerMock) + +jest.mock('multer-cloud-storage', () => multerGoogleCloudStorageMock) + +jest.mock('@google-cloud/logging-winston', () => ({ + LoggingWinston: jest.fn() +})) + +describe('GCSStorageProvider', () => { + const originalEnv = process.env + + beforeEach(() => { + jest.clearAllMocks() + process.env = { + ...originalEnv, + GOOGLE_CLOUD_STORAGE_BUCKET_NAME: 'test-bucket', + GOOGLE_CLOUD_STORAGE_PROJ_ID: 'test-project', + GOOGLE_CLOUD_STORAGE_CREDENTIAL: '/tmp/gcs.json' + } + }) + + afterAll(() => { + process.env = originalEnv + }) + + it('treats whitespace-padded false as disabled uniform bucket access', () => { + process.env.GOOGLE_CLOUD_UNIFORM_BUCKET_ACCESS = ' false ' + + const provider = new GCSStorageProvider() + + provider.getMulterStorage() + + expect(multerGoogleCloudStorageMock).toHaveBeenCalledWith( + expect.objectContaining({ + uniformBucketLevelAccess: false + }) + ) + }) + + it('keeps uniform bucket access enabled when env is unset', () => { + delete process.env.GOOGLE_CLOUD_UNIFORM_BUCKET_ACCESS + + const provider = new GCSStorageProvider() + + provider.getMulterStorage() + + expect(multerGoogleCloudStorageMock).toHaveBeenCalledWith( + expect.objectContaining({ + uniformBucketLevelAccess: true + }) + ) + }) +}) diff --git a/packages/components/src/storage/GCSStorageProvider.ts b/packages/components/src/storage/GCSStorageProvider.ts index 22be092db99..3fb46152aae 100644 --- a/packages/components/src/storage/GCSStorageProvider.ts +++ b/packages/components/src/storage/GCSStorageProvider.ts @@ -7,6 +7,12 @@ import { FileInfo, StorageResult, StorageSizeResult } from './IStorageProvider' import MulterGoogleCloudStorage from 'multer-cloud-storage' +const isUniformBucketLevelAccessEnabled = () => { + const value = process.env.GOOGLE_CLOUD_UNIFORM_BUCKET_ACCESS + if (typeof value === 'undefined') return true + return value.trim().toLowerCase() !== 'false' +} + export class GCSStorageProvider extends BaseStorageProvider { private bucket: Bucket private bucketName: string @@ -330,7 +336,7 @@ export class GCSStorageProvider extends BaseStorageProvider { projectId: this.projectId, bucket: this.bucketName, keyFilename: this.keyFilename, - uniformBucketLevelAccess: Boolean(process.env.GOOGLE_CLOUD_UNIFORM_BUCKET_ACCESS) ?? true, + uniformBucketLevelAccess: isUniformBucketLevelAccessEnabled(), destination: `uploads/${uuidv4()}` }) })