use crawlex::identity::IdentityBundle;
use crawlex::render::pool::build_launch_args;
use url::Url;
fn find<'a>(flags: &'a [String], prefix: &str) -> &'a str {
flags
.iter()
.find(|f| f.starts_with(prefix))
.unwrap_or_else(|| panic!("flag {prefix:?} not in argv: {flags:#?}"))
}
fn has(flags: &[String], token: &str) -> bool {
flags.iter().any(|f| f == token)
}
fn desktop_bundle() -> IdentityBundle {
IdentityBundle::from_chromium(124, 0xdeadbeef)
}
fn mobile_like(mut b: IdentityBundle) -> IdentityBundle {
b.viewport_w = 390;
b.viewport_h = 844;
b.screen_w = 390;
b.screen_h = 844;
b.device_pixel_ratio = 3.0;
b
}
#[test]
fn desktop_argv_carries_core_flags() {
let b = desktop_bundle();
let udd = std::path::PathBuf::from("/tmp/crawlex-udd-test");
let flags = build_launch_args(&b, None, &udd, "en-US,en", &[]);
assert!(has(&flags, "--disable-dev-shm-usage"));
assert!(has(&flags, "--no-first-run"));
assert!(has(&flags, "--no-default-browser-check"));
assert!(has(&flags, "--disable-blink-features=AutomationControlled"));
assert!(has(
&flags,
"--force-webrtc-ip-handling-policy=disable_non_proxied_udp"
));
assert!(has(
&flags,
"--enable-features=VaapiVideoDecoder,AcceptCHFrame,ZstdContentEncoding,EnableTLS13KyberPQ"
));
assert!(has(&flags, "--js-flags=--noexpose-wasm"));
let udd_flag = find(&flags, "--user-data-dir=");
assert_eq!(udd_flag, "--user-data-dir=/tmp/crawlex-udd-test");
}
#[test]
fn desktop_viewport_and_dpr_come_from_bundle() {
let b = desktop_bundle();
let expected_size = format!("--window-size={},{}", b.viewport_w, b.viewport_h);
let expected_dpr = format!("--force-device-scale-factor={}", b.device_pixel_ratio);
let udd = std::path::PathBuf::from("/tmp/crawlex-udd-test");
let flags = build_launch_args(&b, None, &udd, "en-US,en", &[]);
assert!(
has(&flags, &expected_size),
"expected {expected_size:?} in argv: {flags:#?}"
);
assert!(
has(&flags, &expected_dpr),
"expected {expected_dpr:?} in argv: {flags:#?}"
);
}
#[test]
fn mobile_bundle_projects_mobile_viewport() {
let b = mobile_like(desktop_bundle());
let udd = std::path::PathBuf::from("/tmp/crawlex-udd-test");
let flags = build_launch_args(&b, None, &udd, "en-US,en", &[]);
assert!(has(&flags, "--window-size=390,844"));
assert!(has(&flags, "--force-device-scale-factor=3"));
}
#[test]
fn user_agent_is_sourced_from_bundle_not_profile() {
let mut b = desktop_bundle();
b.ua = "Mozilla/5.0 (CrawlexTest/UA-marker)".into();
let udd = std::path::PathBuf::from("/tmp/crawlex-udd-test");
let flags = build_launch_args(&b, None, &udd, "en-US,en", &[]);
assert!(has(
&flags,
"--user-agent=Mozilla/5.0 (CrawlexTest/UA-marker)"
));
}
#[test]
fn proxy_adds_server_and_bypass_list() {
let b = desktop_bundle();
let proxy = Url::parse("http://127.0.0.1:9050").unwrap();
let udd = std::path::PathBuf::from("/tmp/crawlex-udd-test");
let flags = build_launch_args(&b, Some(&proxy), &udd, "en-US,en", &[]);
let server = find(&flags, "--proxy-server=");
assert!(server.contains("127.0.0.1:9050"), "got {server:?}");
assert!(has(&flags, "--proxy-bypass-list=<-loopback>"));
}
#[test]
fn no_proxy_means_no_proxy_flags() {
let b = desktop_bundle();
let udd = std::path::PathBuf::from("/tmp/crawlex-udd-test");
let flags = build_launch_args(&b, None, &udd, "en-US,en", &[]);
assert!(!flags.iter().any(|f| f.starts_with("--proxy-server=")));
assert!(!flags.iter().any(|f| f.starts_with("--proxy-bypass-list=")));
}
#[test]
fn extra_flags_are_appended_and_can_override() {
let b = desktop_bundle();
let udd = std::path::PathBuf::from("/tmp/crawlex-udd-test");
let extra = vec![
"--use-gl=angle".to_string(),
"--use-angle=gl".to_string(),
"--enable-gpu-rasterization".to_string(),
];
let flags = build_launch_args(&b, None, &udd, "en-US,en", &extra);
for e in &extra {
assert!(has(&flags, e), "extra {e:?} missing from argv");
}
let disable_pos = flags.iter().position(|f| f == "--disable-gpu").unwrap();
let angle_pos = flags.iter().position(|f| f == "--use-gl=angle").unwrap();
assert!(
angle_pos > disable_pos,
"extras must be appended AFTER defaults"
);
}
#[test]
fn lang_flag_follows_languages_argument() {
let b = desktop_bundle();
let udd = std::path::PathBuf::from("/tmp/crawlex-udd-test");
let flags_en = build_launch_args(&b, None, &udd, "en-US,en", &[]);
assert!(has(&flags_en, "--lang=en-US,en"));
let flags_pt = build_launch_args(&b, None, &udd, "pt-BR,en", &[]);
assert!(has(&flags_pt, "--lang=pt-BR,en"));
}
#[test]
fn zero_viewport_falls_back_to_conservative_desktop() {
let mut b = desktop_bundle();
b.viewport_w = 0;
b.viewport_h = 0;
b.device_pixel_ratio = 0.0;
let udd = std::path::PathBuf::from("/tmp/crawlex-udd-test");
let flags = build_launch_args(&b, None, &udd, "en-US,en", &[]);
assert!(has(&flags, "--window-size=1920,1080"));
assert!(has(&flags, "--force-device-scale-factor=1"));
}