245 lines
6.1 KiB
Rust
245 lines
6.1 KiB
Rust
use std::process::Command;
|
|
use tempfile::TempDir;
|
|
|
|
fn arc_cmd() -> Command {
|
|
let mut cmd = Command::new(env!("CARGO_BIN_EXE_arc"));
|
|
cmd.env("NO_COLOR", "1");
|
|
cmd
|
|
}
|
|
|
|
fn init_repo() -> TempDir {
|
|
let dir = TempDir::new().unwrap();
|
|
arc_cmd()
|
|
.arg("init")
|
|
.current_dir(dir.path())
|
|
.output()
|
|
.expect("failed to init");
|
|
dir
|
|
}
|
|
|
|
fn commit_file(dir: &TempDir, name: &str, content: &str, msg: &str) -> String {
|
|
std::fs::write(dir.path().join(name), content).unwrap();
|
|
let output = arc_cmd()
|
|
.args(["commit", msg])
|
|
.current_dir(dir.path())
|
|
.output()
|
|
.expect("failed to commit");
|
|
assert!(output.status.success());
|
|
String::from_utf8_lossy(&output.stdout)
|
|
.trim()
|
|
.strip_prefix("✓ committed ")
|
|
.unwrap()
|
|
.to_string()
|
|
}
|
|
|
|
#[test]
|
|
fn tag_add_creates_tag() {
|
|
let dir = init_repo();
|
|
commit_file(&dir, "a.txt", "hello\n", "first");
|
|
|
|
let output = arc_cmd()
|
|
.args(["tag", "add", "v1.0"])
|
|
.current_dir(dir.path())
|
|
.output()
|
|
.expect("failed");
|
|
|
|
assert!(output.status.success());
|
|
let stdout = String::from_utf8_lossy(&output.stdout);
|
|
assert!(stdout.contains("tag v1.0 set at"));
|
|
|
|
let tag_path = dir.path().join(".arc").join("tags").join("v1.0");
|
|
assert!(tag_path.exists());
|
|
}
|
|
|
|
#[test]
|
|
fn tag_add_at_specific_commit() {
|
|
let dir = init_repo();
|
|
let id1 = commit_file(&dir, "a.txt", "v1\n", "first");
|
|
commit_file(&dir, "a.txt", "v2\n", "second");
|
|
|
|
let short = &id1[..12];
|
|
let output = arc_cmd()
|
|
.args(["tag", "add", "v0.1", short])
|
|
.current_dir(dir.path())
|
|
.output()
|
|
.expect("failed");
|
|
|
|
assert!(output.status.success());
|
|
let tag_content =
|
|
std::fs::read_to_string(dir.path().join(".arc").join("tags").join("v0.1")).unwrap();
|
|
assert!(tag_content.contains(&id1));
|
|
}
|
|
|
|
#[test]
|
|
fn tag_add_fails_if_already_exists() {
|
|
let dir = init_repo();
|
|
commit_file(&dir, "a.txt", "hello\n", "first");
|
|
|
|
arc_cmd()
|
|
.args(["tag", "add", "v1.0"])
|
|
.current_dir(dir.path())
|
|
.output()
|
|
.expect("failed");
|
|
|
|
let output = arc_cmd()
|
|
.args(["tag", "add", "v1.0"])
|
|
.current_dir(dir.path())
|
|
.output()
|
|
.expect("failed");
|
|
|
|
assert!(!output.status.success());
|
|
let stderr = String::from_utf8_lossy(&output.stderr);
|
|
assert!(stderr.contains("tag already exists"));
|
|
}
|
|
|
|
#[test]
|
|
fn tag_add_fails_without_commits() {
|
|
let dir = init_repo();
|
|
|
|
let output = arc_cmd()
|
|
.args(["tag", "add", "v1.0"])
|
|
.current_dir(dir.path())
|
|
.output()
|
|
.expect("failed");
|
|
|
|
assert!(!output.status.success());
|
|
let stderr = String::from_utf8_lossy(&output.stderr);
|
|
assert!(stderr.contains("no commits yet"));
|
|
}
|
|
|
|
#[test]
|
|
fn tag_rm_removes_tag() {
|
|
let dir = init_repo();
|
|
commit_file(&dir, "a.txt", "hello\n", "first");
|
|
|
|
arc_cmd()
|
|
.args(["tag", "add", "v1.0"])
|
|
.current_dir(dir.path())
|
|
.output()
|
|
.expect("failed");
|
|
|
|
let output = arc_cmd()
|
|
.args(["tag", "rm", "v1.0"])
|
|
.current_dir(dir.path())
|
|
.output()
|
|
.expect("failed");
|
|
|
|
assert!(output.status.success());
|
|
let stdout = String::from_utf8_lossy(&output.stdout);
|
|
assert!(stdout.contains("tag v1.0 removed"));
|
|
|
|
let tag_path = dir.path().join(".arc").join("tags").join("v1.0");
|
|
assert!(!tag_path.exists());
|
|
}
|
|
|
|
#[test]
|
|
fn tag_rm_fails_for_nonexistent() {
|
|
let dir = init_repo();
|
|
commit_file(&dir, "a.txt", "hello\n", "first");
|
|
|
|
let output = arc_cmd()
|
|
.args(["tag", "rm", "nonexistent"])
|
|
.current_dir(dir.path())
|
|
.output()
|
|
.expect("failed");
|
|
|
|
assert!(!output.status.success());
|
|
let stderr = String::from_utf8_lossy(&output.stderr);
|
|
assert!(stderr.contains("tag not found"));
|
|
}
|
|
|
|
#[test]
|
|
fn tag_list_shows_tags() {
|
|
let dir = init_repo();
|
|
commit_file(&dir, "a.txt", "hello\n", "first");
|
|
|
|
arc_cmd()
|
|
.args(["tag", "add", "v1.0"])
|
|
.current_dir(dir.path())
|
|
.output()
|
|
.expect("failed");
|
|
|
|
arc_cmd()
|
|
.args(["tag", "add", "v2.0"])
|
|
.current_dir(dir.path())
|
|
.output()
|
|
.expect("failed");
|
|
|
|
let output = arc_cmd()
|
|
.args(["tag", "list"])
|
|
.current_dir(dir.path())
|
|
.output()
|
|
.expect("failed");
|
|
|
|
assert!(output.status.success());
|
|
let stdout = String::from_utf8_lossy(&output.stdout);
|
|
assert!(stdout.contains("v1.0"));
|
|
assert!(stdout.contains("v2.0"));
|
|
}
|
|
|
|
#[test]
|
|
fn tag_list_sorted_alphabetically() {
|
|
let dir = init_repo();
|
|
commit_file(&dir, "a.txt", "hello\n", "first");
|
|
|
|
arc_cmd()
|
|
.args(["tag", "add", "v2.0"])
|
|
.current_dir(dir.path())
|
|
.output()
|
|
.expect("failed");
|
|
|
|
arc_cmd()
|
|
.args(["tag", "add", "v1.0"])
|
|
.current_dir(dir.path())
|
|
.output()
|
|
.expect("failed");
|
|
|
|
let output = arc_cmd()
|
|
.args(["tag", "list"])
|
|
.current_dir(dir.path())
|
|
.output()
|
|
.expect("failed");
|
|
|
|
let stdout = String::from_utf8_lossy(&output.stdout);
|
|
let v1_pos = stdout.find("v1.0").unwrap();
|
|
let v2_pos = stdout.find("v2.0").unwrap();
|
|
assert!(v1_pos < v2_pos);
|
|
}
|
|
|
|
#[test]
|
|
fn tag_list_empty_when_no_tags() {
|
|
let dir = init_repo();
|
|
commit_file(&dir, "a.txt", "hello\n", "first");
|
|
|
|
let output = arc_cmd()
|
|
.args(["tag", "list"])
|
|
.current_dir(dir.path())
|
|
.output()
|
|
.expect("failed");
|
|
|
|
assert!(output.status.success());
|
|
let stdout = String::from_utf8_lossy(&output.stdout);
|
|
assert!(stdout.contains("no tags"));
|
|
}
|
|
|
|
#[test]
|
|
fn tag_list_shows_commit_ids() {
|
|
let dir = init_repo();
|
|
let id = commit_file(&dir, "a.txt", "hello\n", "first");
|
|
|
|
arc_cmd()
|
|
.args(["tag", "add", "v1.0"])
|
|
.current_dir(dir.path())
|
|
.output()
|
|
.expect("failed");
|
|
|
|
let output = arc_cmd()
|
|
.args(["tag", "list"])
|
|
.current_dir(dir.path())
|
|
.output()
|
|
.expect("failed");
|
|
|
|
let stdout = String::from_utf8_lossy(&output.stdout);
|
|
let short_id = &id[..12];
|
|
assert!(stdout.contains(short_id));
|
|
}
|