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
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:
37
frontend/src/lib/shared/server/settled.test.ts
Normal file
37
frontend/src/lib/shared/server/settled.test.ts
Normal 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();
|
||||
});
|
||||
});
|
||||
@@ -1,5 +1,5 @@
|
||||
export function settled<T>(res: PromiseSettledResult<unknown> | undefined): T | null {
|
||||
if (res?.status !== 'fulfilled') return null;
|
||||
const v = res.value as { response: Response; data: unknown };
|
||||
return v.response.ok ? ((v.data as T) ?? null) : null;
|
||||
const v = res.value as { response: Response; data: unknown } | null;
|
||||
return v?.response?.ok ? ((v.data as T) ?? null) : null;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user