Documentation
#!/usr/bin/env python3

import os
import re

import pytest
from helpers import (
    NonGitDir,
    TempGitRepository,
    TempGitRepositoryWorktree,
    funcname,
    grm,
    shell,
)


@pytest.mark.parametrize("has_config", [True, False])
def test_worktree_status(has_config):
    with TempGitRepositoryWorktree.get(funcname()) as (base_dir, _commit):
        if has_config:
            with open(os.path.join(base_dir, "grm.toml"), "w") as f:
                f.write("")
        cmd = grm(["wt", "add", "test"], cwd=base_dir)
        assert cmd.returncode == 0

        cmd = grm(["wt", "status"], cwd=base_dir)
        assert cmd.returncode == 0
        assert len(cmd.stderr) == 0
        stdout = cmd.stdout.lower()
        assert "test" in stdout


def test_worktree_status_fail_from_subdir():
    with TempGitRepositoryWorktree.get(funcname()) as (base_dir, _commit):
        cmd = grm(["wt", "add", "test"], cwd=base_dir)
        assert cmd.returncode == 0

        cmd = grm(["wt", "status"], cwd=f"{base_dir}/test")
        assert cmd.returncode != 0
        assert len(cmd.stdout) == 0
        assert len(cmd.stderr) != 0


def test_worktree_status_non_worktree():
    with TempGitRepository() as git_dir:
        cmd = grm(["wt", "status"], cwd=git_dir)
        assert cmd.returncode != 0
        assert len(cmd.stdout) == 0
        assert len(cmd.stderr) != 0


def test_worktree_status_non_git():
    with NonGitDir() as base_dir:
        cmd = grm(["wt", "status"], cwd=base_dir)
        assert cmd.returncode != 0
        assert len(cmd.stdout) == 0
        assert len(cmd.stderr) != 0


def test_worktree_status_warn_with_non_worktree_dir():
    with TempGitRepositoryWorktree.get(funcname()) as (base_dir, _commit):
        cmd = grm(["wt", "add", "test"], cwd=base_dir)
        assert cmd.returncode == 0

        shell(
            f"""
            cd {base_dir}
            mkdir not_a_worktree
            """
        )

        cmd = grm(["wt", "status"], cwd=base_dir)

        assert cmd.returncode == 0
        assert len(cmd.stdout) != 0
        assert len(cmd.stderr) != 0
        assert (
            re.match(
                ".*error.*not_a_worktree.*not a valid worktree directory",
                cmd.stderr,
                re.IGNORECASE,
            )
            is not None
        )