mod common;
#[tokio::test]
async fn stealth_profile_user_agent_matches() {
let browser = common::launch_browser().await;
let page = browser.new_page("about:blank").await.unwrap();
let profile = captchaforge::StealthProfile::FirefoxLinux;
let overrides = captchaforge::profile_to_overrides(&profile);
captchaforge::apply_stealth_profile(&page, &profile).await.unwrap();
let ua: String = page
.evaluate("navigator.userAgent")
.await
.unwrap()
.into_value()
.unwrap();
assert!(
ua == overrides.user_agent,
"navigator.userAgent mismatch:\n expected: {}\n actual: {}",
overrides.user_agent,
ua
);
browser.close().await.unwrap();
}
#[tokio::test]
async fn stealth_profile_platform_matches() {
let browser = common::launch_browser().await;
let page = browser.new_page("about:blank").await.unwrap();
let profile = captchaforge::StealthProfile::FirefoxLinux;
let overrides = captchaforge::profile_to_overrides(&profile);
captchaforge::apply_stealth_profile(&page, &profile).await.unwrap();
let platform: String = page
.evaluate("navigator.platform")
.await
.unwrap()
.into_value()
.unwrap();
assert_eq!(platform, overrides.platform);
browser.close().await.unwrap();
}
#[tokio::test]
async fn stealth_profile_languages_match() {
let browser = common::launch_browser().await;
let page = browser.new_page("about:blank").await.unwrap();
let profile = captchaforge::StealthProfile::FirefoxLinux;
let overrides = captchaforge::profile_to_overrides(&profile);
captchaforge::apply_stealth_profile(&page, &profile).await.unwrap();
let langs: Vec<String> = page
.evaluate("navigator.languages")
.await
.unwrap()
.into_value()
.unwrap();
assert_eq!(langs, overrides.languages);
browser.close().await.unwrap();
}
#[tokio::test]
async fn stealth_profile_hardware_concurrency_matches() {
let browser = common::launch_browser().await;
let page = browser.new_page("about:blank").await.unwrap();
let profile = captchaforge::StealthProfile::FirefoxLinux;
let overrides = captchaforge::profile_to_overrides(&profile);
captchaforge::apply_stealth_profile(&page, &profile).await.unwrap();
let concurrency: u32 = page
.evaluate("navigator.hardwareConcurrency")
.await
.unwrap()
.into_value()
.unwrap();
assert_eq!(concurrency, overrides.hardware_concurrency);
browser.close().await.unwrap();
}
#[tokio::test]
async fn stealth_profile_webdriver_is_absent() {
let browser = common::launch_browser().await;
let page = browser.new_page("about:blank").await.unwrap();
let profile = captchaforge::StealthProfile::FirefoxLinux;
captchaforge::apply_stealth_profile(&page, &profile).await.unwrap();
let webdriver: bool = page
.evaluate("navigator.webdriver === undefined || navigator.webdriver === false")
.await
.unwrap()
.into_value()
.unwrap();
assert!(webdriver, "navigator.webdriver should be absent/false");
browser.close().await.unwrap();
}
#[tokio::test]
async fn stealth_profile_screen_is_self_consistent() {
let browser = common::launch_browser().await;
let page = browser.new_page("about:blank").await.unwrap();
let profile = captchaforge::StealthProfile::FirefoxLinux;
captchaforge::apply_stealth_profile(&page, &profile).await.unwrap();
let consistent: bool = page
.evaluate(
"(() => { const w = screen.width, h = screen.height; \
if (!(w > 0 && h > 0)) return false; \
return window.matchMedia('(device-width: ' + w + 'px)').matches \
&& window.matchMedia('(device-height: ' + h + 'px)').matches; })()",
)
.await
.unwrap()
.into_value()
.unwrap();
assert!(
consistent,
"screen.* must be plausible and consistent with the matchMedia device-width/height layer"
);
browser.close().await.unwrap();
}