subscan 1.3.0

A subdomain enumeration tool leveraging diverse techniques, designed for advanced pentesting operations
Documentation
use std::collections::BTreeSet;

use serde_json::Value;
use subscan::{
    enums::content::Content, error::ModuleErrorKind::JSONExtract, extractors::json::JSONExtractor,
    interfaces::extractor::SubdomainExtractorInterface,
};

use crate::common::{
    constants::{TEST_BAR_SUBDOMAIN, TEST_BAZ_SUBDOMAIN, TEST_DOMAIN},
    utils::read_testdata,
};

#[tokio::test]
async fn extract_test() {
    let json = read_testdata("json/subdomains.json");

    let inner_parser = |json: Value, _domain: &str| {
        if let Some(subdomains) = json["data"]["subdomains"].as_array() {
            let filter = |json: &Value| Some(json["subdomain"].as_str().unwrap().to_string());

            return Ok(BTreeSet::from_iter(subdomains.iter().filter_map(filter)));
        }

        Err(JSONExtract.into())
    };

    let extractor = JSONExtractor::new(Box::new(inner_parser));

    let result = extractor.extract(json, TEST_DOMAIN).await;
    let no_result = extractor.extract(Content::default(), TEST_DOMAIN).await;

    let expected = BTreeSet::from([
        TEST_BAR_SUBDOMAIN.to_string(),
        TEST_BAZ_SUBDOMAIN.to_string(),
    ]);

    assert!(result.is_ok());
    assert!(no_result.is_err());

    assert_eq!(no_result.err().unwrap(), JSONExtract.into());
    assert_eq!(result.unwrap(), expected);
}