fix(shared): null-harden settled() against placeholder slots
Some checks failed
CI / Unit & Component Tests (pull_request) Failing after 3m6s
CI / OCR Service Tests (pull_request) Successful in 23s
CI / Backend Unit Tests (pull_request) Successful in 4m11s
CI / fail2ban Regex (pull_request) Successful in 45s
CI / Semgrep Security Scan (pull_request) Successful in 24s
CI / Compose Bucket Idempotency (pull_request) Successful in 1m8s

A Promise.resolve(null) placeholder (e.g. the gated drafts slot) fulfils
with a null value; settled() dereferenced v.response unconditionally and
threw. Now any nullish value resolves to null. Adds unit tests for all
settled() branches.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
Marcel
2026-06-12 19:45:22 +02:00
parent f26874937d
commit 17b0625a73
2 changed files with 39 additions and 2 deletions

View File

@@ -0,0 +1,37 @@
import { describe, expect, it } from 'vitest';
import { settled } from './settled';
describe('settled', () => {
it('returns the data for a fulfilled ok response', () => {
const res: PromiseSettledResult<unknown> = {
status: 'fulfilled',
value: { response: { ok: true } as Response, data: [{ id: '1' }] }
};
expect(settled<{ id: string }[]>(res)).toEqual([{ id: '1' }]);
});
it('returns null for a fulfilled non-ok response', () => {
const res: PromiseSettledResult<unknown> = {
status: 'fulfilled',
value: { response: { ok: false, status: 403 } as Response, data: undefined }
};
expect(settled(res)).toBeNull();
});
it('returns null for a rejected result', () => {
const res: PromiseSettledResult<unknown> = {
status: 'rejected',
reason: new Error('network error')
};
expect(settled(res)).toBeNull();
});
it('returns null for undefined input', () => {
expect(settled(undefined)).toBeNull();
});
it('returns null for a fulfilled null value (Promise.resolve(null) placeholder slot)', () => {
const res: PromiseSettledResult<unknown> = { status: 'fulfilled', value: null };
expect(settled(res)).toBeNull();
});
});

View File

@@ -1,5 +1,5 @@
export function settled<T>(res: PromiseSettledResult<unknown> | undefined): T | null { export function settled<T>(res: PromiseSettledResult<unknown> | undefined): T | null {
if (res?.status !== 'fulfilled') return null; if (res?.status !== 'fulfilled') return null;
const v = res.value as { response: Response; data: unknown }; const v = res.value as { response: Response; data: unknown } | null;
return v.response.ok ? ((v.data as T) ?? null) : null; return v?.response?.ok ? ((v.data as T) ?? null) : null;
} }