fix(storage): handle Qiniu CommonJS SDK default export for DIY import
This commit is contained in:
parent
56548a731e
commit
ce66215764
60
furniture-3d-system/src/lib/storage-qiniu-compat.test.ts
Normal file
60
furniture-3d-system/src/lib/storage-qiniu-compat.test.ts
Normal 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' }))
|
||||
})
|
||||
})
|
||||
@ -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
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user