use super::*;
#[test]
fn check_node_loads_package_json_config() {
let tmp = TempDir::new().unwrap();
let pkg = tmp.path().join("package.json");
fs::write(
&pkg,
r#"{
"schemalint": {
"profiles": ["openai.so.2026-04-30"],
"include": ["src/**/*.ts"]
}
}"#,
)
.unwrap();
let mut cmd = Command::cargo_bin("schemalint").unwrap();
cmd.current_dir(tmp.path());
let output = cmd.args(["check-node"]).output().unwrap();
let stderr = String::from_utf8_lossy(&output.stderr);
assert!(!stderr.contains("no sources specified."));
}
#[test]
fn check_node_cli_overrides_package_json_profiles() {
let tmp = TempDir::new().unwrap();
let pkg = tmp.path().join("package.json");
fs::write(
&pkg,
r#"{
"schemalint": {
"profiles": ["anthropic.so.2026-04-30"],
"include": ["src/**/*.ts"]
}
}"#,
)
.unwrap();
let mut cmd = Command::cargo_bin("schemalint").unwrap();
cmd.current_dir(tmp.path());
let output = cmd
.args(["check-node", "--profile", "openai.so.2026-04-30"])
.output()
.unwrap();
let stderr = String::from_utf8_lossy(&output.stderr);
assert!(!stderr.contains("no profiles specified."));
}
#[test]
fn check_node_invalid_package_json_errors() {
let tmp = TempDir::new().unwrap();
let pkg = tmp.path().join("package.json");
fs::write(&pkg, "this is not valid json {{{").unwrap();
let mut cmd = Command::cargo_bin("schemalint").unwrap();
cmd.current_dir(tmp.path());
let output = cmd.args(["check-node"]).output().unwrap();
assert!(!output.status.success());
let stderr = String::from_utf8_lossy(&output.stderr);
assert!(stderr.contains("invalid JSON in"));
}
#[test]
fn check_node_missing_package_json_no_config_ok() {
let tmp = TempDir::new().unwrap();
let mut cmd = Command::cargo_bin("schemalint").unwrap();
cmd.current_dir(tmp.path());
let output = cmd
.args(["check-node", "--profile", "openai.so.2026-04-30"])
.output()
.unwrap();
assert!(!output.status.success());
let stderr = String::from_utf8_lossy(&output.stderr);
assert!(stderr.contains("no sources specified."));
}
#[test]
fn check_node_package_json_schemalint_no_include_errors() {
let tmp = TempDir::new().unwrap();
let pkg = tmp.path().join("package.json");
fs::write(
&pkg,
r#"{
"schemalint": {
"profiles": ["openai.so.2026-04-30"]
}
}"#,
)
.unwrap();
let mut cmd = Command::cargo_bin("schemalint").unwrap();
cmd.current_dir(tmp.path());
let output = cmd.args(["check-node"]).output().unwrap();
assert!(
!output.status.success(),
"exit code should be 1 when include is empty"
);
let stderr = String::from_utf8_lossy(&output.stderr);
assert!(
stderr.contains("no sources specified."),
"expected 'no sources specified.' in stderr, got:\n{stderr}"
);
}
#[test]
fn check_node_explicit_config_invalid_json_errors() {
let tmp = TempDir::new().unwrap();
let custom_config = tmp.path().join("custom-package.json");
fs::write(&custom_config, "{ definitely: not: valid: json }").unwrap();
let mut cmd = Command::cargo_bin("schemalint").unwrap();
cmd.current_dir(tmp.path());
let output = cmd
.args([
"check-node",
"--config",
custom_config.to_str().unwrap(),
"--profile",
"openai.so.2026-04-30",
"--source",
"src/**/*.ts",
])
.output()
.unwrap();
assert!(
!output.status.success(),
"exit code should be 1 for malformed --config JSON"
);
let stderr = String::from_utf8_lossy(&output.stderr);
assert!(
stderr.contains("invalid JSON in"),
"expected 'invalid JSON in' in stderr, got:\n{stderr}"
);
assert!(
stderr.contains("custom-package.json"),
"expected config filename in error message, got:\n{stderr}"
);
}
#[test]
fn check_node_explicit_config_nonexistent_falls_through_to_no_sources() {
let tmp = TempDir::new().unwrap();
let nonexistent_config = tmp.path().join("does-not-exist.json");
assert!(!nonexistent_config.exists());
let mut cmd = Command::cargo_bin("schemalint").unwrap();
cmd.current_dir(tmp.path());
let output = cmd
.args([
"check-node",
"--config",
nonexistent_config.to_str().unwrap(),
"--profile",
"openai.so.2026-04-30",
])
.output()
.unwrap();
assert!(
!output.status.success(),
"exit code should be 1 (no sources)"
);
let stderr = String::from_utf8_lossy(&output.stderr);
assert!(
stderr.contains("no sources specified."),
"expected 'no sources specified.' (not a read error), got:\n{stderr}"
);
assert!(
!stderr.contains("failed to read"),
"nonexistent --config should NOT produce a read error, got:\n{stderr}"
);
}