[ Web Proxy ]
URL:
Viewing: https://raw.githubusercontent.com/QuantStack/git2cpp/main/test/test_rm.py [Back]  [Original]

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

Web Proxy Viewer  |  New URL  |  Original Page