import pathlib

import mock
import pytest
import tg


# HACK:
def pytest_configure():
    # Register global dummy tg.context to avoid "TypeError: No object (name: context) has been registered for this thread"
    tg.request_local.context._push_object(tg.util.bunch.Bunch())
    # could be removed again after use with
    # tg.request_local.context._pop_object ... but we keep it around forever as
    # a reasonable sentinel

here_kallithea = str(pathlib.Path(__file__).parent / 'kallithea')

# during doctest verification, normally all python files will be imported.
# Thus, files that cannot be imported normally should be ignored.
# Files that generate ImportErrors are ignored via
# '--doctest-ignore-import-errors' (pytest.ini)
kallithea_ignore_paths = (
    # AttributeError: 'module' object has no attribute 'config'
    '/kallithea/alembic/env.py',
    # collection of the following file messes up the rest of test execution
    '/kallithea/tests/scripts/manual_test_concurrency.py',
)

def pytest_ignore_collect(collection_path):
    path = str(collection_path)

    # ignore all files outside the 'kallithea' directory
    if not path.startswith(here_kallithea):
        return True

    if path.endswith(kallithea_ignore_paths):
        return True

    return None

@pytest.fixture()
def doctest_mock_ugettext(request):
    """Mock ugettext ('_') in the module using this fixture.

    Intended to be used for doctests.

    In a doctest, enable this fixture using:
        >>> getfixture('doctest_mock_ugettext')
    """
    m = __import__(request.module.__name__, globals(), locals(), [None], 0)
    with mock.patch.object(m, '_', lambda s: s):
        yield

if getattr(pytest, 'register_assert_rewrite', None):
    # make sure that all asserts under kallithea/tests benefit from advanced
    # assert reporting with pytest-3.0.0+, including api/api_base.py,
    # models/common.py etc.
    # See also: https://docs.pytest.org/en/latest/assert.html#advanced-assertion-introspection
    pytest.register_assert_rewrite('kallithea.tests')
