refactor: improve test structure and reliability
This commit is contained in:
committed by
Andrew Phillips (aider)
parent
eaf341cdfb
commit
d9072d22d5
447
src/tests.rs
447
src/tests.rs
@@ -3,7 +3,7 @@ mod tests {
|
||||
use std::fs;
|
||||
use std::path::Path;
|
||||
use std::process::Command;
|
||||
|
||||
|
||||
use tempfile::tempdir;
|
||||
|
||||
// Helper function to run a command in sh -c
|
||||
@@ -23,13 +23,13 @@ mod tests {
|
||||
{
|
||||
let dir = tempdir().expect("Failed to create temporary directory");
|
||||
let _db_path = dir.path().join("keep-1.db");
|
||||
|
||||
|
||||
// Create the data directory structure
|
||||
fs::create_dir_all(dir.path()).expect("Failed to create directory");
|
||||
|
||||
|
||||
// Run the test
|
||||
f(dir.path());
|
||||
|
||||
|
||||
// Clean up
|
||||
dir.close().expect("Failed to remove temporary directory");
|
||||
}
|
||||
@@ -51,23 +51,151 @@ mod tests {
|
||||
fn test_save_item() {
|
||||
with_temp_env(|data_dir| {
|
||||
// Set the data directory for this test
|
||||
let env = format!("KEEP_DIR={}", data_dir.display());
|
||||
|
||||
let env = format!("KEEP_DIR={} cargo run --", data_dir.display());
|
||||
|
||||
// Save an item with some content
|
||||
let input = "test content";
|
||||
|
||||
// Create a command that pipes input to keep with the specified environment
|
||||
let cmd = format!("echo {} | {}", input, env);
|
||||
let output = run_sh(cmd.as_str());
|
||||
assert!(output.status.success(), "Command failed with status: {}", output.status);
|
||||
|
||||
// Verify the item was saved
|
||||
let output = Command::new("sh")
|
||||
.arg("-c")
|
||||
.arg(format!("{} cargo run -- --list", env))
|
||||
.output()
|
||||
.expect("Failed to execute command");
|
||||
|
||||
assert!(String::from_utf8_lossy(&output.stdout).contains(input));
|
||||
assert!(
|
||||
output.status.success(),
|
||||
"Command failed with status: {} RC={}",
|
||||
cmd,
|
||||
output.status
|
||||
);
|
||||
|
||||
// Create a command that pipes input to keep with the specified environment
|
||||
let cmd = format!("echo {} | {} --save", input, env);
|
||||
let output = run_sh(cmd.as_str());
|
||||
assert!(
|
||||
output.status.success(),
|
||||
"Command failed with status: {} RC={}",
|
||||
cmd,
|
||||
output.status
|
||||
);
|
||||
|
||||
// Create a command that pipes input to keep with the specified environment
|
||||
let cmd = format!("echo {} | {} -s", input, env);
|
||||
let output = run_sh(cmd.as_str());
|
||||
assert!(
|
||||
output.status.success(),
|
||||
"Command failed with status: {} RC={}",
|
||||
cmd,
|
||||
output.status
|
||||
);
|
||||
|
||||
// Create a command that pipes input to keep with the specified environment
|
||||
let cmd = format!("echo {} | {} tag1 tag2", input, env);
|
||||
let output = run_sh(cmd.as_str());
|
||||
assert!(
|
||||
output.status.success(),
|
||||
"Command failed with status: {} RC={}",
|
||||
cmd,
|
||||
output.status
|
||||
);
|
||||
});
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_get_item() {
|
||||
with_temp_env(|data_dir| {
|
||||
// Set the data directory for this test
|
||||
let env = format!("KEEP_DIR={} cargo run --", data_dir.display());
|
||||
|
||||
// Save an item with some content
|
||||
let input_a = "test content A";
|
||||
let input_b = "test content B";
|
||||
|
||||
// Create a command that pipes input to keep with the specified environment
|
||||
let cmd = format!("echo {} A | {} tag tag_a", input_a, env);
|
||||
let output = run_sh(cmd.as_str());
|
||||
assert!(
|
||||
output.status.success(),
|
||||
"Command failed with status: {} RC={}",
|
||||
cmd,
|
||||
output.status
|
||||
);
|
||||
|
||||
let cmd = format!("echo {} | {} tag tag_b", input_b, env);
|
||||
let output = run_sh(cmd.as_str());
|
||||
assert!(
|
||||
output.status.success(),
|
||||
"Command failed with status: {} RC={}",
|
||||
cmd,
|
||||
output.status
|
||||
);
|
||||
|
||||
let cmd = format!("{} --get 1", env);
|
||||
let output = run_sh(cmd.as_str());
|
||||
assert!(
|
||||
output.status.success(),
|
||||
"Command failed with status: {} RC={}",
|
||||
cmd,
|
||||
output.status
|
||||
);
|
||||
assert!(String::from_utf8_lossy(&output.stdout).contains(input_a));
|
||||
|
||||
let cmd = format!("{} -g 1", env);
|
||||
let output = run_sh(cmd.as_str());
|
||||
assert!(
|
||||
output.status.success(),
|
||||
"Command failed with status: {} RC={}",
|
||||
cmd,
|
||||
output.status
|
||||
);
|
||||
assert!(String::from_utf8_lossy(&output.stdout).contains(input_a));
|
||||
|
||||
let cmd = format!("{} 1", env);
|
||||
let output = run_sh(cmd.as_str());
|
||||
assert!(
|
||||
output.status.success(),
|
||||
"Command failed with status: {} RC={}",
|
||||
cmd,
|
||||
output.status
|
||||
);
|
||||
assert!(String::from_utf8_lossy(&output.stdout).contains(input_a));
|
||||
|
||||
let cmd = format!("{} --get", env);
|
||||
let output = run_sh(cmd.as_str());
|
||||
assert!(
|
||||
output.status.success(),
|
||||
"Command failed with status: {} RC={}",
|
||||
cmd,
|
||||
output.status
|
||||
);
|
||||
assert!(String::from_utf8_lossy(&output.stdout).contains(input_b));
|
||||
|
||||
let cmd = format!("{} --get tag_a", env);
|
||||
let output = run_sh(cmd.as_str());
|
||||
assert!(
|
||||
output.status.success(),
|
||||
"Command failed with status: {} RC={}",
|
||||
cmd,
|
||||
output.status
|
||||
);
|
||||
assert!(String::from_utf8_lossy(&output.stdout).contains(input_a));
|
||||
|
||||
let cmd = format!("{} --get tag_b", env);
|
||||
let output = run_sh(cmd.as_str());
|
||||
assert!(
|
||||
output.status.success(),
|
||||
"Command failed with status: {} RC={}",
|
||||
cmd,
|
||||
output.status
|
||||
);
|
||||
assert!(String::from_utf8_lossy(&output.stdout).contains(input_b));
|
||||
|
||||
let cmd = format!("{} --get tag", env);
|
||||
let output = run_sh(cmd.as_str());
|
||||
assert!(
|
||||
output.status.success(),
|
||||
"Command failed with status: {} RC={}",
|
||||
cmd,
|
||||
output.status
|
||||
);
|
||||
assert!(String::from_utf8_lossy(&output.stdout).contains(input_b));
|
||||
});
|
||||
}
|
||||
|
||||
@@ -76,157 +204,57 @@ mod tests {
|
||||
fn test_list_items() {
|
||||
with_temp_env(|data_dir| {
|
||||
// Set the data directory for this test
|
||||
let env = format!("KEEP_DIR={}", data_dir.display());
|
||||
|
||||
let env = format!("KEEP_DIR={} cargo run --", data_dir.display());
|
||||
|
||||
// Save an item with some content
|
||||
let input = "test content";
|
||||
let input_a = "test content A";
|
||||
let input_b = "test content B";
|
||||
|
||||
// Create a command that pipes input to keep with the specified environment
|
||||
let cmd = format!("echo {} | {}", input, env);
|
||||
let mut child = Command::new("sh")
|
||||
.arg("-c")
|
||||
.arg(cmd)
|
||||
.spawn()
|
||||
.expect("Failed to spawn process");
|
||||
|
||||
child.wait().expect("Failed to wait for child process");
|
||||
|
||||
// List items and verify the output
|
||||
let output = Command::new("sh")
|
||||
.arg("-c")
|
||||
.arg(format!("{} cargo run -- --list", env))
|
||||
.output()
|
||||
.expect("Failed to execute command");
|
||||
|
||||
assert!(String::from_utf8_lossy(&output.stdout).contains(input));
|
||||
});
|
||||
}
|
||||
|
||||
// Test: Get an item and verify the content
|
||||
#[test]
|
||||
fn test_get_item() {
|
||||
with_temp_env(|data_dir| {
|
||||
// Set the data directory for this test
|
||||
let env = format!("KEEP_DIR={}", data_dir.display());
|
||||
|
||||
// Save an item with some content
|
||||
let input = "test content";
|
||||
// Create a command that pipes input to keep with the specified environment
|
||||
let mut cmd = Command::new("sh");
|
||||
cmd.arg("-c")
|
||||
.arg(format!("echo {} | {}", input, env));
|
||||
|
||||
cmd.spawn()
|
||||
.expect("Failed to spawn process")
|
||||
.wait()
|
||||
.expect("Failed to wait for child process");
|
||||
|
||||
// Get the item and verify the content
|
||||
let output = Command::new("sh")
|
||||
.arg("-c")
|
||||
.arg(format!("{} cargo run -- --get", env))
|
||||
.output()
|
||||
.expect("Failed to execute command");
|
||||
|
||||
assert_eq!(String::from_utf8_lossy(&output.stdout), input);
|
||||
});
|
||||
}
|
||||
|
||||
// Test: Add metadata to an item and verify it's stored
|
||||
#[test]
|
||||
fn test_metadata() {
|
||||
with_temp_env(|data_dir| {
|
||||
// Set the data directory for this test
|
||||
let env = format!("KEEP_DIR={}", data_dir.display());
|
||||
|
||||
// Save an item with some content and metadata
|
||||
let input = "test content";
|
||||
// Create a command that pipes input to keep with the specified environment and metadata
|
||||
let mut cmd = Command::new("sh");
|
||||
cmd.arg("-c")
|
||||
.arg(format!("echo {} | {}", input, env))
|
||||
.arg("cargo run -- --save --meta key=value");
|
||||
|
||||
cmd.spawn()
|
||||
.expect("Failed to spawn process")
|
||||
.wait()
|
||||
.expect("Failed to wait for child process");
|
||||
|
||||
// Get the item ID
|
||||
let list_output = Command::new("sh")
|
||||
.arg("-c")
|
||||
.arg(format!("{} cargo run -- --list", env))
|
||||
.output()
|
||||
.expect("Failed to execute command");
|
||||
let list_output_str = String::from_utf8_lossy(&list_output.stdout);
|
||||
let id = list_output_str.lines().next().expect("No items found").split_whitespace().next().expect("No ID found").parse::<i64>().expect("Invalid ID");
|
||||
|
||||
// Get the item and verify the metadata
|
||||
let output = Command::new("sh")
|
||||
.arg("-c")
|
||||
.arg(format!("{} cargo run -- --info {}", env, id))
|
||||
.output()
|
||||
.expect("Failed to execute command");
|
||||
|
||||
assert!(String::from_utf8_lossy(&output.stdout).contains("key: value"));
|
||||
});
|
||||
}
|
||||
|
||||
// Test: Use tags to organize items
|
||||
#[test]
|
||||
fn test_tags() {
|
||||
with_temp_env(|data_dir| {
|
||||
// Set the data directory for this test
|
||||
let env = format!("KEEP_DIR={}", data_dir.display());
|
||||
|
||||
// Save an item with some content and tags
|
||||
let input = "test content";
|
||||
// Create a command that pipes input to keep with the specified environment and tags
|
||||
let cmd = format!("echo {} | {}", input, env);
|
||||
let cmd = format!("echo {} A | {} tag tag_a", input_a, env);
|
||||
let output = run_sh(cmd.as_str());
|
||||
assert!(output.status.success(), "Command failed with status: {}", output.status);
|
||||
|
||||
// List items with a specific tag
|
||||
let output = Command::new("sh")
|
||||
.arg("-c")
|
||||
.arg(format!("{} cargo run -- --list tag1", env))
|
||||
.output()
|
||||
.expect("Failed to execute command");
|
||||
|
||||
assert!(String::from_utf8_lossy(&output.stdout).contains("test content"));
|
||||
});
|
||||
}
|
||||
assert!(
|
||||
output.status.success(),
|
||||
"Command failed with status: {} RC={}",
|
||||
cmd,
|
||||
output.status
|
||||
);
|
||||
|
||||
// Test: Use compression
|
||||
#[test]
|
||||
fn test_compression() {
|
||||
with_temp_env(|data_dir| {
|
||||
// Set the data directory for this test
|
||||
let env = format!("KEEP_DIR={}", data_dir.display());
|
||||
|
||||
// Save an item with some content and compression
|
||||
let input = "test content";
|
||||
// Create a command that pipes input to keep with the specified environment and compression
|
||||
let cmd = format!("echo {} | {}", input, env);
|
||||
let cmd = format!("echo {} | {} tag tag_b", input_b, env);
|
||||
let output = run_sh(cmd.as_str());
|
||||
assert!(output.status.success(), "Command failed with status: {}", output.status);
|
||||
|
||||
// Get the item ID
|
||||
let list_output = Command::new("sh")
|
||||
.arg("-c")
|
||||
.arg(format!("{} cargo run -- --list", env))
|
||||
.output()
|
||||
.expect("Failed to execute command");
|
||||
let list_output_str = String::from_utf8_lossy(&list_output.stdout);
|
||||
let id = list_output_str.lines().next().expect("No items found").split_whitespace().next().expect("No ID found").parse::<i64>().expect("Invalid ID");
|
||||
|
||||
// Get the item and verify the content
|
||||
let output = Command::new("sh")
|
||||
.arg("-c")
|
||||
.arg(format!("{} cargo run -- --get {}", env, id))
|
||||
.output()
|
||||
.expect("Failed to execute command");
|
||||
|
||||
assert_eq!(String::from_utf8_lossy(&output.stdout), input);
|
||||
assert!(
|
||||
output.status.success(),
|
||||
"Command failed with status: {} RC={}",
|
||||
cmd,
|
||||
output.status
|
||||
);
|
||||
|
||||
let cmd = format!("{} --list", env);
|
||||
let output = run_sh(cmd.as_str());
|
||||
assert!(
|
||||
output.status.success(),
|
||||
"Command failed with status: {} RC={}",
|
||||
cmd,
|
||||
output.status
|
||||
);
|
||||
|
||||
let cmd = format!("{} -l", env);
|
||||
let output = run_sh(cmd.as_str());
|
||||
assert!(
|
||||
output.status.success(),
|
||||
"Command failed with status: {} RC={}",
|
||||
cmd,
|
||||
output.status
|
||||
);
|
||||
|
||||
let cmd = format!("{} --list tag_a", env);
|
||||
let output = run_sh(cmd.as_str());
|
||||
assert!(
|
||||
output.status.success(),
|
||||
"Command failed with status: {} RC={}",
|
||||
cmd,
|
||||
output.status
|
||||
);
|
||||
});
|
||||
}
|
||||
|
||||
@@ -235,44 +263,67 @@ mod tests {
|
||||
fn test_delete_item() {
|
||||
with_temp_env(|data_dir| {
|
||||
// Set the data directory for this test
|
||||
let env = format!("KEEP_DIR={}", data_dir.display());
|
||||
|
||||
let env = format!("KEEP_DIR={} cargo run --", data_dir.display());
|
||||
|
||||
// Save an item with some content
|
||||
let input = "test content";
|
||||
let input_a = "test content A";
|
||||
let input_b = "test content B";
|
||||
|
||||
// Create a command that pipes input to keep with the specified environment
|
||||
let cmd = format!("echo {} | {}", input, env);
|
||||
let mut child = Command::new("sh")
|
||||
.arg("-c")
|
||||
.arg(cmd)
|
||||
.spawn()
|
||||
.expect("Failed to spawn process");
|
||||
|
||||
child.wait().expect("Failed to wait for child process");
|
||||
|
||||
// Get the item ID
|
||||
let list_output = Command::new("sh")
|
||||
.arg("-c")
|
||||
.arg(format!("{} cargo run -- --list", env))
|
||||
.output()
|
||||
.expect("Failed to execute command");
|
||||
let list_output_str = String::from_utf8_lossy(&list_output.stdout);
|
||||
let id = list_output_str.lines().next().expect("No items found").split_whitespace().next().expect("No ID found").parse::<i64>().expect("Invalid ID");
|
||||
|
||||
// Delete the item
|
||||
let _output = Command::new("sh")
|
||||
.arg("-c")
|
||||
.arg(format!("{} cargo run -- --delete {}", env, id))
|
||||
.output()
|
||||
.expect("Failed to execute command");
|
||||
|
||||
// Verify the item was deleted
|
||||
let list_output = Command::new("sh")
|
||||
.arg("-c")
|
||||
.arg(format!("{} cargo run -- --list", env))
|
||||
.output()
|
||||
.expect("Failed to execute command");
|
||||
|
||||
assert_eq!(String::from_utf8_lossy(&list_output.stdout).trim(), "");
|
||||
let cmd = format!("echo {} | {} tag tag_a", input_a, env);
|
||||
let output = run_sh(cmd.as_str());
|
||||
assert!(
|
||||
output.status.success(),
|
||||
"Command failed with status: {} RC={}",
|
||||
cmd,
|
||||
output.status
|
||||
);
|
||||
|
||||
let cmd = format!("echo {} | {} tag tag_b", input_b, env);
|
||||
let output = run_sh(cmd.as_str());
|
||||
assert!(
|
||||
output.status.success(),
|
||||
"Command failed with status: {} RC={}",
|
||||
cmd,
|
||||
output.status
|
||||
);
|
||||
|
||||
let cmd = format!("{} --delete tag", env);
|
||||
let output = run_sh(cmd.as_str());
|
||||
assert!(
|
||||
!output.status.success(),
|
||||
"Command succeded when it should have failed: {} RC={}",
|
||||
cmd,
|
||||
output.status
|
||||
);
|
||||
|
||||
let cmd = format!("{} --delete 1", env);
|
||||
let output = run_sh(cmd.as_str());
|
||||
assert!(
|
||||
output.status.success(),
|
||||
"Command failed with status: {} RC={}",
|
||||
cmd,
|
||||
output.status
|
||||
);
|
||||
|
||||
let cmd = format!("{} -d 2", env);
|
||||
let output = run_sh(cmd.as_str());
|
||||
assert!(
|
||||
output.status.success(),
|
||||
"Command failed with status: {} RC={}",
|
||||
cmd,
|
||||
output.status
|
||||
);
|
||||
|
||||
let cmd = format!("{} --delete 9999", env);
|
||||
let output = run_sh(cmd.as_str());
|
||||
assert!(
|
||||
output.status.success(),
|
||||
"Command failed with status: {} RC={}",
|
||||
cmd,
|
||||
output.status
|
||||
);
|
||||
//assert!(!output.status.success(), "Command succeded when it should have failed: {} RC={}", cmd, output.status);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user