185 lines
5.0 KiB
Rust
185 lines
5.0 KiB
Rust
//! Integration tests for the `refs` command.
|
|
|
|
use assert_cmd::Command;
|
|
use predicates::prelude::*;
|
|
use std::path::PathBuf;
|
|
|
|
fn cargo_command() -> Command {
|
|
Command::cargo_bin("refs").expect("binary")
|
|
}
|
|
|
|
fn fixture_path(relative: &str) -> PathBuf {
|
|
PathBuf::from(env!("CARGO_MANIFEST_DIR"))
|
|
.join("..")
|
|
.join("..")
|
|
.join("fixtures")
|
|
.join("polyglot")
|
|
.join("repo")
|
|
.join(relative)
|
|
}
|
|
|
|
fn pwsh_command(script: impl AsRef<str>) -> Command {
|
|
let mut command = Command::new("pwsh");
|
|
command
|
|
.arg("-NoProfile")
|
|
.arg("-Command")
|
|
.arg(script.as_ref());
|
|
command
|
|
}
|
|
|
|
#[test]
|
|
fn emits_exact_use_sites_as_json() {
|
|
let mut command = cargo_command();
|
|
command
|
|
.arg("--json")
|
|
.arg("helper")
|
|
.arg(fixture_path(""))
|
|
.assert()
|
|
.success()
|
|
.stdout(predicate::str::contains(
|
|
"\"enclosing_qualified_name\":\"call_helper\"",
|
|
))
|
|
.stdout(predicate::str::contains("\"engine\":\"codeindex\""));
|
|
}
|
|
|
|
#[test]
|
|
fn groups_hits_by_callers() {
|
|
let mut command = cargo_command();
|
|
command
|
|
.args(["--callers", "helper"])
|
|
.arg(fixture_path(""))
|
|
.assert()
|
|
.success()
|
|
.stdout(predicate::str::contains("caller=call_helper"))
|
|
.stdout(predicate::str::contains("hits=2"));
|
|
}
|
|
|
|
#[test]
|
|
fn finds_powershell_callers_in_auto_mode() {
|
|
let mut command = cargo_command();
|
|
command
|
|
.args(["--callers", "--lang", "powershell", "Invoke-Helper"])
|
|
.arg(fixture_path("scripts/tools.ps1"))
|
|
.assert()
|
|
.success()
|
|
.stdout(predicate::str::contains("caller=Invoke-Formatting"));
|
|
}
|
|
|
|
#[test]
|
|
fn supports_anchor_resolution() {
|
|
let mut command = cargo_command();
|
|
command
|
|
.args(["--callers", "--at"])
|
|
.arg(format!("{}:22", fixture_path("src/lib.rs").display()))
|
|
.arg(fixture_path(""))
|
|
.assert()
|
|
.success()
|
|
.stdout(predicate::str::contains("caller=call_helper"));
|
|
}
|
|
|
|
#[test]
|
|
fn supports_powershell_pipeline_roots() {
|
|
let binary = assert_cmd::cargo::cargo_bin("refs");
|
|
let root = fixture_path("");
|
|
let script = format!(
|
|
"'{}' | & '{}' helper --json | ConvertFrom-Json | Select-Object -First 1 -ExpandProperty name",
|
|
root.display(),
|
|
binary.display()
|
|
);
|
|
let mut command = pwsh_command(script);
|
|
command
|
|
.assert()
|
|
.success()
|
|
.stdout(predicate::str::contains("helper"));
|
|
}
|
|
|
|
#[test]
|
|
fn accepts_jsonl_roots_from_stdin() {
|
|
let root = fixture_path("");
|
|
let mut command = cargo_command();
|
|
command
|
|
.args(["--json", "--input-format", "jsonl", "helper"])
|
|
.write_stdin(format!(
|
|
"{}\n",
|
|
serde_json::json!({ "path": root.display().to_string() })
|
|
))
|
|
.assert()
|
|
.success()
|
|
.stdout(predicate::str::contains("\"name\":\"helper\""))
|
|
.stdout(predicate::str::contains("\"path\":\""));
|
|
}
|
|
|
|
#[test]
|
|
fn reports_no_results_and_quiet_paths_in_text_mode() {
|
|
let root = fixture_path("");
|
|
|
|
let mut command = cargo_command();
|
|
command
|
|
.arg("totally_absent_symbol")
|
|
.arg(&root)
|
|
.assert()
|
|
.failure()
|
|
.stdout(predicate::str::contains("0 references"));
|
|
|
|
let mut callers = cargo_command();
|
|
callers
|
|
.args(["--callers", "--quiet", "totally_absent_symbol"])
|
|
.arg(root)
|
|
.assert()
|
|
.failure()
|
|
.stdout(predicate::str::is_empty());
|
|
}
|
|
|
|
#[test]
|
|
fn applies_language_filters_and_limits_to_json_output() {
|
|
let root = fixture_path("");
|
|
let mut command = cargo_command();
|
|
let assert = command
|
|
.args([
|
|
"--json",
|
|
"--lang",
|
|
"python,typescript",
|
|
"--limit",
|
|
"1",
|
|
"helper",
|
|
])
|
|
.arg(root)
|
|
.assert()
|
|
.success();
|
|
|
|
let stdout = String::from_utf8(assert.get_output().stdout.clone()).expect("utf8");
|
|
let uses = serde_json::from_str::<Vec<serde_json::Value>>(&stdout).expect("json");
|
|
assert_eq!(uses.len(), 1);
|
|
let path = uses[0]
|
|
.get("path")
|
|
.and_then(serde_json::Value::as_str)
|
|
.expect("path");
|
|
assert!(path.ends_with("worker.py") || path.ends_with("app.ts"));
|
|
assert!(!path.ends_with("lib.rs"));
|
|
assert!(!path.ends_with("app.js"));
|
|
}
|
|
|
|
#[test]
|
|
fn text_engine_reports_text_use_sites() {
|
|
let mut command = cargo_command();
|
|
command
|
|
.args(["--json", "--engine", "text", "helper"])
|
|
.arg(fixture_path("src/lib.rs"))
|
|
.assert()
|
|
.success()
|
|
.stdout(predicate::str::contains("\"engine\":\"text\""))
|
|
.stdout(predicate::str::contains("\"name\":\"helper\""));
|
|
}
|
|
|
|
#[test]
|
|
fn help_includes_examples_and_pipeline_usage() {
|
|
let mut command = cargo_command();
|
|
command
|
|
.arg("--help")
|
|
.assert()
|
|
.success()
|
|
.stdout(predicate::str::contains("--callers"))
|
|
.stdout(predicate::str::contains("ConvertFrom-Json"))
|
|
.stdout(predicate::str::contains("refs helper"));
|
|
}
|