mod common;
use common::TestHelper;
use std::process::Command;
#[test]
fn test_pull_all_worktrees() {
let helper = TestHelper::new().unwrap();
Command::new("git")
.args(["config", "user.email", "test@example.com"])
.current_dir(&helper.repo_path)
.output()
.unwrap();
Command::new("git")
.args(["config", "user.name", "Test User"])
.current_dir(&helper.repo_path)
.output()
.unwrap();
std::fs::write(helper.repo_path.join("README.md"), "Initial content").unwrap();
Command::new("git")
.args(["add", "."])
.current_dir(&helper.repo_path)
.output()
.unwrap();
Command::new("git")
.args(["commit", "-m", "Initial commit"])
.current_dir(&helper.repo_path)
.output()
.unwrap();
helper.run_gwtr(&["add", "feature-a"]);
helper.run_gwtr(&["add", "feature-b"]);
let output = helper.run_gwtr(&["pull", "--all"]);
assert!(output.status.success());
let stdout = String::from_utf8_lossy(&output.stdout);
assert!(stdout.contains("Pulling all worktrees"));
}
#[test]
fn test_pull_shows_already_up_to_date() {
let helper = TestHelper::new().unwrap();
Command::new("git")
.args(["config", "user.email", "test@example.com"])
.current_dir(&helper.repo_path)
.output()
.unwrap();
Command::new("git")
.args(["config", "user.name", "Test User"])
.current_dir(&helper.repo_path)
.output()
.unwrap();
std::fs::write(helper.repo_path.join("test.txt"), "content").unwrap();
Command::new("git")
.args(["add", "."])
.current_dir(&helper.repo_path)
.output()
.unwrap();
Command::new("git")
.args(["commit", "-m", "Initial"])
.current_dir(&helper.repo_path)
.output()
.unwrap();
helper.run_gwtr(&["add", "feature-uptodate"]);
let output = helper.run_gwtr(&["pull", "--all"]);
assert!(output.status.success());
let stdout = String::from_utf8_lossy(&output.stdout);
assert!(stdout.contains("Pulling all worktrees"));
}
#[test]
fn test_pull_specific_worktree() {
let helper = TestHelper::new().unwrap();
Command::new("git")
.args(["config", "user.email", "test@example.com"])
.current_dir(&helper.repo_path)
.output()
.unwrap();
Command::new("git")
.args(["config", "user.name", "Test User"])
.current_dir(&helper.repo_path)
.output()
.unwrap();
std::fs::write(helper.repo_path.join("file.txt"), "content").unwrap();
Command::new("git")
.args(["add", "."])
.current_dir(&helper.repo_path)
.output()
.unwrap();
Command::new("git")
.args(["commit", "-m", "Init"])
.current_dir(&helper.repo_path)
.output()
.unwrap();
helper.run_gwtr(&["add", "feature-x"]);
helper.run_gwtr(&["add", "feature-y"]);
let output = helper.run_gwtr(&["pull", "feature-x"]);
let stdout = String::from_utf8_lossy(&output.stdout);
let stderr = String::from_utf8_lossy(&output.stderr);
assert!(
stdout.contains("feature-x") || stderr.contains("feature-x"),
"Output should mention the worktree name. stdout: {}, stderr: {}",
stdout,
stderr
);
}
#[test]
fn test_pull_shows_progress() {
let helper = TestHelper::new().unwrap();
Command::new("git")
.args(["config", "user.email", "test@example.com"])
.current_dir(&helper.repo_path)
.output()
.unwrap();
Command::new("git")
.args(["config", "user.name", "Test User"])
.current_dir(&helper.repo_path)
.output()
.unwrap();
std::fs::write(helper.repo_path.join("init.txt"), "init").unwrap();
Command::new("git")
.args(["add", "."])
.current_dir(&helper.repo_path)
.output()
.unwrap();
Command::new("git")
.args(["commit", "-m", "Initial"])
.current_dir(&helper.repo_path)
.output()
.unwrap();
helper.run_gwtr(&["add", "dev"]);
helper.run_gwtr(&["add", "staging"]);
helper.run_gwtr(&["add", "prod"]);
let output = helper.run_gwtr(&["pull", "--all"]);
assert!(output.status.success());
let stdout = String::from_utf8_lossy(&output.stdout);
assert!(stdout.contains("main") || stdout.contains("dev") || stdout.contains("staging"));
}