use std::path::{Path, PathBuf};
use std::process::Command;
fn example_dir(name: &str) -> PathBuf {
Path::new(env!("CARGO_MANIFEST_DIR")).join("..").join(name)
}
fn in_repo_hub() -> PathBuf {
Path::new(env!("CARGO_MANIFEST_DIR"))
.join("..")
.join("hub/components")
}
struct Compiled {
code: Option<i32>,
stderr: String,
}
fn run_compile(project: &Path, extra_args: &[&std::ffi::OsStr]) -> Compiled {
let out = tempfile::tempdir().expect("tempdir");
let output = Command::new(env!("CARGO_BIN_EXE_warble"))
.arg("compile")
.arg(project)
.arg("--out")
.arg(out.path().join("ir.json"))
.args(extra_args)
.output()
.expect("warble compile runs");
Compiled {
code: output.status.code(),
stderr: String::from_utf8_lossy(&output.stderr).into_owned(),
}
}
#[test]
fn hub_dir_override_keeps_the_projects_local_override() {
let empty_hub = tempfile::tempdir().expect("tempdir");
let result = run_compile(
&example_dir("examples/driftwood-agent"),
&["--hub-dir".as_ref(), empty_hub.path().as_os_str()],
);
assert_eq!(
result.code,
Some(0),
"local answer_query override should resolve even with an empty hub; stderr: {}",
result.stderr
);
}
#[test]
fn hub_dir_override_replaces_the_real_hub() {
let empty_hub = tempfile::tempdir().expect("tempdir");
let result = run_compile(
&example_dir("examples/monitor-agent"),
&["--hub-dir".as_ref(), empty_hub.path().as_os_str()],
);
assert_eq!(result.code, Some(1), "unresolved component must fail");
assert!(
result.stderr.contains("monitor_freshness")
&& result.stderr.contains("not found in any configured source"),
"error should name the unresolved component and the searched sources; stderr: {}",
result.stderr
);
}
#[test]
fn component_dir_supplies_a_mounted_component() {
let empty_hub = tempfile::tempdir().expect("tempdir");
let result = run_compile(
&example_dir("examples/monitor-agent"),
&[
"--hub-dir".as_ref(),
empty_hub.path().as_os_str(),
"--component-dir".as_ref(),
in_repo_hub().as_os_str(),
],
);
assert_eq!(
result.code,
Some(0),
"monitor_freshness should resolve from the extra --component-dir; stderr: {}",
result.stderr
);
}
#[test]
fn component_dir_colliding_with_local_components_is_ambiguous() {
let result = run_compile(
&example_dir("examples/driftwood-agent"),
&["--component-dir".as_ref(), in_repo_hub().as_os_str()],
);
assert_eq!(result.code, Some(1), "ambiguous resolution must fail");
assert!(
result.stderr.contains("answer_query") && result.stderr.contains("ambiguous"),
"error should flag the ambiguous component; stderr: {}",
result.stderr
);
}