Add an E2E test suite
This commit is contained in:
210
e2e_tests/test_worktrees.py
Normal file
210
e2e_tests/test_worktrees.py
Normal file
@@ -0,0 +1,210 @@
|
||||
#!/usr/bin/env python3
|
||||
|
||||
from helpers import *
|
||||
|
||||
import git
|
||||
|
||||
|
||||
def test_worktree_add_simple():
|
||||
with TempGitRepositoryWorktree() as base_dir:
|
||||
before = checksum_directory(base_dir)
|
||||
|
||||
cmd = grm(["wt", "add", "test"], cwd=base_dir)
|
||||
assert cmd.returncode == 0
|
||||
|
||||
files = os.listdir(base_dir)
|
||||
assert len(files) == 2
|
||||
assert set(files) == {".git-main-working-tree", "test"}
|
||||
|
||||
repo = git.Repo(os.path.join(base_dir, "test"))
|
||||
assert not repo.bare
|
||||
assert not repo.is_dirty()
|
||||
assert str(repo.active_branch) == "test"
|
||||
assert repo.active_branch.tracking_branch() is None
|
||||
|
||||
|
||||
def test_worktree_add_with_tracking():
|
||||
with TempGitRepositoryWorktree() as base_dir:
|
||||
before = checksum_directory(base_dir)
|
||||
|
||||
cmd = grm(["wt", "add", "test", "--track", "origin/test"], cwd=base_dir)
|
||||
print(cmd.stderr)
|
||||
assert cmd.returncode == 0
|
||||
|
||||
files = os.listdir(base_dir)
|
||||
assert len(files) == 2
|
||||
assert set(files) == {".git-main-working-tree", "test"}
|
||||
|
||||
repo = git.Repo(os.path.join(base_dir, "test"))
|
||||
assert not repo.bare
|
||||
assert not repo.is_dirty()
|
||||
assert str(repo.active_branch) == "test"
|
||||
assert str(repo.active_branch.tracking_branch()) == "origin/test"
|
||||
|
||||
|
||||
def test_worktree_delete():
|
||||
with TempGitRepositoryWorktree() as base_dir:
|
||||
cmd = grm(["wt", "add", "test", "--track", "origin/test"], cwd=base_dir)
|
||||
assert cmd.returncode == 0
|
||||
assert "test" in os.listdir(base_dir)
|
||||
|
||||
cmd = grm(["wt", "delete", "test"], cwd=base_dir)
|
||||
assert cmd.returncode == 0
|
||||
assert "test" not in os.listdir(base_dir)
|
||||
|
||||
cmd = grm(["wt", "add", "check"], cwd=base_dir)
|
||||
assert cmd.returncode == 0
|
||||
repo = git.Repo(os.path.join(base_dir, ".git-main-working-tree"))
|
||||
print(repo.branches)
|
||||
assert "test" not in [str(b) for b in repo.branches]
|
||||
|
||||
|
||||
def test_worktree_delete_refusal_no_tracking_branch():
|
||||
with TempGitRepositoryWorktree() as base_dir:
|
||||
before = checksum_directory(base_dir)
|
||||
|
||||
cmd = grm(["wt", "add", "test"], cwd=base_dir)
|
||||
assert cmd.returncode == 0
|
||||
|
||||
before = checksum_directory(f"{base_dir}/test")
|
||||
cmd = grm(["wt", "delete", "test"], cwd=base_dir)
|
||||
assert cmd.returncode != 0
|
||||
stderr = cmd.stderr.lower()
|
||||
assert "refuse" in stderr or "refusing" in stderr
|
||||
assert "test" in os.listdir(base_dir)
|
||||
|
||||
after = checksum_directory(f"{base_dir}/test")
|
||||
assert before == after
|
||||
|
||||
|
||||
def test_worktree_delete_refusal_uncommited_changes_new_file():
|
||||
with TempGitRepositoryWorktree() as base_dir:
|
||||
before = checksum_directory(base_dir)
|
||||
|
||||
cmd = grm(["wt", "add", "test", "--track", "origin/test"], cwd=base_dir)
|
||||
assert cmd.returncode == 0
|
||||
|
||||
shell(f"cd {base_dir}/test && touch changed_file")
|
||||
|
||||
before = checksum_directory(f"{base_dir}/test")
|
||||
cmd = grm(["wt", "delete", "test"], cwd=base_dir)
|
||||
assert cmd.returncode != 0
|
||||
stderr = cmd.stderr.lower()
|
||||
assert "refuse" in stderr or "refusing" in stderr
|
||||
assert "test" in os.listdir(base_dir)
|
||||
|
||||
after = checksum_directory(f"{base_dir}/test")
|
||||
assert before == after
|
||||
|
||||
|
||||
def test_worktree_delete_refusal_uncommited_changes_changed_file():
|
||||
with TempGitRepositoryWorktree() as base_dir:
|
||||
before = checksum_directory(base_dir)
|
||||
|
||||
cmd = grm(["wt", "add", "test", "--track", "origin/test"], cwd=base_dir)
|
||||
assert cmd.returncode == 0
|
||||
|
||||
shell(f"cd {base_dir}/test && git ls-files | shuf | head | xargs rm -rf")
|
||||
|
||||
before = checksum_directory(f"{base_dir}/test")
|
||||
cmd = grm(["wt", "delete", "test"], cwd=base_dir)
|
||||
assert cmd.returncode != 0
|
||||
stderr = cmd.stderr.lower()
|
||||
assert "refuse" in stderr or "refusing" in stderr
|
||||
assert "test" in os.listdir(base_dir)
|
||||
|
||||
after = checksum_directory(f"{base_dir}/test")
|
||||
assert before == after
|
||||
|
||||
|
||||
def test_worktree_delete_refusal_uncommited_changes_deleted_file():
|
||||
with TempGitRepositoryWorktree() as base_dir:
|
||||
before = checksum_directory(base_dir)
|
||||
|
||||
cmd = grm(["wt", "add", "test", "--track", "origin/test"], cwd=base_dir)
|
||||
assert cmd.returncode == 0
|
||||
|
||||
shell(
|
||||
f"cd {base_dir}/test && git ls-files | shuf | head | while read f ; do echo $RANDOM > $f ; done"
|
||||
)
|
||||
|
||||
before = checksum_directory(f"{base_dir}/test")
|
||||
cmd = grm(["wt", "delete", "test"], cwd=base_dir)
|
||||
assert cmd.returncode != 0
|
||||
stderr = cmd.stderr.lower()
|
||||
assert "refuse" in stderr or "refusing" in stderr
|
||||
assert "test" in os.listdir(base_dir)
|
||||
|
||||
after = checksum_directory(f"{base_dir}/test")
|
||||
assert before == after
|
||||
|
||||
|
||||
def test_worktree_delete_refusal_commited_changes():
|
||||
with TempGitRepositoryWorktree() as base_dir:
|
||||
before = checksum_directory(base_dir)
|
||||
|
||||
cmd = grm(["wt", "add", "test", "--track", "origin/test"], cwd=base_dir)
|
||||
assert cmd.returncode == 0
|
||||
|
||||
shell(
|
||||
f'cd {base_dir}/test && touch changed_file && git add changed_file && git commit -m "commitmsg"'
|
||||
)
|
||||
|
||||
before = checksum_directory(f"{base_dir}/test")
|
||||
cmd = grm(["wt", "delete", "test"], cwd=base_dir)
|
||||
assert cmd.returncode != 0
|
||||
stderr = cmd.stderr.lower()
|
||||
assert "refuse" in stderr or "refusing" in stderr
|
||||
assert "test" in os.listdir(base_dir)
|
||||
|
||||
after = checksum_directory(f"{base_dir}/test")
|
||||
assert before == after
|
||||
|
||||
|
||||
def test_worktree_delete_refusal_tracking_branch_mismatch():
|
||||
with TempGitRepositoryWorktree() as base_dir:
|
||||
before = checksum_directory(base_dir)
|
||||
|
||||
cmd = grm(["wt", "add", "test", "--track", "origin/test"], cwd=base_dir)
|
||||
assert cmd.returncode == 0
|
||||
|
||||
shell(
|
||||
f"cd {base_dir}/test && git push origin test && git reset --hard origin/test^"
|
||||
)
|
||||
|
||||
before = checksum_directory(f"{base_dir}/test")
|
||||
cmd = grm(["wt", "delete", "test"], cwd=base_dir)
|
||||
assert cmd.returncode != 0
|
||||
stderr = cmd.stderr.lower()
|
||||
assert "refuse" in stderr or "refusing" in stderr
|
||||
assert "test" in os.listdir(base_dir)
|
||||
|
||||
after = checksum_directory(f"{base_dir}/test")
|
||||
assert before == after
|
||||
|
||||
|
||||
def test_worktree_delete_force_refusal():
|
||||
with TempGitRepositoryWorktree() as base_dir:
|
||||
before = checksum_directory(base_dir)
|
||||
|
||||
cmd = grm(["wt", "add", "test"], cwd=base_dir)
|
||||
assert cmd.returncode == 0
|
||||
|
||||
cmd = grm(["wt", "delete", "test", "--force"], cwd=base_dir)
|
||||
assert cmd.returncode == 0
|
||||
assert "test" not in os.listdir(base_dir)
|
||||
|
||||
|
||||
def test_worktree_add_delete_add():
|
||||
with TempGitRepositoryWorktree() as base_dir:
|
||||
cmd = grm(["wt", "add", "test", "--track", "origin/test"], cwd=base_dir)
|
||||
assert cmd.returncode == 0
|
||||
assert "test" in os.listdir(base_dir)
|
||||
|
||||
cmd = grm(["wt", "delete", "test"], cwd=base_dir)
|
||||
assert cmd.returncode == 0
|
||||
assert "test" not in os.listdir(base_dir)
|
||||
|
||||
cmd = grm(["wt", "add", "test", "--track", "origin/test"], cwd=base_dir)
|
||||
assert cmd.returncode == 0
|
||||
assert "test" in os.listdir(base_dir)
|
||||
Reference in New Issue
Block a user