test: add unit tests for wmill_scopes and allowed_domains parsing

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
Ruben Fiszel
2026-02-20 07:04:56 +00:00
parent 2c5dba0644
commit c4c8be9af0
2 changed files with 124 additions and 0 deletions

View File

@@ -6275,3 +6275,96 @@ pub async fn get_same_worker_job(
))
})
}
#[cfg(test)]
mod tests {
use super::parse_wmill_scopes;
#[test]
fn test_parse_wmill_scopes_double_slash() {
let code = "// wmill_scopes: read:resource,read:variable\nconst x = 1;";
let scopes = parse_wmill_scopes(code).unwrap();
assert_eq!(scopes, vec!["read:resource", "read:variable"]);
}
#[test]
fn test_parse_wmill_scopes_hash() {
let code = "# wmill_scopes: run:script,read:resource\nimport os";
let scopes = parse_wmill_scopes(code).unwrap();
assert_eq!(scopes, vec!["run:script", "read:resource"]);
}
#[test]
fn test_parse_wmill_scopes_double_dash() {
let code = "-- wmill_scopes: read:resource\nSELECT 1;";
let scopes = parse_wmill_scopes(code).unwrap();
assert_eq!(scopes, vec!["read:resource"]);
}
#[test]
fn test_parse_wmill_scopes_skips_shebang() {
let code = "#!/bin/bash\n# wmill_scopes: run:script\necho hello";
let scopes = parse_wmill_scopes(code).unwrap();
assert_eq!(scopes, vec!["run:script"]);
}
#[test]
fn test_parse_wmill_scopes_none_when_absent() {
let code = "import os\ndef main():\n pass";
assert!(parse_wmill_scopes(code).is_none());
}
#[test]
fn test_parse_wmill_scopes_none_when_empty() {
let code = "// wmill_scopes:\nconst x = 1;";
assert!(parse_wmill_scopes(code).is_none());
}
#[test]
fn test_parse_wmill_scopes_trims_whitespace() {
let code = "// wmill_scopes: read:resource , write:variable \n";
let scopes = parse_wmill_scopes(code).unwrap();
assert_eq!(scopes, vec!["read:resource", "write:variable"]);
}
#[test]
fn test_parse_wmill_scopes_not_in_first_20_lines() {
let mut code = String::new();
for _ in 0..25 {
code.push_str("// some comment\n");
}
code.push_str("// wmill_scopes: read:resource\n");
assert!(parse_wmill_scopes(&code).is_none());
}
#[test]
fn test_parse_wmill_scopes_within_first_20_lines() {
let mut code = String::new();
for _ in 0..18 {
code.push_str("// some comment\n");
}
code.push_str("// wmill_scopes: read:resource\n");
let scopes = parse_wmill_scopes(&code).unwrap();
assert_eq!(scopes, vec!["read:resource"]);
}
#[test]
fn test_parse_wmill_scopes_with_leading_whitespace() {
let code = " // wmill_scopes: read:resource\n";
let scopes = parse_wmill_scopes(code).unwrap();
assert_eq!(scopes, vec!["read:resource"]);
}
#[test]
fn test_parse_wmill_scopes_single_scope() {
let code = "# wmill_scopes: read:resource\n";
let scopes = parse_wmill_scopes(code).unwrap();
assert_eq!(scopes, vec!["read:resource"]);
}
#[test]
fn test_parse_wmill_scopes_ignores_non_comment_lines() {
let code = "wmill_scopes: read:resource\ndef main(): pass";
assert!(parse_wmill_scopes(code).is_none());
}
}

View File

@@ -285,6 +285,37 @@ mod tests {
assert_eq!(config.allowed_domains, vec!["api.example.com"]);
}
#[test]
fn test_parse_allowed_domains_with_sandbox_and_volume() {
let code = "# sandbox: py-env:v1\n\
# volume: data:/mnt/data\n\
# allowed_domains: api.example.com, cdn.example.com\n\
def main(): pass\n";
let config = parse_sandbox_config(code);
assert!(config.snapshot.is_some());
assert_eq!(config.volumes.len(), 1);
assert_eq!(
config.allowed_domains,
vec!["api.example.com", "cdn.example.com"]
);
}
#[test]
fn test_parse_allowed_domains_last_wins() {
let code = "# allowed_domains: first.com\n# allowed_domains: second.com, third.com\n";
let config = parse_sandbox_config(code);
assert_eq!(config.allowed_domains, vec!["second.com", "third.com"]);
}
#[test]
fn test_parse_allowed_domains_standalone() {
let code = "// allowed_domains: api.openai.com\nasync function main() { }";
let config = parse_sandbox_config(code);
assert!(config.snapshot.is_none());
assert!(config.volumes.is_empty());
assert_eq!(config.allowed_domains, vec!["api.openai.com"]);
}
#[test]
fn test_parse_ignores_unrelated_comments() {
let code = "# This is a normal comment\n\