@@ -19,34 +19,9 @@ describe("auto-pair approval receipts (#4616)", () => {
1919 const pythonUnavailable =
2020 spawnSync ( "sh" , [ "-c" , "command -v python3" ] , { stdio : "ignore" } ) . status !== 0 ;
2121
22- it . skipIf ( pythonUnavailable ) ( "omits raw output from devices-list failure classifications" , ( ) => {
23- const policy = readAutoPairApprovalPolicyModule ( ) ;
24- expect ( policy ) . toBeTruthy ( ) ;
25- const script = buildAutoPairApprovalScript (
26- Buffer . from ( policy as string , "utf-8" ) . toString ( "base64" ) ,
27- {
28- emitReceipt : true ,
29- budget : { listTimeoutS : 0.5 } ,
30- } ,
31- ) ;
32- const tmpDir = fs . mkdtempSync ( path . join ( os . tmpdir ( ) , "nemoclaw-auto-pair-list-receipt-" ) ) ;
33- try {
34- fs . writeFileSync (
35- path . join ( tmpDir , "openclaw" ) ,
36- `#!${ process . execPath }
37- const args = process.argv.slice(2);
38- if (args[0] !== "devices" || args[1] !== "list") process.exit(2);
39- const sleepMs = Number(process.env.NEMOCLAW_LIST_SLEEP_MS || "0");
40- if (sleepMs > 0) {
41- Atomics.wait(new Int32Array(new SharedArrayBuffer(4)), 0, 0, sleepMs);
42- }
43- process.stdout.write(process.env.NEMOCLAW_LIST_STDOUT || "");
44- process.stderr.write(process.env.NEMOCLAW_LIST_STDERR || "");
45- process.exit(Number(process.env.NEMOCLAW_LIST_EXIT_CODE || "0"));
46- ` ,
47- { mode : 0o755 } ,
48- ) ;
49- for ( const [ environment , receipt ] of [
22+ it . skipIf ( pythonUnavailable ) . each (
23+ Array . from (
24+ [
5025 [ { NEMOCLAW_LIST_SLEEP_MS : "800" } , "list-timeout" ] ,
5126 [
5227 { NEMOCLAW_LIST_EXIT_CODE : "1" , NEMOCLAW_LIST_STDERR : "raw failure" } ,
@@ -77,7 +52,39 @@ process.exit(Number(process.env.NEMOCLAW_LIST_EXIT_CODE || "0"));
7752 [ { NEMOCLAW_LIST_STDOUT : "raw invalid json" } , "list-invalid-json" ] ,
7853 [ { NEMOCLAW_LIST_STDOUT : "[]\n" } , "list-invalid-output" ] ,
7954 [ { NEMOCLAW_LIST_STDOUT : "{}\n" } , "list-missing-pending" ] ,
80- ] as const ) {
55+ ] as const ,
56+ ( tableRow ) => [ tableRow ] as const ,
57+ ) ,
58+ ) (
59+ "omits raw output from devices-list failure classifications [case %#]" ,
60+ ( [ environment , receipt ] ) => {
61+ const policy = readAutoPairApprovalPolicyModule ( ) ;
62+ expect ( policy ) . toBeTruthy ( ) ;
63+ const script = buildAutoPairApprovalScript (
64+ Buffer . from ( policy as string , "utf-8" ) . toString ( "base64" ) ,
65+ {
66+ emitReceipt : true ,
67+ budget : { listTimeoutS : 0.5 } ,
68+ } ,
69+ ) ;
70+ const tmpDir = fs . mkdtempSync ( path . join ( os . tmpdir ( ) , "nemoclaw-auto-pair-list-receipt-" ) ) ;
71+ try {
72+ fs . writeFileSync (
73+ path . join ( tmpDir , "openclaw" ) ,
74+ `#!${ process . execPath }
75+ const args = process.argv.slice(2);
76+ if (args[0] !== "devices" || args[1] !== "list") process.exit(2);
77+ const sleepMs = Number(process.env.NEMOCLAW_LIST_SLEEP_MS || "0");
78+ if (sleepMs > 0) {
79+ Atomics.wait(new Int32Array(new SharedArrayBuffer(4)), 0, 0, sleepMs);
80+ }
81+ process.stdout.write(process.env.NEMOCLAW_LIST_STDOUT || "");
82+ process.stderr.write(process.env.NEMOCLAW_LIST_STDERR || "");
83+ process.exit(Number(process.env.NEMOCLAW_LIST_EXIT_CODE || "0"));
84+ ` ,
85+ { mode : 0o755 } ,
86+ ) ;
87+
8188 const result = spawnSync ( "sh" , [ "-c" , script ] , {
8289 encoding : "utf-8" ,
8390 env : {
@@ -89,11 +96,11 @@ process.exit(Number(process.env.NEMOCLAW_LIST_EXIT_CODE || "0"));
8996 } ) ;
9097 expect ( parseAutoPairApprovalReceipt ( result . stdout ) ) . toBe ( receipt ) ;
9198 expect ( `${ result . stdout } ${ result . stderr } ` ) . not . toContain ( "raw " ) ;
99+ } finally {
100+ fs . rmSync ( tmpDir , { recursive : true , force : true } ) ;
92101 }
93- } finally {
94- fs . rmSync ( tmpDir , { recursive : true , force : true } ) ;
95- }
96- } ) ;
102+ } ,
103+ ) ;
97104
98105 it ( "distinguishes host execution failures without returning their details" , ( ) => {
99106 const timeoutError = Object . assign ( new Error ( "private timeout detail" ) , {
0 commit comments