use std::process::Command;
fn cargo_bin() -> std::path::PathBuf {
let bin = env!("CARGO_BIN_EXE_reflectapi");
std::path::PathBuf::from(bin)
}
fn demo_schema() -> std::path::PathBuf {
std::path::PathBuf::from(env!("CARGO_MANIFEST_DIR"))
.parent()
.unwrap()
.join("reflectapi-demo")
.join("reflectapi.json")
}
fn run(args: &[&str]) -> std::process::Output {
Command::new(cargo_bin())
.args(args)
.output()
.expect("spawn reflectapi")
}
#[test]
fn ts_output_into_fresh_directory() {
let tmp = tempfile::tempdir().unwrap();
let target = tmp.path().join("brand-new-dir");
let schema = demo_schema();
let out = run(&[
"codegen",
"--language",
"typescript",
"--schema",
schema.to_str().unwrap(),
"--output",
target.to_str().unwrap(),
]);
assert!(
out.status.success(),
"exit={:?}\nstderr:\n{}",
out.status.code(),
String::from_utf8_lossy(&out.stderr)
);
assert!(target.is_dir(), "expected fresh dir to be created");
assert!(target.join("generated.ts").is_file());
assert!(target.join("generated.transport.ts").is_file());
}
#[test]
fn python_output_into_fresh_directory() {
let tmp = tempfile::tempdir().unwrap();
let target = tmp.path().join("python-client");
let schema = demo_schema();
let out = run(&[
"codegen",
"--language",
"python",
"--schema",
schema.to_str().unwrap(),
"--output",
target.to_str().unwrap(),
]);
assert!(
out.status.success(),
"exit={:?}\nstderr:\n{}",
out.status.code(),
String::from_utf8_lossy(&out.stderr)
);
assert!(target.is_dir());
assert!(target.join("generated.py").is_file());
assert!(target.join("__init__.py").is_file());
}
#[test]
fn ts_output_to_file_path_writes_siblings() {
let tmp = tempfile::tempdir().unwrap();
let target = tmp.path().join("generated.ts");
let schema = demo_schema();
let out = run(&[
"codegen",
"--language",
"typescript",
"--schema",
schema.to_str().unwrap(),
"--output",
target.to_str().unwrap(),
]);
assert!(
out.status.success(),
"stderr:\n{}",
String::from_utf8_lossy(&out.stderr)
);
assert!(target.is_file(), "primary file at requested path");
assert!(tmp.path().join("generated.transport.ts").is_file());
}
#[test]
fn ts_stdout_emits_primary_file_not_transport() {
let schema = demo_schema();
let out = run(&[
"codegen",
"--language",
"typescript",
"--schema",
schema.to_str().unwrap(),
"--output",
"-",
]);
assert!(out.status.success());
let stdout = String::from_utf8_lossy(&out.stdout);
assert!(
stdout.contains("export function client(") || stdout.contains("export function client "),
"expected stdout to be generated.ts (with the `client` factory). got:\n{stdout}",
);
}
#[test]
fn python_stdout_emits_generated_not_init() {
let schema = demo_schema();
let out = run(&[
"codegen",
"--language",
"python",
"--schema",
schema.to_str().unwrap(),
"--output",
"-",
]);
assert!(out.status.success());
let stdout = String::from_utf8_lossy(&out.stdout);
assert!(
stdout.contains("from ._rebuild import rebuild_models")
&& stdout.contains("from .myapi.proto import"),
"expected stdout to be generated.py compatibility facade. got:\n{stdout}",
);
}