fix(android upload): handle transient imgur errors

This commit is contained in:
Tommaso Casaburi
2026-05-01 22:54:05 +07:00
parent 70791fa80a
commit 3de85520bd
7 changed files with 113 additions and 14 deletions
+31 -1
View File
@@ -442,11 +442,41 @@ describe('useFileUpload', () => {
});
const call = vi.mocked(FileUploader.pickAndUploadMedia).mock.calls[0][0];
expect(call?.providerOrder).toEqual(expect.arrayContaining(['catbox']));
expect(call?.providerOrder).toEqual(expect.arrayContaining(['imgur']));
expect(call?.providerOrder).toEqual(expect.arrayContaining(['imgbb']));
expect(call?.providerOrder).toEqual(expect.arrayContaining(['imgur']));
expect(onUploadComplete).toHaveBeenCalledWith('https://files.catbox.moe/random.jpg', 'random.jpg');
});
it('surfaces Android provider errors with their stage', async () => {
uploadModeRef.value = 'random';
preferredProviderRef.value = 'catbox';
vi.mocked(Capacitor.getPlatform).mockReturnValue('android');
const error = new Error('All providers failed') as Error & { data: { attempts: unknown[] } };
error.data = {
attempts: [
{
provider: 'imgur',
success: false,
error: 'Provider error: CREATE_ALBUM_FAIL',
stage: 'provider_error',
elapsedMs: 2200,
matchedSelectors: '#file-input',
},
],
};
vi.mocked(FileUploader.pickAndUploadMedia).mockRejectedValue(error);
const { onUploadComplete, hook } = mountHook();
await act(async () => {
await hook().handleUpload();
});
expect(window.alert).toHaveBeenCalledWith(
'upload_failed. upload_failed_all_providers: imgur: Provider error: CREATE_ALBUM_FAIL (stage=provider_error, 2200ms, tried=[#file-input])',
);
expect(onUploadComplete).not.toHaveBeenCalled();
});
it('random mode: Electron upload succeeds when orchestrator resolves', async () => {
uploadModeRef.value = 'random';
preferredProviderRef.value = 'catbox';
+1
View File
@@ -15,6 +15,7 @@ const ANDROID_STAGE_MAP: Record<string, UploadAttemptStage> = {
chooser_not_triggered: 'file_input',
upload_timed_out: 'timeout',
blocked_detected: 'blocked',
provider_error: 'provider_error',
no_recipe: 'unknown',
page_loaded: 'page_load',
blocked: 'blocked',