"""xontrib tests, such as they are"""
import sys

import pytest

from xonsh.xontribs import (
    xontrib_context,
    xontribs_load,
    xontribs_loaded,
    xontribs_main,
    xontribs_reload,
    xontribs_unload,
)


@pytest.fixture
def tmpmod(tmpdir):
    """
    Same as tmpdir but also adds/removes it to the front of sys.path.

    Also cleans out any modules loaded as part of the test.
    """
    sys.path.insert(0, str(tmpdir))
    loadedmods = set(sys.modules.keys())
    try:
        yield tmpdir
    finally:
        del sys.path[0]
        newmods = set(sys.modules.keys()) - loadedmods
        for m in newmods:
            del sys.modules[m]


def test_noall(tmpmod):
    """
    Tests what get's exported from a module without __all__
    """

    with tmpmod.mkdir("xontrib").join("spameggs.py").open("w") as x:
        x.write(
            """
spam = 1
eggs = 2
_foobar = 3
"""
        )

    ctx = xontrib_context("spameggs")
    assert ctx == {"spam": 1, "eggs": 2}


def test_withall(tmpmod):
    """
    Tests what get's exported from a module with __all__
    """

    with tmpmod.mkdir("xontrib").join("spameggs.py").open("w") as x:
        x.write(
            """
__all__ = 'spam', '_foobar'
spam = 1
eggs = 2
_foobar = 3
"""
        )

    ctx = xontrib_context("spameggs")
    assert ctx == {"spam": 1, "_foobar": 3}


def test_xshxontrib(tmpmod):
    """
    Test that .xsh xontribs are loadable
    """
    with tmpmod.mkdir("xontrib").join("script.xsh").open("w") as x:
        x.write(
            """
hello = 'world'
"""
        )

    ctx = xontrib_context("script")
    assert ctx == {"hello": "world"}


def test_xontrib_load(tmpmod):
    """
    Test that .xsh xontribs are loadable
    """
    with tmpmod.mkdir("xontrib").join("script.xsh").open("w") as x:
        x.write(
            """
hello = 'world'
"""
        )

    xontribs_load(["script"])
    assert "script" in xontribs_loaded()


def test_xontrib_unload(tmpmod, xession):
    with tmpmod.mkdir("xontrib").join("script.py").open("w") as x:
        x.write(
            """
hello = 'world'

def _unload_xontrib_(xsh): del xsh.ctx['hello']
"""
        )

    xontribs_load(["script"])
    assert "script" in xontribs_loaded()
    assert "hello" in xession.ctx
    xontribs_unload(["script"])
    assert "script" not in xontribs_loaded()
    assert "hello" not in xession.ctx


def test_xontrib_reload(tmpmod, xession):
    with tmpmod.mkdir("xontrib").join("script.py").open("w") as x:
        x.write(
            """
hello = 'world'

def _unload_xontrib_(xsh): del xsh.ctx['hello']
"""
        )

    xontribs_load(["script"])
    assert "script" in xontribs_loaded()
    assert xession.ctx["hello"] == "world"

    with tmpmod.join("xontrib").join("script.py").open("w") as x:
        x.write(
            """
hello = 'world1'

def _unload_xontrib_(xsh): del xsh.ctx['hello']
"""
        )
    xontribs_reload(["script"])
    assert "script" in xontribs_loaded()
    assert xession.ctx["hello"] == "world1"


def test_xontrib_load_dashed(tmpmod):
    """
    Test that .xsh xontribs are loadable
    """
    with tmpmod.mkdir("xontrib").join("scri-pt.xsh").open("w") as x:
        x.write(
            """
hello = 'world'
"""
        )

    xontribs_load(["scri-pt"])
    assert "scri-pt" in xontribs_loaded()


def test_xontrib_list(xession, capsys):
    xontribs_main(["list"])
    out, err = capsys.readouterr()
    assert "abbrevs" in out
