import subprocess
def test_rm_basic_file(commit_env_config, git2cpp_path, tmp_path):
"""Test basic rm operation to remove a file"""
cmd_init = [git2cpp_path, "init", "."]
p_init = subprocess.run(cmd_init, capture_output=True, cwd=tmp_path)
assert p_init.returncode == 0
# Create a test file
test_file = tmp_path / "test_file.txt"
test_file.write_text("test content")
# Add and commit the file
add_cmd = [git2cpp_path, "add", "test_file.txt"]
p_add = subprocess.run(add_cmd, capture_output=True, cwd=tmp_path, text=True)
assert p_add.returncode == 0
commit_cmd = [git2cpp_path, "commit", "-m", "Add test file"]
p_commit = subprocess.run(commit_cmd, capture_output=True, cwd=tmp_path, text=True)
assert p_commit.returncode == 0
# Remove the file
rm_cmd = [git2cpp_path, "rm", "test_file.txt"]
p_rm = subprocess.run(rm_cmd, capture_output=True, cwd=tmp_path, text=True)
assert p_rm.returncode == 0
# Verify the file was removed from working tree
assert not test_file.exists()
# Check git status
status_cmd = [git2cpp_path, "status", "--long"]
p_status = subprocess.run(status_cmd, capture_output=True, cwd=tmp_path, text=True)
assert p_status.returncode == 0
assert "Changes to be committed" in p_status.stdout
assert "deleted" in p_status.stdout
def test_rm_multiple_files(commit_env_config, git2cpp_path, tmp_path):
"""Test removing multiple files at once"""
cmd_init = [git2cpp_path, "init", "."]
p_init = subprocess.run(cmd_init, capture_output=True, cwd=tmp_path)
assert p_init.returncode == 0
# Create test files
file1 = tmp_path / "file1.txt"
file1.write_text("content 1")
file2 = tmp_path / "file2.txt"
file2.write_text("content 2")
# Add and commit files
add_cmd = [git2cpp_path, "add", "file1.txt", "file2.txt"]
p_add = subprocess.run(add_cmd, capture_output=True, cwd=tmp_path, text=True)
assert p_add.returncode == 0
commit_cmd = [git2cpp_path, "commit", "-m", "Add test files"]
p_commit = subprocess.run(commit_cmd, capture_output=True, cwd=tmp_path, text=True)
assert p_commit.returncode == 0
# Remove both files
rm_cmd = [git2cpp_path, "rm", "file1.txt", "file2.txt"]
p_rm = subprocess.run(rm_cmd, capture_output=True, cwd=tmp_path, text=True)
assert p_rm.returncode == 0
# Verify both files were removed
assert not file1.exists()
assert not file2.exists()
# Check git status
status_cmd = [git2cpp_path, "status", "--long"]
p_status = subprocess.run(status_cmd, capture_output=True, cwd=tmp_path, text=True)
assert p_status.returncode == 0
assert "Changes to be committed" in p_status.stdout
assert "deleted" in p_status.stdout
def test_rm_directory_without_recursive_flag(commit_env_config, git2cpp_path, tmp_path):
"""Test that rm fails when trying to remove a directory without -r flag"""
cmd_init = [git2cpp_path, "init", "."]
p_init = subprocess.run(cmd_init, capture_output=True, cwd=tmp_path)
assert p_init.returncode == 0
# Create a directory with a file
test_dir = tmp_path / "test_dir"
test_dir.mkdir()
test_file = test_dir / "file.txt"
test_file.write_text("content")
# Add and commit the file
add_cmd = [git2cpp_path, "add", "test_dir/file.txt"]
p_add = subprocess.run(add_cmd, capture_output=True, cwd=tmp_path, text=True)
assert p_add.returncode == 0
commit_cmd = [git2cpp_path, "commit", "-m", "Add test directory"]
p_commit = subprocess.run(commit_cmd, capture_output=True, cwd=tmp_path, text=True)
assert p_commit.returncode == 0
# Try to remove directory without -r flag - should fail
rm_cmd = [git2cpp_path, "rm", "test_dir"]
p_rm = subprocess.run(rm_cmd, capture_output=True, cwd=tmp_path, text=True)
assert p_rm.returncode != 0
assert "not removing" in p_rm.stderr and "recursively without -r" in p_rm.stderr
# Verify directory still exists
assert test_dir.exists()
assert test_file.exists()
def test_rm_directory_with_recursive_flag(commit_env_config, git2cpp_path, tmp_path):
"""Test removing a directory with -r flag"""
cmd_init = [git2cpp_path, "init", "."]
p_init = subprocess.run(cmd_init, capture_output=True, cwd=tmp_path)
assert p_init.returncode == 0
# Create a directory with files
test_dir = tmp_path / "test_dir"
test_dir.mkdir()
file1 = test_dir / "file1.txt"
file1.write_text("content 1")
file2 = test_dir / "file2.txt"
file2.write_text("content 2")
# Add and commit the files
add_cmd = [git2cpp_path, "add", "test_dir/file1.txt", "test_dir/file2.txt"]
p_add = subprocess.run(add_cmd, capture_output=True, cwd=tmp_path, text=True)
assert p_add.returncode == 0
commit_cmd = [git2cpp_path, "commit", "-m", "Add test directory"]
p_commit = subprocess.run(commit_cmd, capture_output=True, cwd=tmp_path, text=True)
assert p_commit.returncode == 0
# Remove directory with -r flag - should succeed
rm_cmd = [git2cpp_path, "rm", "-r", "test_dir"]
p_rm = subprocess.run(rm_cmd, capture_output=True, cwd=tmp_path, text=True)
assert p_rm.returncode == 0
# Check git status
status_cmd = [git2cpp_path, "status", "--long"]
p_status = subprocess.run(status_cmd, capture_output=True, cwd=tmp_path, text=True)
assert p_status.returncode == 0
assert "Changes to be committed" in p_status.stdout
assert "deleted" in p_status.stdout
def test_rm_and_commit(commit_env_config, git2cpp_path, tmp_path):
"""Test removing a file and committing the change"""
cmd_init = [git2cpp_path, "init", "."]
p_init = subprocess.run(cmd_init, capture_output=True, cwd=tmp_path)
assert p_init.returncode == 0
# Create a test file
test_file = tmp_path / "to_remove.txt"
test_file.write_text("content to remove")
# Add and commit the file
add_cmd = [git2cpp_path, "add", "to_remove.txt"]
p_add = subprocess.run(add_cmd, capture_output=True, cwd=tmp_path, text=True)
assert p_add.returncode == 0
commit_cmd = [git2cpp_path, "commit", "-m", "Add file to remove"]
p_commit = subprocess.run(commit_cmd, capture_output=True, cwd=tmp_path, text=True)
assert p_commit.returncode == 0
# Remove the file
rm_cmd = [git2cpp_path, "rm", "to_remove.txt"]
p_rm = subprocess.run(rm_cmd, capture_output=True, cwd=tmp_path, text=True)
assert p_rm.returncode == 0
# Check status before commit
status_cmd = [git2cpp_path, "status", "--long"]
p_status = subprocess.run(status_cmd, capture_output=True, cwd=tmp_path, text=True)
assert p_status.returncode == 0
assert "Changes to be committed" in p_status.stdout
assert "deleted" in p_status.stdout
# Commit the removal
commit_cmd2 = [git2cpp_path, "commit", "-m", "Remove file"]
p_commit2 = subprocess.run(commit_cmd2, capture_output=True, cwd=tmp_path, text=True)
assert p_commit2.returncode == 0
# Verify the file is gone
assert not test_file.exists()
# Check status after commit
status_cmd2 = [git2cpp_path, "status", "--long"]
p_status2 = subprocess.run(status_cmd2, capture_output=True, cwd=tmp_path, text=True)
assert p_status2.returncode == 0
assert "to_remove.txt" not in p_status2.stdout
def test_rm_nonexistent_file(git2cpp_path, tmp_path):
"""Test that rm fails when file doesn't exist"""
cmd_init = [git2cpp_path, "init", "."]
p_init = subprocess.run(cmd_init, capture_output=True, cwd=tmp_path)
assert p_init.returncode == 0
# Try to remove a file that doesn't exist
rm_cmd = [git2cpp_path, "rm", "nonexistent.txt"]
p_rm = subprocess.run(rm_cmd, capture_output=True, cwd=tmp_path, text=True)
assert p_rm.returncode != 0
def test_rm_untracked_file(git2cpp_path, tmp_path):
"""Test that rm fails when trying to remove an untracked file"""
cmd_init = [git2cpp_path, "init", "."]
p_init = subprocess.run(cmd_init, capture_output=True, cwd=tmp_path)
assert p_init.returncode == 0
# Create an untracked file
untracked_file = tmp_path / "untracked.txt"
untracked_file.write_text("untracked content")
# Try to remove untracked file - should fail
rm_cmd = [git2cpp_path, "rm", "untracked.txt"]
p_rm = subprocess.run(rm_cmd, capture_output=True, cwd=tmp_path, text=True)
assert p_rm.returncode != 0
def test_rm_staged_file(git2cpp_path, tmp_path):
"""Test removing a file that was added but not yet committed"""
cmd_init = [git2cpp_path, "init", "."]
p_init = subprocess.run(cmd_init, capture_output=True, cwd=tmp_path)
assert p_init.returncode == 0
# Create a test file
test_file = tmp_path / "staged.txt"
test_file.write_text("staged content")
# Add the file (but don't commit)
add_cmd = [git2cpp_path, "add", "staged.txt"]
p_add = subprocess.run(add_cmd, capture_output=True, cwd=tmp_path, text=True)
assert p_add.returncode == 0
# Remove the file
rm_cmd = [git2cpp_path, "rm", "staged.txt"]
p_rm = subprocess.run(rm_cmd, capture_output=True, cwd=tmp_path, text=True)
assert p_rm.returncode == 0
# Verify the file was removed
assert not test_file.exists()
# Check git status - should show nothing staged
status_cmd = [git2cpp_path, "status", "--long"]
p_status = subprocess.run(status_cmd, capture_output=True, cwd=tmp_path, text=True)
assert p_status.returncode == 0
assert "Changes to be committed" not in p_status.stdout
assert "staged.txt" not in p_status.stdout
def test_rm_file_in_subdirectory(commit_env_config, git2cpp_path, tmp_path):
"""Test removing a file in a subdirectory"""
cmd_init = [git2cpp_path, "init", "."]
p_init = subprocess.run(cmd_init, capture_output=True, cwd=tmp_path)
assert p_init.returncode == 0
# Create subdirectory
test_dir = tmp_path / "test"
test_dir.mkdir()
test_file = test_dir / "test.txt"
test_file.write_text("test content")
# Add and commit the file
add_cmd = [git2cpp_path, "add", "test/test.txt"]
p_add = subprocess.run(add_cmd, capture_output=True, cwd=tmp_path, text=True)
assert p_add.returncode == 0
commit_cmd = [git2cpp_path, "commit", "-m", "Add file in subdirectory"]
p_commit = subprocess.run(commit_cmd, capture_output=True, cwd=tmp_path, text=True)
assert p_commit.returncode == 0
# Remove the file
rm_cmd = [git2cpp_path, "rm", "test/test.txt"]
p_rm = subprocess.run(rm_cmd, capture_output=True, cwd=tmp_path, text=True)
assert p_rm.returncode == 0
# Verify the file was removed
assert not test_file.exists()
# Check git status
status_cmd = [git2cpp_path, "status", "--long"]
p_status = subprocess.run(status_cmd, capture_output=True, cwd=tmp_path, text=True)
assert p_status.returncode == 0
assert "Changes to be committed" in p_status.stdout
assert "deleted" in p_status.stdout
def test_rm_nogit(git2cpp_path, tmp_path):
"""Test that rm fails when not in a git repository"""
# Create a test file outside a git repo
test_file = tmp_path / "test.txt"
test_file.write_text("test content")
# Try to rm without being in a git repo
rm_cmd = [git2cpp_path, "rm", "test.txt"]
p_rm = subprocess.run(rm_cmd, capture_output=True, cwd=tmp_path, text=True)
assert p_rm.returncode != 0
def test_rm_nested_directory_recursive(commit_env_config, git2cpp_path, tmp_path):
"""Test removing a nested directory structure with -r flag"""
cmd_init = [git2cpp_path, "init", "."]
p_init = subprocess.run(cmd_init, capture_output=True, cwd=tmp_path)
assert p_init.returncode == 0
# Create nested directory structure
nested_dir = tmp_path / "level1" / "level2"
nested_dir.mkdir(parents=True)
file1 = tmp_path / "level1" / "file1.txt"
file1.write_text("content 1")
file2 = nested_dir / "file2.txt"
file2.write_text("content 2")
# Add and commit the files
add_cmd = [git2cpp_path, "add", "level1/file1.txt", "level1/level2/file2.txt"]
p_add = subprocess.run(add_cmd, capture_output=True, cwd=tmp_path, text=True)
assert p_add.returncode == 0
commit_cmd = [git2cpp_path, "commit", "-m", "Add nested structure"]
p_commit = subprocess.run(commit_cmd, capture_output=True, cwd=tmp_path, text=True)
assert p_commit.returncode == 0
# Remove the directory tree with -r flag
rm_cmd = [git2cpp_path, "rm", "-r", "level1"]
p_rm = subprocess.run(rm_cmd, capture_output=True, cwd=tmp_path, text=True)
assert p_rm.returncode == 0
# Check git status
status_cmd = [git2cpp_path, "status", "--long"]
p_status = subprocess.run(status_cmd, capture_output=True, cwd=tmp_path, text=True)
assert p_status.returncode == 0
assert "Changes to be committed" in p_status.stdout
assert "deleted" in p_status.stdout
def test_rm_mixed_files_and_directory(commit_env_config, git2cpp_path, tmp_path):
"""Test removing both individual files and directories in one command"""
cmd_init = [git2cpp_path, "init", "."]
p_init = subprocess.run(cmd_init, capture_output=True, cwd=tmp_path)
assert p_init.returncode == 0
# Create a file and a directory with contents
single_file = tmp_path / "single.txt"
single_file.write_text("single file")
test_dir = tmp_path / "remove_dir"
test_dir.mkdir()
dir_file = test_dir / "file.txt"
dir_file.write_text("file in dir")
# Add and commit everything
add_cmd = [git2cpp_path, "add", "single.txt", "remove_dir/file.txt"]
p_add = subprocess.run(add_cmd, capture_output=True, cwd=tmp_path, text=True)
assert p_add.returncode == 0
commit_cmd = [git2cpp_path, "commit", "-m", "Add mixed content"]
p_commit = subprocess.run(commit_cmd, capture_output=True, cwd=tmp_path, text=True)
assert p_commit.returncode == 0
# Remove both file and directory
rm_cmd = [git2cpp_path, "rm", "-r", "single.txt", "remove_dir"]
p_rm = subprocess.run(rm_cmd, capture_output=True, cwd=tmp_path, text=True)
assert p_rm.returncode == 0
# Verify everything was removed
assert not single_file.exists()
# Check git status
status_cmd = [git2cpp_path, "status", "--long"]
p_status = subprocess.run(status_cmd, capture_output=True, cwd=tmp_path, text=True)
assert p_status.returncode == 0
assert "Changes to be committed" in p_status.stdout
assert "deleted" in p_status.stdout