"""
Integration test to check the integrity of the
distribution.

This file is explicitly not named 'test_' to avoid
being collected by pytest, but must instead be
invoked explicitly (i.e. pytest tests/dist-check.py).

This test cannot be invoked as part of the normal
test suite nor can it be included in the normal test
suite because it must import cherrypy late (after
removing sys.path[0]).
"""

import os
import sys

import pytest


@pytest.fixture(params=[
    'favicon.ico',
    'scaffold/static/made_with_cherrypy_small.png',
    'tutorial/tutorial.conf',
    'tutorial/custom_error.html',
])
def data_file_path(request):
    'generates data file paths expected to be found in the package'
    return request.param


@pytest.fixture(autouse=True, scope='session')
def remove_paths_to_checkout():
    """Remove paths to ./cherrypy"""
    to_remove = [
        path
        for path in sys.path
        if os.path.isdir(path)
        and os.path.samefile(path, os.path.curdir)
    ]
    print('Removing', to_remove)
    list(map(sys.path.remove, to_remove))
    assert 'cherrypy' not in sys.modules


def test_data_files_installed(data_file_path):
    """
    Ensure that data file paths are available in the
    installed package as expected.
    """
    import cherrypy
    root = os.path.dirname(cherrypy.__file__)
    fn = os.path.join(root, data_file_path)
    assert os.path.exists(fn), fn
    # make sure the file isn't in the local checkout
    assert not os.path.samefile(fn, os.path.join('cherrypy', data_file_path))


def test_sanity():
    """
    Test the test to show that it does fail when a file
    is missing.
    """
    with pytest.raises(Exception):
        test_data_files_installed('does not exist')
