import pathlib
import shutil
import subprocess
import unittest.mock

import tooncher


def test_start_engine():
    process = tooncher.start_engine(
        engine_path=pathlib.Path(shutil.which("printenv")),
        gameserver="gameserver",
        playcookie="cookie",
        stdout=subprocess.PIPE,
        stderr=subprocess.PIPE,
    )
    assert isinstance(process, subprocess.Popen)
    stdout, stderr = process.communicate()
    assert not stderr
    env = stdout.strip().split(b"\n")
    assert b"TTR_GAMESERVER=gameserver" in env
    assert b"TTR_PLAYCOOKIE=cookie" in env


@unittest.mock.patch("os.environ", {"SOME": "VAR", "OTHER": "VALUE"})
def test_start_engine_mac():
    app_support_path = "/Users/me/Library/Application Support"
    engine_path = pathlib.Path(app_support_path).joinpath(
        "Toontown Rewritten", "Toontown Rewritten"
    )
    with unittest.mock.patch("subprocess.Popen") as popen_mock:
        with unittest.mock.patch("sys.platform", "darwin"):
            # python3.5's pathlib.Path.resolve raises FileNotFoundError
            with unittest.mock.patch(
                "pathlib.Path.resolve",
                new=lambda p: p.with_suffix(".resolved"),
            ):
                tooncher.start_engine(
                    engine_path=engine_path,
                    gameserver="gameserver",
                    playcookie="cookie",
                    check=True,
                )
    popen_mock.assert_called_once_with(
        args=[str(engine_path) + ".resolved"],
        check=True,
        cwd=str(engine_path.parent),
        env={
            "SOME": "VAR",
            "OTHER": "VALUE",
            "TTR_GAMESERVER": "gameserver",
            "TTR_PLAYCOOKIE": "cookie",
            "DYLD_LIBRARY_PATH": app_support_path
            + "/Toontown Rewritten/Libraries.bundle",
            "DYLD_FRAMEWORK_PATH": app_support_path + "/Toontown Rewritten/Frameworks",
        },
    )


def test_start_engine_xorg():
    with unittest.mock.patch("subprocess.Popen") as popen_mock:
        with unittest.mock.patch("os.environ", {"XAUTHORITY": "/home/me/.Xauthority"}):
            with unittest.mock.patch("sys.platform", "linux"):
                with unittest.mock.patch(  # python3.5
                    "pathlib.Path.resolve",
                    new=lambda p: p.with_suffix(".resolved"),
                ):
                    tooncher.start_engine(
                        engine_path=pathlib.PosixPath(
                            "/opt/toontown-rewritter/TTREngine"
                        ),
                        gameserver="gameserver.tld",
                        playcookie="cookie123",
                        check=False,
                    )
    popen_mock.assert_called_once_with(
        args=["/opt/toontown-rewritter/TTREngine.resolved"],
        check=False,
        cwd="/opt/toontown-rewritter",
        env={
            "TTR_GAMESERVER": "gameserver.tld",
            "TTR_PLAYCOOKIE": "cookie123",
            "XAUTHORITY": "/home/me/.Xauthority",
        },
    )