From 0303111d5b1c510c7939c53a8f635e6cba3ac326 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9C=A8=E7=82=8E?= <635735027@qq.com> Date: Mon, 13 Apr 2026 16:13:46 +0800 Subject: [PATCH] test: add async browser script test case MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 🤖 Generated with [Qoder][https://qoder.com] --- tests/browser_script_skill_tool_test.rs | 71 +++++++++++++++++++++++++ 1 file changed, 71 insertions(+) diff --git a/tests/browser_script_skill_tool_test.rs b/tests/browser_script_skill_tool_test.rs index fbb48b7..264b694 100644 --- a/tests/browser_script_skill_tool_test.rs +++ b/tests/browser_script_skill_tool_test.rs @@ -610,6 +610,77 @@ return { ); } +#[tokio::test] +async fn execute_browser_script_tool_awaits_async_script() { + let skill_dir = unique_temp_dir("sgclaw-browser-script-async"); + let scripts_dir = skill_dir.join("scripts"); + fs::create_dir_all(&scripts_dir).unwrap(); + // 异步脚本,返回 Promise + fs::write( + scripts_dir.join("async_extract.js"), + "return (async function() { return { async: true, args: args }; })();\n", + ) + .unwrap(); + + let transport = Arc::new(MockTransport::new(vec![BrowserMessage::Response { + seq: 1, + success: true, + data: json!({ + "text": { + "async": true, + "args": { "expected_domain": "example.com" } + } + }), + aom_snapshot: vec![], + timing: Timing { + queue_ms: 1, + exec_ms: 5, + }, + }])); + + let policy_json = MacPolicy::from_json_str( + r#"{ + "version": "1.0", + "domains": { "allowed": ["www.zhihu.com", "example.com"] }, + "pipe_actions": { + "allowed": ["click", "type", "navigate", "getText", "eval"], + "blocked": [] + } + }"#, + ) + .unwrap(); + + let browser_tool = BrowserPipeTool::new( + transport.clone(), + policy_json, + vec![1, 2, 3, 4, 5, 6, 7, 8], + ) + .with_response_timeout(Duration::from_secs(1)); + + let skill_tool = SkillTool { + name: "async_extract".to_string(), + description: "Extract data asynchronously".to_string(), + kind: "browser_script".to_string(), + command: "scripts/async_extract.js".to_string(), + args: HashMap::new(), + }; + + let result = execute_browser_script_tool( + &skill_tool, + &skill_dir, + &PipeBrowserBackend::from_inner(browser_tool), + json!({ + "expected_domain": "example.com" + }), + ) + .await + .unwrap(); + + assert!(result.success); + let output = serde_json::from_str::(&result.output).unwrap(); + assert_eq!(output["async"], true); +} + fn unique_temp_dir(prefix: &str) -> PathBuf { let nanos = SystemTime::now() .duration_since(UNIX_EPOCH)