Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
66 changes: 66 additions & 0 deletions packages/components/src/storage/GCSStorageProvider.test.ts
Original file line number Diff line number Diff line change
@@ -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
})
)
})
})
Comment on lines +3 to +66
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

The test uses require inside the it block, which is non-idiomatic and redundant here as the module is not being re-evaluated with jest.resetModules(). It is better to use a standard top-level import. Additionally, adding a test case for the default (unset) behavior would verify the "default enabled" requirement mentioned in the PR description.

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('defaults to enabled uniform bucket access 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
            })
        )
    })
})

8 changes: 7 additions & 1 deletion packages/components/src/storage/GCSStorageProvider.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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()}`
})
})
Expand Down