From 06d06041c74bf2ac894ff65ef63cfa4a159b65ad Mon Sep 17 00:00:00 2001 From: VAIO73 <50487331+Vaso73@users.noreply.github.com> Date: Wed, 21 Oct 2026 03:15:29 +0000 Subject: [PATCH] test: verify source response after unmount and retain narrowed source --- AppImage/components/settings.tsx | 3 ++- tests/test_optimization_source.cjs | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/AppImage/components/settings.tsx b/AppImage/components/settings.tsx index feb59c4d..4da56f8f 100644 --- a/AppImage/components/settings.tsx +++ b/AppImage/components/settings.tsx @@ -697,7 +697,8 @@ export function Settings() { const data = await fetchApi(`/api/proxmenux/tool-source/${tool.key}`) if (request !== codeRequest.current) return if (data?.success === true && typeof data.source === "string" && data.source.trim()) { - setCodeModal(prev => ({ ...prev, loading: false, functionName: typeof data.function === "string" ? data.function : '', source: data.source, script: typeof data.script === "string" ? data.script : '', deprecated: !!data.deprecated })) + const source = data.source + setCodeModal(prev => ({ ...prev, loading: false, functionName: typeof data.function === "string" ? data.function : '', source, script: typeof data.script === "string" ? data.script : '', deprecated: !!data.deprecated })) } else { setCodeModal(prev => ({ ...prev, loading: false, error: { kind: "unavailable", detail: typeof data?.error === "string" ? data.error : undefined } })) } diff --git a/tests/test_optimization_source.cjs b/tests/test_optimization_source.cjs index 0ad7e279..bb5927e1 100644 --- a/tests/test_optimization_source.cjs +++ b/tests/test_optimization_source.cjs @@ -89,6 +89,7 @@ async function main(){ let resolveStale;f.setReply(()=>new Promise(resolve=>resolveStale=resolve));const stale=f.tool('one').props.onClick();f.setReply(()=>({...sourceBody,source:'two() { :; }'}));await f.tool('two').props.onClick();f.render();resolveStale({http:404,body:{error:'Function not found in available scripts'}});await stale;f.render();assert.ok(text(f.dialog()).includes('Demo two'));assert.equal(flatten(f.dialog()).some(node=>node.props?.role==='alert'),false) const before=f.calls.length;f.escape();f.render();assert.equal(f.dialog(),undefined);assert.equal(f.calls.length,before) f.setReply(()=>sourceBody);await f.tool('one').props.onClick();f.render();let copyResolve;f.clipboard.writeText=()=>new Promise(resolve=>copyResolve=resolve);const copying=flatten(f.dialog()).find(node=>node.props?.title===f.t('actions.copyToClipboard')).props.onClick();f.close();f.render();copyResolve();await copying;f.render();assert.equal(f.dialog(),undefined) + let unmountedResolve;f.setReply(()=>new Promise(resolve=>unmountedResolve=resolve));const unmounted=f.tool('one').props.onClick();f.render();const snapshot=text(f.tree());f.unmount();unmountedResolve(sourceBody);await unmounted;f.render();assert.equal(text(f.tree()),snapshot,'response after unmount cannot update modal state') assert.equal(f.calls.filter(call=>call.method!=='GET').length,0);assert.equal(f.calls.filter(call=>/scan|update|script-runner/.test(call.endpoint)).length,0) console.log('PASS source viewer: actual Settings/fetchApi, EN/SK/fallback, 404/500/network/malformed/empty, exact copy, late requests and close/Esc; mutations/scan/update 0') }