use std::io::Read;
fn get(url: &str) -> String {
let mut body = String::new();
ureq::get(url)
.call()
.unwrap_or_else(|error| panic!("GET {url}: {error}"))
.into_body()
.into_reader()
.read_to_string(&mut body)
.unwrap();
body
}
#[test]
fn every_scenario_passes_against_a_local_durable_object() {
let Ok(base) = std::env::var("DO_WORKER_URL") else {
eprintln!("DO_WORKER_URL is unset; skipping -- run `make test-worker`");
return;
};
let base = base.trim_end_matches('/');
let scenarios: Vec<String> = serde_json::from_str(&get(base)).unwrap();
assert!(!scenarios.is_empty(), "the Worker lists no scenarios");
let failures: Vec<String> = scenarios
.iter()
.filter_map(|name| {
let body = get(&format!("{base}/{name}"));
match serde_json::from_str::<serde_json::Value>(&body) {
Ok(outcome) if outcome["ok"] == true => None,
Ok(outcome) => Some(format!("{name}: {}", outcome["error"])),
Err(_) => Some(format!("{name}: {body}")),
}
})
.collect();
assert!(failures.is_empty(), "failed:\n{}", failures.join("\n"));
eprintln!("{} scenarios passed", scenarios.len());
}