fix(storage): handle Qiniu CommonJS SDK default export for DIY import

This commit is contained in:
WuYongJie 2026-10-14 08:58:44 +08:00
parent 56548a731e
commit ce66215764
2 changed files with 64 additions and 1 deletions

View File

@ -0,0 +1,60 @@
/** @jest-environment node */
const mockQiniuStat = jest.fn()
const mockQiniuPut = jest.fn()
// Node exposes this CommonJS SDK only under default when using import().
jest.mock('qiniu', () => ({
__esModule: true,
default: {
auth: { digest: { Mac: jest.fn().mockImplementation(() => ({})) } },
conf: { Config: jest.fn().mockImplementation(() => ({})) },
form_up: {
FormUploader: jest.fn().mockImplementation(() => ({ put: mockQiniuPut })),
PutExtra: jest.fn().mockImplementation(() => ({})),
},
resume_up: { ResumeUploader: jest.fn().mockImplementation(() => ({})) },
rs: {
BucketManager: jest.fn().mockImplementation(() => ({ stat: mockQiniuStat })),
PutPolicy: jest.fn().mockImplementation(() => ({ uploadToken: () => 'test-token' })),
},
},
}))
const originalEnv = process.env
describe('Qiniu CommonJS SDK compatibility', () => {
beforeEach(() => {
jest.resetModules()
mockQiniuStat.mockReset()
mockQiniuPut.mockReset()
process.env = {
...originalEnv,
STORAGE_PROVIDER: 'qiniu',
OBJECT_STORAGE_FILE_PATH: 'prod',
QINIU_ACCESS_KEY: 'test-access',
QINIU_SECRET_KEY: 'test-secret',
QINIU_BUCKET: 'test-bucket',
QINIU_PUBLIC_DOMAIN: 'https://cdn.example.com',
QINIU_PRIVATE_BUCKET: 'false',
}
})
afterAll(() => { process.env = originalEnv })
it('checks and uploads an import asset when the SDK has only a default export', async () => {
mockQiniuStat.mockResolvedValue({ ok: () => false, resp: { statusCode: 612 } })
mockQiniuPut.mockResolvedValue({ ok: () => true, resp: { statusCode: 200 }, data: {} })
const storage = await import('./storage')
const key = 'product-development/diy/SJ0380/images/pattern.jpg'
const buffer = Buffer.from('test-image')
await expect(storage.doesObjectExist(key)).resolves.toBe(false)
await expect(storage.uploadBufferToObjectStorage(buffer, key, 'image/jpeg')).resolves.toBe(
'/api/storage/object?key=prod%2Fproduct-development%2Fdiy%2FSJ0380%2Fimages%2Fpattern.jpg',
)
expect(mockQiniuStat).toHaveBeenCalledWith('test-bucket', `prod/${key}`)
expect(mockQiniuPut).toHaveBeenCalledWith('test-token', `prod/${key}`, buffer,
expect.objectContaining({ mimeType: 'image/jpeg' }))
})
})

View File

@ -404,7 +404,10 @@ let qiniuSdkPromise: Promise<QiniuSdkModule> | null = null
function loadQiniuSdk(): Promise<QiniuSdkModule> {
if (!qiniuSdkPromise) {
qiniuSdkPromise = import('qiniu')
qiniuSdkPromise = import('qiniu').then((namespace) => {
const sdk = namespace as QiniuSdkModule & { default?: QiniuSdkModule }
return sdk.auth ? sdk : sdk.default ?? sdk
})
}
return qiniuSdkPromise
}