mod common;
use common::sqry_bin;
use assert_cmd::Command;
use tempfile::TempDir;
#[test]
fn cli_scope_type_module_filters_functions_in_module() {
let project = TempDir::new().unwrap();
let rust_code = r#"
mod database {
pub fn connect() {
println!("Connecting to database");
}
pub fn disconnect() {
println!("Disconnecting from database");
}
}
fn helper() {
println!("Top-level helper");
}
"#;
std::fs::write(project.path().join("lib.rs"), rust_code).unwrap();
Command::new(sqry_bin())
.arg("index")
.arg(project.path())
.assert()
.success();
let output = Command::new(sqry_bin())
.arg("query")
.arg("scope.type:module")
.arg(project.path())
.assert()
.success()
.get_output()
.stdout
.clone();
let stdout = String::from_utf8_lossy(&output);
assert!(
stdout.contains("connect"),
"Expected 'connect' in module scope. Actual output:\n{stdout}"
);
assert!(
stdout.contains("disconnect"),
"Expected 'disconnect' in module scope"
);
assert!(
!stdout.contains("helper"),
"Top-level 'helper' should not be in module scope"
);
}
#[test]
fn cli_scope_type_class_filters_methods() {
let project = TempDir::new().unwrap();
let rust_code = r#"
struct Connection {
host: String,
port: u16,
}
impl Connection {
fn new(host: String, port: u16) -> Self {
Connection { host, port }
}
fn connect(&self) {
println!("Connecting to {}:{}", self.host, self.port);
}
}
fn global_init() {
println!("Initializing");
}
"#;
std::fs::write(project.path().join("connection.rs"), rust_code).unwrap();
Command::new(sqry_bin())
.arg("index")
.arg(project.path())
.assert()
.success();
let output = Command::new(sqry_bin())
.arg("query")
.arg("kind:method")
.arg(project.path())
.assert()
.success()
.get_output()
.stdout
.clone();
let stdout = String::from_utf8_lossy(&output);
assert!(stdout.contains("new"), "Expected 'new' method");
assert!(stdout.contains("connect"), "Expected 'connect' method");
assert!(
!stdout.contains("global_init"),
"Global 'global_init' should not be a method"
);
}
#[test]
fn cli_scope_ancestor_matches_nested_methods() {
let project = TempDir::new().unwrap();
let rust_code = r#"
mod network {
mod client {
pub fn connect() {
println!("Connecting via client");
}
pub fn disconnect() {
println!("Disconnecting client");
}
}
mod server {
pub fn start() {
println!("Starting server");
}
}
}
mod database {
pub fn connect() {
println!("Connecting to database");
}
}
"#;
std::fs::write(project.path().join("app.rs"), rust_code).unwrap();
Command::new(sqry_bin())
.arg("index")
.arg(project.path())
.assert()
.success();
let output = Command::new(sqry_bin())
.arg("query")
.arg("scope.ancestor:network")
.arg(project.path())
.assert()
.success()
.get_output()
.stdout
.clone();
let stdout = String::from_utf8_lossy(&output);
assert!(
stdout.contains("connect"),
"Expected 'connect' from network::client"
);
assert!(
stdout.contains("disconnect"),
"Expected 'disconnect' from network::client"
);
assert!(
stdout.contains("start"),
"Expected 'start' from network::server"
);
let match_count = stdout.matches("function").count();
assert_eq!(
match_count, 3,
"Expected exactly 3 functions with network ancestor"
);
}
#[test]
fn cli_scope_type_with_name_composition() {
let project = TempDir::new().unwrap();
let rust_code = r#"
mod database {
pub fn connect() {
println!("DB connect");
}
pub fn disconnect() {
println!("DB disconnect");
}
pub fn migrate() {
println!("DB migrate");
}
}
"#;
std::fs::write(project.path().join("db.rs"), rust_code).unwrap();
Command::new(sqry_bin())
.arg("index")
.arg(project.path())
.assert()
.success();
let output = Command::new(sqry_bin())
.arg("query")
.arg("scope.type:module AND name:connect")
.arg(project.path())
.assert()
.success()
.get_output()
.stdout
.clone();
let stdout = String::from_utf8_lossy(&output);
assert!(stdout.contains("connect"), "Expected 'connect' in results");
assert!(
!stdout.contains("disconnect"),
"'disconnect' should not match name:connect filter"
);
assert!(
!stdout.contains("migrate"),
"'migrate' should not match name:connect filter"
);
}
#[test]
fn cli_scope_ancestor_with_name_composition() {
let project = TempDir::new().unwrap();
let rust_code = r#"
mod network {
mod client {
pub fn connect() {
println!("Client connect");
}
pub fn send() {
println!("Client send");
}
}
}
mod database {
pub fn connect() {
println!("Database connect");
}
}
"#;
std::fs::write(project.path().join("services.rs"), rust_code).unwrap();
Command::new(sqry_bin())
.arg("index")
.arg(project.path())
.assert()
.success();
let output = Command::new(sqry_bin())
.arg("query")
.arg("scope.ancestor:network AND name:connect")
.arg(project.path())
.assert()
.success()
.get_output()
.stdout
.clone();
let stdout = String::from_utf8_lossy(&output);
assert!(
stdout.contains("connect"),
"Expected 'connect' with network ancestor"
);
assert!(
!stdout.contains("send"),
"'send' should not match name:connect filter"
);
}
#[test]
fn cli_scope_not_test_scopes() {
let project = TempDir::new().unwrap();
let rust_code = r#"
#[cfg(test)]
mod tests {
fn test_helper() {
assert!(true);
}
#[test]
fn test_connection() {
assert!(true);
}
}
mod app {
pub fn run() {
println!("Running app");
}
pub fn init() {
println!("Initializing app");
}
}
"#;
std::fs::write(project.path().join("main.rs"), rust_code).unwrap();
Command::new(sqry_bin())
.arg("index")
.arg(project.path())
.assert()
.success();
let output = Command::new(sqry_bin())
.arg("query")
.arg("kind:function AND NOT scope.name:tests")
.arg(project.path())
.assert()
.success()
.get_output()
.stdout
.clone();
let stdout = String::from_utf8_lossy(&output);
assert!(stdout.contains("run"), "Expected 'run' not in test scope");
assert!(stdout.contains("init"), "Expected 'init' not in test scope");
assert!(
!stdout.contains("test_helper"),
"'test_helper' should not appear (in tests scope)"
);
assert!(
!stdout.contains("test_connection"),
"'test_connection' should not appear (in tests scope)"
);
}
#[test]
fn cli_scope_parent_filters_direct_children() {
let project = TempDir::new().unwrap();
let rust_code = r#"
mod network {
pub fn top_level() {
println!("Top level in network");
}
mod client {
pub fn connect() {
println!("Client connect");
}
}
}
"#;
std::fs::write(project.path().join("net.rs"), rust_code).unwrap();
Command::new(sqry_bin())
.arg("index")
.arg(project.path())
.assert()
.success();
let output = Command::new(sqry_bin())
.arg("query")
.arg("scope.parent:network")
.arg(project.path())
.assert()
.success()
.get_output()
.stdout
.clone();
let stdout = String::from_utf8_lossy(&output);
assert!(
stdout.contains("top_level"),
"Expected 'top_level' with parent:network"
);
assert!(
!stdout.contains("connect"),
"'connect' should not appear (parent is client, not network)"
);
}