#![deny(clippy::all)]
mod fixtures {
pub mod patch_server;
}
use bytes::Bytes;
use fixtures::patch_server::spawn;
use http::{HeaderMap, HeaderValue, Method, header};
use parlov_analysis::existence::ExistenceAnalyzer;
use parlov_analysis::{Analyzer, SampleDecision};
use parlov_core::{OracleResult, OracleVerdict, ProbeDefinition, ProbeSet, Severity};
use parlov_probe::http::HttpProbe;
use parlov_probe::Probe;
fn json_headers() -> HeaderMap {
let mut headers = HeaderMap::new();
headers.insert(
header::CONTENT_TYPE,
HeaderValue::from_static("application/json"),
);
headers
}
fn patch_body() -> Option<Bytes> {
Some(Bytes::from_static(b"{\"role\":\"invalid_role\"}"))
}
fn def(url: String) -> ProbeDefinition {
ProbeDefinition {
url,
method: Method::PATCH,
headers: json_headers(),
body: patch_body(),
}
}
async fn collect_until_verdict(
route_template: &str,
baseline_id: &str,
probe_id: &str,
addr: std::net::SocketAddr,
) -> OracleResult {
let client = HttpProbe::new();
let analyzer = ExistenceAnalyzer;
let baseline_url = format!("http://{addr}{}", route_template.replace("{id}", baseline_id));
let probe_url = format!("http://{addr}{}", route_template.replace("{id}", probe_id));
let mut probe_set = ProbeSet {
baseline: Vec::new(),
probe: Vec::new(),
};
loop {
let b = client.execute(&def(baseline_url.clone())).await.expect("baseline request failed");
let p = client.execute(&def(probe_url.clone())).await.expect("probe request failed");
probe_set.baseline.push(b);
probe_set.probe.push(p);
if let SampleDecision::Complete(result) = analyzer.evaluate(&probe_set) {
return result;
}
}
}
#[tokio::test]
async fn patch_422_vs_404_confirmed_high() {
let addr = spawn().await;
let result = collect_until_verdict("/resource/{id}", "42", "999", addr).await;
assert_eq!(result.verdict, OracleVerdict::Confirmed);
assert_eq!(result.severity, Some(Severity::High));
}
#[tokio::test]
async fn patch_422_vs_201_confirmed_high() {
let addr = spawn().await;
let result = collect_until_verdict("/creating/{id}", "42", "999", addr).await;
assert_eq!(result.verdict, OracleVerdict::Confirmed);
assert_eq!(result.severity, Some(Severity::High));
}
#[tokio::test]
async fn patch_normalized_not_present() {
let addr = spawn().await;
let result = collect_until_verdict("/normalized/{id}", "42", "999", addr).await;
assert_eq!(result.verdict, OracleVerdict::NotPresent);
assert_eq!(result.severity, None);
}
#[tokio::test]
async fn patch_200_vs_404_confirmed_high() {
let addr = spawn().await;
let result = collect_until_verdict("/success/{id}", "42", "999", addr).await;
assert_eq!(result.verdict, OracleVerdict::Confirmed);
assert_eq!(result.severity, Some(Severity::High));
assert!(result.label.is_some());
assert!(result.rfc_basis.is_some());
}
#[tokio::test]
async fn patch_204_vs_404_confirmed_medium() {
let addr = spawn().await;
let result = collect_until_verdict("/no-content/{id}", "42", "999", addr).await;
assert_eq!(result.verdict, OracleVerdict::Confirmed);
assert_eq!(result.severity, Some(Severity::Medium));
assert!(result.label.is_some());
assert!(result.rfc_basis.is_some());
}
#[tokio::test]
async fn patch_409_vs_404_confirmed_high() {
let addr = spawn().await;
let result = collect_until_verdict("/conflict/{id}", "42", "999", addr).await;
assert_eq!(result.verdict, OracleVerdict::Confirmed);
assert_eq!(result.severity, Some(Severity::High));
assert!(result.label.is_some());
assert!(result.rfc_basis.is_some());
}
#[tokio::test]
async fn patch_415_vs_404_confirmed_high() {
let addr = spawn().await;
let result = collect_until_verdict("/media/{id}", "42", "999", addr).await;
assert_eq!(result.verdict, OracleVerdict::Confirmed);
assert_eq!(result.severity, Some(Severity::High));
assert!(result.label.is_some());
assert!(result.rfc_basis.is_some());
}
#[tokio::test]
async fn patch_412_vs_404_confirmed_high() {
let addr = spawn().await;
let result = collect_until_verdict("/precondition/{id}", "42", "999", addr).await;
assert_eq!(result.verdict, OracleVerdict::Confirmed);
assert_eq!(result.severity, Some(Severity::High));
assert!(result.label.is_some());
assert!(result.rfc_basis.is_some());
}