#![cfg(all(feature = "git", feature = "sql"))]
mod common;
use predicates::prelude::*;
fn prolly(dir: &std::path::Path) -> assert_cmd::Command {
common::git_prolly_cmd(dir)
}
#[test]
fn test_cli_init_creates_store() {
let (_temp, dataset) = common::setup_cli_env();
prolly(&dataset).arg("init").assert().success();
let config_path = dataset.join("prolly_config_tree_config");
assert!(
config_path.exists(),
"prolly config should exist after init at {:?}",
config_path
);
}
#[test]
fn test_cli_set_get_roundtrip() {
let (_temp, dataset) = common::setup_cli_env();
prolly(&dataset).arg("init").assert().success();
prolly(&dataset)
.args(["set", "mykey", "myvalue"])
.assert()
.success();
prolly(&dataset)
.args(["get", "mykey"])
.assert()
.success()
.stdout(predicate::str::contains("myvalue"));
}
#[test]
fn test_cli_set_commit_get_lifecycle() {
let (_temp, dataset) = common::setup_cli_env();
prolly(&dataset).arg("init").assert().success();
prolly(&dataset)
.args(["set", "k1", "v1"])
.assert()
.success();
prolly(&dataset)
.args(["set", "k2", "v2"])
.assert()
.success();
prolly(&dataset)
.args(["commit", "-m", "add k1 and k2"])
.assert()
.success();
prolly(&dataset)
.args(["get", "k1"])
.assert()
.success()
.stdout(predicate::str::contains("v1"));
prolly(&dataset)
.args(["get", "k2"])
.assert()
.success()
.stdout(predicate::str::contains("v2"));
}
#[test]
fn test_cli_delete_and_status() {
let (_temp, dataset) = common::setup_cli_env();
prolly(&dataset).arg("init").assert().success();
prolly(&dataset)
.args(["set", "delme", "gone"])
.assert()
.success();
prolly(&dataset)
.args(["commit", "-m", "add delme"])
.assert()
.success();
prolly(&dataset)
.args(["delete", "delme"])
.assert()
.success();
prolly(&dataset)
.arg("status")
.assert()
.success()
.stdout(predicate::str::contains("delme"));
}
#[test]
fn test_cli_list_keys() {
let (_temp, dataset) = common::setup_cli_env();
prolly(&dataset).arg("init").assert().success();
for i in 0..5 {
prolly(&dataset)
.args(["set", &format!("key{i}"), &format!("val{i}")])
.assert()
.success();
}
prolly(&dataset)
.args(["commit", "-m", "add keys"])
.assert()
.success();
let output = prolly(&dataset).arg("list").output().expect("list failed");
let stdout = String::from_utf8_lossy(&output.stdout);
for i in 0..5 {
assert!(
stdout.contains(&format!("key{i}")),
"list should contain key{i}"
);
}
let output = prolly(&dataset)
.args(["list", "--values"])
.output()
.expect("list --values failed");
let stdout = String::from_utf8_lossy(&output.stdout);
assert!(stdout.contains("val0"), "list --values should show values");
}
#[test]
fn test_cli_stats() {
let (_temp, dataset) = common::setup_cli_env();
prolly(&dataset).arg("init").assert().success();
for i in 0..10 {
prolly(&dataset)
.args(["set", &format!("s{i}"), &format!("v{i}")])
.assert()
.success();
}
prolly(&dataset)
.args(["commit", "-m", "data"])
.assert()
.success();
prolly(&dataset).arg("stats").assert().success();
}
#[test]
fn test_cli_get_nonexistent_key_exits_nonzero() {
let (_temp, dataset) = common::setup_cli_env();
prolly(&dataset).arg("init").assert().success();
prolly(&dataset)
.args(["get", "does_not_exist"])
.assert()
.failure();
}
#[test]
fn test_cli_commit_empty_staging() {
let (_temp, dataset) = common::setup_cli_env();
prolly(&dataset).arg("init").assert().success();
let output = prolly(&dataset)
.args(["commit", "-m", "empty"])
.output()
.expect("commit failed");
let combined = format!(
"{}{}",
String::from_utf8_lossy(&output.stdout),
String::from_utf8_lossy(&output.stderr)
);
assert!(
combined.to_lowercase().contains("no")
|| combined.to_lowercase().contains("empty")
|| combined.to_lowercase().contains("nothing"),
"commit of empty staging should indicate nothing to do, got: {combined}"
);
}
#[cfg(feature = "sql")]
#[test]
fn test_cli_sql_create_and_select() {
let (_temp, dataset) = common::setup_cli_env();
prolly(&dataset).arg("init").assert().success();
prolly(&dataset)
.args(["sql", "CREATE TABLE users (id INTEGER, name TEXT)"])
.assert()
.success();
prolly(&dataset)
.args(["sql", "INSERT INTO users VALUES (1, 'Alice')"])
.assert()
.success();
prolly(&dataset)
.args(["sql", "SELECT * FROM users"])
.assert()
.success()
.stdout(predicate::str::contains("Alice"));
}
#[cfg(feature = "sql")]
#[test]
fn test_cli_sql_json_output() {
let (_temp, dataset) = common::setup_cli_env();
prolly(&dataset).arg("init").assert().success();
prolly(&dataset)
.args(["sql", "CREATE TABLE items (id INTEGER, name TEXT)"])
.assert()
.success();
prolly(&dataset)
.args(["sql", "INSERT INTO items VALUES (1, 'Widget')"])
.assert()
.success();
prolly(&dataset)
.args(["sql", "--format", "json", "SELECT * FROM items"])
.assert()
.success()
.stdout(predicate::str::contains("Widget"));
}
#[test]
fn test_cli_clear_with_confirm() {
let (_temp, dataset) = common::setup_cli_env();
prolly(&dataset).arg("init").assert().success();
prolly(&dataset)
.args(["set", "clearme", "val"])
.assert()
.success();
prolly(&dataset)
.args(["commit", "-m", "add data"])
.assert()
.success();
prolly(&dataset)
.args(["clear", "--confirm"])
.assert()
.success();
prolly(&dataset).args(["get", "clearme"]).assert().failure();
}
#[test]
fn test_cli_history_for_key() {
let (_temp, dataset) = common::setup_cli_env();
prolly(&dataset).arg("init").assert().success();
prolly(&dataset)
.args(["set", "tracked", "v1"])
.assert()
.success();
prolly(&dataset)
.args(["commit", "-m", "first"])
.assert()
.success();
prolly(&dataset)
.args(["set", "tracked", "v2"])
.assert()
.success();
prolly(&dataset)
.args(["commit", "-m", "second"])
.assert()
.success();
prolly(&dataset)
.args(["history", "tracked"])
.assert()
.success()
.stdout(predicate::str::contains("first").and(predicate::str::contains("second")));
}
#[test]
fn test_cli_show_at_commit() {
let (_temp, dataset) = common::setup_cli_env();
prolly(&dataset).arg("init").assert().success();
prolly(&dataset)
.args(["set", "showkey", "showval"])
.assert()
.success();
prolly(&dataset)
.args(["commit", "-m", "show test"])
.assert()
.success();
prolly(&dataset)
.args(["show", "HEAD"])
.assert()
.success()
.stdout(predicate::str::contains("showkey"));
}