"""Unit tests: copy_perms"""

import os

import pytest

OCTAL = "7654"
NON_OCTAL = "9876"


@pytest.mark.parametrize("stat_broken", [True, False], ids=["normal", "stat broken"])
def test_copy_perms(runner, yadm, tmpdir, stat_broken):
    """Test function copy_perms"""
    src_mode = 0o754
    dst_mode = 0o644
    source = tmpdir.join("source")
    source.write("test", ensure=True)
    source.chmod(src_mode)

    dest = tmpdir.join("dest")
    dest.write("test", ensure=True)
    dest.chmod(dst_mode)

    override_stat = ""
    if stat_broken:
        override_stat = "function stat() { echo broken; }"
    script = f"""
        YADM_TEST=1 source {yadm}
        {override_stat}
        copy_perms "{source}" "{dest}"
    """
    run = runner(command=["bash"], inp=script)
    assert run.success
    assert run.err == ""
    assert run.out == ""
    expected = dst_mode if stat_broken else src_mode
    assert oct(os.stat(dest).st_mode)[-3:] == oct(expected)[-3:]


@pytest.mark.parametrize("stat_output", [OCTAL, NON_OCTAL], ids=["octal", "non-octal"])
def test_get_mode(runner, yadm, stat_output):
    """Test function get_mode"""
    script = f"""
        YADM_TEST=1 source {yadm}
        function stat() {{ echo {stat_output}; }}
        mode=$(get_mode abc)
        echo "MODE:$mode"
    """
    run = runner(command=["bash"], inp=script)
    assert run.success
    assert run.err == ""
    expected = OCTAL if stat_output == OCTAL else ""
    assert f"MODE:{expected}\n" in run.out