minkv 0.3.0

一个轻量级持久化键值存储,支持内存和文件后端,提供 CLI 和 TCP 服务器
Documentation
//! CLI 集成测试:验证通过命令行二进制文件的持久化流程。
//!
//! 测试场景:
//! - `set` → `get` → `remove` → `get` 的完整生命周期。
//! - 确保错误输出符合预期。

use std::process::Command;
use tempfile::tempdir;

/// 在给定的工作目录下运行 `minkv` 二进制,返回标准输出和标准错误。
///
/// # 参数
/// - `dir`:工作目录路径,用于定位要读写的 `store.json`。
/// - `args`:命令行参数切片。
///
/// # 返回
/// 包含标准输出和标准错误字符串的元组。
fn run_cli(dir: &std::path::Path, args: &[&str]) -> (String, String) {
    let exe = env!("CARGO_BIN_EXE_minkv");
    let output = Command::new(exe)
        .args(args)
        .current_dir(dir)
        .output()
        .expect("无法运行 minkv 二进制文件");
    let stdout = String::from_utf8(output.stdout).unwrap();
    let stderr = String::from_utf8(output.stderr).unwrap();
    (stdout, stderr)
}

/// 测试完整的持久化流程:设置 → 获取 → 删除 → 再次获取应失败。
#[test]
fn test_cli_persistence() {
    let dir = tempdir().unwrap();

    // 设置键值
    let (stdout, stderr) = run_cli(dir.path(), &["set", "hello", "world"]);
    assert!(stderr.is_empty(), "stderr should be empty, got: {}", stderr);
    assert_eq!(stdout.trim(), "OK");

    // 获取键值
    let (stdout, stderr) = run_cli(dir.path(), &["get", "hello"]);
    assert!(stderr.is_empty());
    assert_eq!(stdout.trim(), "world");

    // 删除键值
    let (stdout, stderr) = run_cli(dir.path(), &["remove", "hello"]);
    assert!(stderr.is_empty());
    assert_eq!(stdout.trim(), "OK");

    // 再次获取应失败
    let (stdout, stderr) = run_cli(dir.path(), &["get", "hello"]);
    assert!(stdout.is_empty());
    assert!(stderr.contains("键不存在"));
}