use std::path::Path;
use std::process::Command;
use assert_cmd::prelude::*;
use tempfile::TempDir;
fn mnem(repo: &Path, args: &[&str]) -> Command {
let mut cmd = Command::cargo_bin("mnem").expect("built mnem binary");
cmd.current_dir(repo);
cmd.arg("-R").arg(repo);
for a in args {
cmd.arg(a);
}
cmd
}
#[test]
fn branch_list_after_init_shows_main() {
let dir = TempDir::new().unwrap();
mnem(dir.path(), &["init", dir.path().to_str().unwrap()])
.assert()
.success();
let out = mnem(dir.path(), &["branch", "list"]).assert().success();
let stdout = String::from_utf8_lossy(&out.get_output().stdout).to_string();
assert!(
stdout.contains("main"),
"expected main branch after init, got: {stdout}"
);
}
#[test]
fn branch_create_after_init_succeeds() {
let dir = TempDir::new().unwrap();
mnem(dir.path(), &["init", dir.path().to_str().unwrap()])
.assert()
.success();
let out = mnem(dir.path(), &["branch", "create", "feature"])
.assert()
.success();
let stdout = String::from_utf8_lossy(&out.get_output().stdout).to_string();
assert!(
stdout.starts_with("created branch feature ->"),
"expected branch create to succeed, got: {stdout}"
);
}
#[test]
fn branch_create_list_delete_round_trip() {
let dir = TempDir::new().unwrap();
mnem(dir.path(), &["init", dir.path().to_str().unwrap()])
.assert()
.success();
mnem(
dir.path(),
&["add", "node", "--summary", "first", "--prop", "kind=doc"],
)
.assert()
.success();
let created = mnem(dir.path(), &["branch", "create", "feature/x"])
.assert()
.success();
let stdout = String::from_utf8_lossy(&created.get_output().stdout).to_string();
assert!(
stdout.starts_with("created branch feature/x ->"),
"create stdout: {stdout}"
);
let listed = mnem(dir.path(), &["branch", "list"]).assert().success();
let listed_out = String::from_utf8_lossy(&listed.get_output().stdout).to_string();
assert!(
listed_out.contains("feature/x"),
"list stdout must mention branch, got: {listed_out}"
);
assert!(
listed_out.contains('*'),
"branch at head should be starred, got: {listed_out}"
);
let dup = mnem(dir.path(), &["branch", "create", "feature/x"])
.assert()
.failure();
let dup_err = String::from_utf8_lossy(&dup.get_output().stderr).to_string();
assert!(
dup_err.contains("already exists"),
"duplicate-branch error expected: {dup_err}"
);
mnem(dir.path(), &["branch", "delete", "feature/x"])
.assert()
.success();
let after = mnem(dir.path(), &["branch", "list"]).assert().success();
let after_out = String::from_utf8_lossy(&after.get_output().stdout).to_string();
assert!(
!after_out.contains("feature/x"),
"deleted branch must be gone, got: {after_out}"
);
}
#[test]
fn branch_delete_missing_fails() {
let dir = TempDir::new().unwrap();
mnem(dir.path(), &["init", dir.path().to_str().unwrap()])
.assert()
.success();
let out = mnem(dir.path(), &["branch", "delete", "nope"])
.assert()
.failure();
let stderr = String::from_utf8_lossy(&out.get_output().stderr).to_string();
assert!(
stderr.contains("does not exist"),
"missing-branch error expected: {stderr}"
);
}