captchaforge 0.2.39

Captcha detection and solving for Firefox and BiDi-driven browsers. Detection, vendor solver scaffolding, trusted cross-origin click delivery into nested OOPIFs, and stealth personas are implemented and tested; broad live-vendor solve rates are not yet benchmarked.
Documentation
//! Unit tests for [`super`] (slider/puzzle-piece gap detection + trajectory).

use super::*;

#[test]
fn defaults_cover_major_vendors() {
    let s = SliderCaptchaSolver::new();
    let canvases: Vec<_> = s.selectors.iter().map(|x| x.canvas).collect();
    for needle in [
        ".geetest_canvas_slice",
        "#captcha__puzzle",
        ".px-captcha-puzzle",
        "[data-puzzle-canvas]",
    ] {
        assert!(
            canvases.contains(&needle),
            "default selectors must include: {needle}"
        );
    }
}

#[test]
fn supports_slider_and_known_vendors() {
    let s = SliderCaptchaSolver::new();
    assert!(s.supports(&DetectedCaptcha::SliderCaptcha));
    assert!(s.supports(&DetectedCaptcha::Custom("datadome".into())));
    assert!(s.supports(&DetectedCaptcha::Custom("geetest_v3".into())));
    assert!(s.supports(&DetectedCaptcha::Custom("perimeterx_human".into())));
    assert!(s.supports(&DetectedCaptcha::Custom("aws_waf_captcha".into())));
    assert!(!s.supports(&DetectedCaptcha::Custom("friendly_captcha".into())));
    assert!(!s.supports(&DetectedCaptcha::Turnstile));
}

#[test]
fn name_and_method_stable() {
    let s = SliderCaptchaSolver::new();
    assert_eq!(s.name(), "SliderCaptchaSolver");
    assert_eq!(s.method(), SolveMethod::BehavioralBypass);
}

#[test]
fn with_selectors_overrides_default() {
    let custom = SliderSelectors {
        canvas: ".my-canvas",
        handle: ".my-handle",
        success_marker: None,
    };
    let s = SliderCaptchaSolver::new().with_selectors(vec![custom]);
    assert_eq!(s.selectors.len(), 1);
    assert_eq!(s.selectors[0].canvas, ".my-canvas");
}

#[test]
fn gap_detect_js_uses_canvas_imagedata() {
    assert!(GAP_DETECT_JS.contains("getImageData"));
    assert!(GAP_DETECT_JS.contains("HTMLCanvasElement"));
}

#[test]
fn anchors_js_returns_handle_and_canvas_geometry() {
    assert!(ANCHORS_JS.contains("getBoundingClientRect"));
    assert!(ANCHORS_JS.contains("handleX"));
    assert!(ANCHORS_JS.contains("canvasLeft"));
}