use std::process::Command;
#[test]
fn cli_lint_test_doc_prints_single_info_line() {
let dir = tempfile::tempdir().expect("tempdir");
let doc = dir.path().join("demo.test.yaml");
std::fs::write(&doc, "routeFiles: [x]\nexpects: {}\n").expect("write demo.test.yaml");
let output = Command::new(env!("CARGO_BIN_EXE_camel"))
.args(["lint", doc.to_str().expect("path is valid utf-8")])
.output()
.expect("failed to spawn `camel lint`");
let stdout = String::from_utf8_lossy(&output.stdout);
let stderr = String::from_utf8_lossy(&output.stderr);
assert!(
output.status.success(),
"linting a test document must exit 0; stdout:\n{stdout}\nstderr:\n{stderr}"
);
let lines: Vec<&str> = stdout.lines().collect();
assert_eq!(
lines.len(),
1,
"stdout must be exactly one info line; got:\n{stdout}"
);
assert!(
lines[0].contains("demo.test.yaml"),
"info line must name the file; got: {}",
lines[0]
);
assert!(
lines[0].contains("camel test document"),
"info line must state the skip reason; got: {}",
lines[0]
);
assert!(
stderr.is_empty(),
"skip path must emit no diagnostics to stderr; got:\n{stderr}"
);
}
#[test]
fn mock_rule_warning_does_not_affect_exit_code() {
let dir = tempfile::tempdir().expect("tempdir");
let route = dir.path().join("route.yaml");
std::fs::write(
&route,
"id: r1\nfrom: direct:start\nsteps:\n - to: mock:out\n",
)
.expect("write route.yaml");
let output = Command::new(env!("CARGO_BIN_EXE_camel"))
.args(["lint", route.to_str().expect("path is valid utf-8")])
.output()
.expect("failed to spawn `camel lint`");
let stdout = String::from_utf8_lossy(&output.stdout);
let stderr = String::from_utf8_lossy(&output.stderr);
assert!(
output.status.success(),
"a Warning-only finding must exit 0; stdout:\n{stdout}\nstderr:\n{stderr}"
);
assert!(
stderr.contains("R-MOCK-IN-PRODUCTION"),
"the R-MOCK-IN-PRODUCTION warning must be printed; got:\n{stderr}"
);
}
#[test]
fn fixture_path_suppresses_only_mock_rule() {
let dir = tempfile::tempdir().expect("tempdir");
let fixture_dir = dir.path().join("tests").join("fixtures");
std::fs::create_dir_all(&fixture_dir).expect("create tests/fixtures");
let route = fixture_dir.join("route.yaml");
std::fs::write(
&route,
"id: r1\nfrom: direct:start\nsteps:\n - to: mock:result\n - to: \"log:bar?showCorrelationId=1\"\n",
)
.expect("write fixture route.yaml");
let output = Command::new(env!("CARGO_BIN_EXE_camel"))
.args(["lint", route.to_str().expect("path is valid utf-8")])
.output()
.expect("failed to spawn `camel lint`");
let stdout = String::from_utf8_lossy(&output.stdout);
let stderr = String::from_utf8_lossy(&output.stderr);
assert!(
!output.status.success(),
"an unknown-option Error must exit non-zero; stdout:\n{stdout}\nstderr:\n{stderr}"
);
assert!(
!stderr.contains("R-MOCK-IN-PRODUCTION"),
"fixture-path exemption must suppress R-MOCK-IN-PRODUCTION; got:\n{stderr}"
);
assert!(
stderr.contains("R-URI-known:unknown-option"),
"the unknown-option Error must still be emitted; got:\n{stderr}"
);
}
#[test]
fn test_doc_with_mock_intercepts_skipped_no_rmock() {
let dir = tempfile::tempdir().expect("tempdir");
let doc = dir.path().join("demo.test.yaml");
std::fs::write(
&doc,
"routeFiles: [x]\nintercepts: {kafka:x: {skipTo: mock:y}}\nexpects: {}\n",
)
.expect("write demo.test.yaml");
let output = Command::new(env!("CARGO_BIN_EXE_camel"))
.args(["lint", doc.to_str().expect("path is valid utf-8")])
.output()
.expect("failed to spawn `camel lint`");
let stdout = String::from_utf8_lossy(&output.stdout);
let stderr = String::from_utf8_lossy(&output.stderr);
assert!(
output.status.success(),
"linting a test document must exit 0; stdout:\n{stdout}\nstderr:\n{stderr}"
);
assert!(
stdout.contains("camel test document"),
"info line must state the skip reason; got:\n{stdout}"
);
assert!(
!stderr.contains("R-MOCK-IN-PRODUCTION"),
"a skipped test document must emit no R-MOCK-IN-PRODUCTION; got:\n{stderr}"
);
assert!(
!stdout.contains("R-MOCK-IN-PRODUCTION"),
"a skipped test document must print no R-MOCK-IN-PRODUCTION; got:\n{stdout}"
);
}