mod common;
use common::sqry_bin;
use assert_cmd::Command;
use predicates::prelude::*;
use sqry_core::test_support::verbosity;
use std::path::PathBuf;
use std::sync::Once;
static INIT: Once = Once::new();
fn init_logging() {
INIT.call_once(|| {
verbosity::init(env!("CARGO_PKG_NAME"));
});
}
fn fixture_path() -> PathBuf {
let manifest_dir = env!("CARGO_MANIFEST_DIR");
PathBuf::from(manifest_dir)
.parent()
.unwrap()
.join("test-fixtures/cli-basic")
}
#[test]
fn test_version_flag() {
let path = sqry_bin();
let mut cmd = Command::new(path);
cmd.arg("--version")
.assert()
.success()
.stdout(predicate::str::contains("sqry"));
}
#[test]
fn test_help_flag() {
let path = sqry_bin();
let mut cmd = Command::new(path);
cmd.arg("--help")
.assert()
.success()
.stdout(predicate::str::contains("Usage:"));
}
#[test]
fn test_query_help() {
let path = sqry_bin();
let mut cmd = Command::new(path);
cmd.arg("query")
.arg("--help")
.assert()
.success()
.stdout(predicate::str::contains("query"));
}
#[test]
fn test_simple_query() {
init_logging();
log::info!("Testing simple CLI query execution (kind:function)");
let path = sqry_bin();
let fixture = fixture_path();
let mut cmd = Command::new(path);
cmd.arg("query")
.arg("kind:function")
.arg(&fixture)
.assert()
.success();
log::info!("✓ Simple query completed successfully");
}
#[test]
fn test_query_with_explain() {
let path = sqry_bin();
let mut cmd = Command::new(path);
cmd.arg("query")
.arg("kind:function")
.arg(".")
.arg("--explain")
.assert()
.success()
.stderr(predicate::str::contains("Query Plan:"));
}
#[test]
fn test_query_with_verbose() {
let path = sqry_bin();
let fixture = fixture_path();
let mut cmd = Command::new(path);
cmd.arg("query")
.arg("kind:function")
.arg(&fixture)
.arg("-v")
.assert()
.success()
.stderr(predicate::str::contains("Query executed"));
}
#[test]
fn test_query_syntax_error_exit_code() {
init_logging();
log::info!("Testing query syntax error handling (exit code 2)");
let path = sqry_bin();
let mut cmd = Command::new(path);
cmd.arg("--semantic") .arg("query")
.arg("kind:") .arg(".")
.assert()
.failure()
.code(2);
log::info!("✓ Syntax error correctly returned exit code 2");
}
#[test]
fn test_query_invalid_predicate_exit_code() {
let path = sqry_bin();
let mut cmd = Command::new(path);
cmd.arg("--semantic") .arg("query")
.arg("unknown_field:value")
.arg(".")
.assert()
.failure()
.code(2); }
#[test]
fn test_query_empty_value_exit_code() {
let path = sqry_bin();
let mut cmd = Command::new(path);
cmd.arg("--semantic") .arg("query")
.arg("kind:")
.arg(".")
.assert()
.failure()
.code(2); }
#[test]
fn test_successful_query_exit_code_zero() {
init_logging();
log::info!("Testing successful query returns exit code 0");
let path = sqry_bin();
let fixture = fixture_path();
let mut cmd = Command::new(path);
cmd.arg("query")
.arg("kind:function")
.arg(&fixture)
.assert()
.success()
.code(0);
log::info!("✓ Successful query correctly returned exit code 0");
}