parlov-analysis 0.7.0

Analysis engine trait and signal detection for parlov.
Documentation
use super::*;

// -- Confirmed / Low (lower-moderate patterns, base_confidence 80, base_impact 30) --

#[test]
fn gone_vs_not_found() {
    assert_pattern(
        410,
        404,
        OracleVerdict::Confirmed,
        Some(Severity::Low),
        Some("Tombstone differential"),
        true,
        Some("RFC 9110 §15.5.11"),
    );
}

#[test]
fn moved_permanently_vs_not_found() {
    assert_pattern(
        301,
        404,
        OracleVerdict::Confirmed,
        Some(Severity::Low),
        Some("Redirect-based differential"),
        true,
        Some("RFC 9110 §15.4.2"),
    );
}

#[test]
fn payload_too_large_vs_not_found() {
    assert_pattern(
        413,
        404,
        OracleVerdict::Confirmed,
        Some(Severity::Low),
        Some("Payload-size differential"),
        true,
        Some("RFC 9110 §15.5.14"),
    );
}

#[test]
fn length_required_vs_not_found() {
    assert_pattern(
        411,
        404,
        OracleVerdict::Confirmed,
        Some(Severity::Low),
        Some("Length-required differential"),
        true,
        Some("RFC 9110 §15.5.12"),
    );
}

#[test]
fn accepted_vs_not_found() {
    assert_pattern(
        202,
        404,
        OracleVerdict::Confirmed,
        Some(Severity::Low),
        Some("Async-acceptance differential"),
        true,
        Some("RFC 9110 §15.3.3"),
    );
}

// -- Confirmed / Medium (lower-moderate, base_impact >= 35) --

#[test]
fn internal_server_error_vs_not_found() {
    assert_pattern(
        500,
        404,
        OracleVerdict::Confirmed,
        Some(Severity::Medium),
        Some("Crash-path differential"),
        true,
        Some("RFC 9110 §15.6.1"),
    );
}

#[test]
fn no_content_vs_not_found() {
    assert_pattern(
        204,
        404,
        OracleVerdict::Confirmed,
        Some(Severity::Medium),
        Some("No-content differential"),
        true,
        Some("RFC 9110 §9.3.2"),
    );
}

#[test]
fn method_not_allowed_vs_not_found() {
    assert_pattern(
        405,
        404,
        OracleVerdict::Confirmed,
        Some(Severity::Medium),
        Some("Method-restriction differential"),
        true,
        Some("RFC 9110 §15.5.6"),
    );
}

// -- Confirmed / Low (redirect differentials, base_confidence 80, base_impact 30) --

#[test]
fn found_vs_not_found() {
    assert_pattern(
        302,
        404,
        OracleVerdict::Confirmed,
        Some(Severity::Low),
        Some("Temporary-redirect differential"),
        true,
        Some("RFC 9110 §15.4.3"),
    );
}

#[test]
fn temporary_redirect_vs_not_found() {
    assert_pattern(
        307,
        404,
        OracleVerdict::Confirmed,
        Some(Severity::Low),
        Some("Method-preserving temporary-redirect differential"),
        true,
        Some("RFC 9110 §15.4.8"),
    );
}

#[test]
fn permanent_redirect_vs_not_found() {
    assert_pattern(
        308,
        404,
        OracleVerdict::Confirmed,
        Some(Severity::Low),
        Some("Method-preserving permanent-redirect differential"),
        true,
        Some("RFC 9110 §15.4.9"),
    );
}

#[test]
fn see_other_vs_not_found() {
    assert_pattern(
        303,
        404,
        OracleVerdict::Confirmed,
        Some(Severity::Low),
        Some("Post-mutation redirect differential"),
        true,
        Some("RFC 9110 §15.4.4"),
    );
}