# pylint: disable=missing-module-docstring, redefined-outer-name, unused-argument, wrong-import-order, unused-import
import poetry.factory
import poetry.utils.env
import pytest
from poetry.puzzle.provider import Provider

from .fixtures import mock_poetry_factory
from .fixtures import mock_venv
from tox_poetry_installer import constants
from tox_poetry_installer import exceptions
from tox_poetry_installer import utilities


def test_exclude_unsafe():
    """Test that the unsafe packages are properly excluded

    Also ensure that the internal constant matches the value from Poetry
    """
    assert Provider.UNSAFE_PACKAGES == constants.UNSAFE_PACKAGES

    for dep in constants.UNSAFE_PACKAGES:
        assert not utilities.identify_transients(dep, {}, None)


def test_allow_missing():
    """Test that the ``allow_missing`` parameter works as expected"""
    with pytest.raises(exceptions.LockedDepNotFoundError):
        utilities.identify_transients("luke-skywalker", {}, None)

    assert not utilities.identify_transients(
        "darth-vader", {}, None, allow_missing=["darth-vader"]
    )


def test_exclude_pep508():
    """Test that dependencies specified in PEP508 format are properly excluded"""
    for version in [
        "foo==1.0",
        "foo==1",
        "foo>2.0.0",
        "foo<=9.3.4.7.8",
        "foo>999,<=4.6",
        "foo>1234 || foo<2021.01.01",
        "foo!=7",
        "foo~=0.8",
        "foo!=9,==7",
        "=>foo",
    ]:
        with pytest.raises(exceptions.LockedDepVersionConflictError):
            utilities.identify_transients(version, {}, None)


def test_functional(mock_poetry_factory, mock_venv):
    """Integration tests for the :func:`identify_transients` function

    Trivially test that it resolves dependencies properly and that the parent package
    is always the last in the returned list.
    """
    pypoetry = poetry.factory.Factory().create_poetry(None)
    packages = utilities.build_package_map(pypoetry)
    venv = poetry.utils.env.VirtualEnv()  # pylint: disable=no-value-for-parameter

    requests_requires = [
        packages["certifi"][0],
        packages["chardet"][0],
        packages["idna"][0],
        packages["urllib3"][0],
        packages["requests"][0],
    ]

    transients = utilities.identify_transients("requests", packages, venv)

    assert all((item in requests_requires) for item in transients)
    assert all((item in transients) for item in requests_requires)

    for package in [packages["requests"][0], packages["tox"][0], packages["flask"][0]]:
        transients = utilities.identify_transients(package.name, packages, venv)
        assert transients[-1] == package
        assert len(transients) == len(set(transients))
