"""
Plugin Calls
============

**Module:** ``tests.plugin.test_plugin``
"""

from typing import Callable

from _pytest.pytester import Pytester


def test_plugin_test_multiplication(
    pytester: Pytester, simple_test_csv: str, simple_fruit_test: Callable[[str], str]
) -> None:
    """
    Test a simple round trip (positive test case)

    :param pytester: Pytester fixture
    :param simple_test_csv: Fixture :meth:`~tests.plugin.conftest.simple_test_csv`
    :param simple_fruit_test: Fixture :meth:`~tests.plugin.conftest.simple_fruit_test`
    """

    csv_file = str(pytester.makefile(".csv", simple_test_csv).absolute())

    pytester.makepyfile(simple_fruit_test(csv_file))

    result = pytester.runpytest("-p", "no:bandit")
    result.assert_outcomes(passed=3, failed=1)


def test_plugin_test_error(pytester: Pytester, bad_test_csv: str, simple_fruit_test: Callable[[str], str]) -> None:
    """
    Test if a test error is correctly recognized

    :param pytester: Pytester fixture
    :param bad_test_csv: Fixture :meth:`~tests.plugin.conftest.bad_test_csv`
    :param simple_fruit_test: Fixture :meth:`~tests.plugin.conftest.simple_fruit_test`
    """

    csv_file = str(pytester.makefile(".csv", bad_test_csv).absolute())

    pytester.makepyfile(simple_fruit_test(csv_file))

    result = pytester.runpytest("-p", "no:bandit")
    result.assert_outcomes(errors=1)


def test_plugin_test_text_shorthand(
    pytester: Pytester, text_test_csv: str, simple_text_test: Callable[[str], str]
) -> None:
    """
    Test the shorthand version of the plugin's decorator

    :param pytester: Pytester fixture
    :param text_test_csv: Fixture :meth:`~tests.plugin.conftest.text_test_csv`
    :param simple_text_test: Fixture :meth:`~tests.plugin.conftest.simple_text_test`
    """

    csv_file = str(pytester.makefile(".csv", text_test_csv).absolute())

    pytester.makepyfile(simple_text_test(csv_file))

    result = pytester.runpytest("-p", "no:bandit")
    result.assert_outcomes(passed=2, failed=1)


def test_plugin_all_tests_at_once(  # pylint: disable=too-many-arguments
    pytester: Pytester,
    text_test_csv: str,
    bad_test_csv: str,
    simple_test_csv: str,
    simple_fruit_test: Callable[[str, str], str],
    simple_text_test: Callable[[str], str],
) -> None:
    """
    This is a meta test to check if multiple files would work also. Basically, it's a combination of all the other
    plugin invocation tests of the module :mod:`tests.plugin.test_plugin`.

    We can't run the error-prone test here, because it would stop all tests.

    :param pytester: Pytester fixture
    :param text_test_csv: Fixture :meth:`~tests.plugin.conftest.text_test_csv`
    :param bad_test_csv: Fixture :meth:`~tests.plugin.conftest.bad_test_csv`
    :param text_test_csv: Fixture :meth:`~tests.plugin.conftest.text_test_csv`
    :param simple_fruit_test: Fixture :meth:`~tests.plugin.conftest.simple_fruit_test`
    :param simple_text_test: Fixture :meth:`~tests.plugin.conftest.simple_text_test`
    """

    csv_file_text = str(pytester.makefile(".1.csv", text_test_csv).absolute())
    pytester.makepyfile(test_plugin_test_all_one=simple_text_test(csv_file_text))
    csv_file_bad = str(pytester.makefile(".2.csv", bad_test_csv).absolute())
    pytester.makepyfile(test_plugin_test_all_two=simple_fruit_test(csv_file_bad, "bad_one"))
    csv_file_good = str(pytester.makefile(".3.csv", simple_test_csv).absolute())
    pytester.makepyfile(test_plugin_test_all_three=simple_fruit_test(csv_file_good, "good_one"))

    result = pytester.runpytest("-p", "no:bandit", "test_plugin_test_all_one.py", "test_plugin_test_all_three.py")
    result.assert_outcomes(passed=5, failed=2, errors=0)
