diff --git a/test/completion/pytest.py b/test/completion/pytest.py index a900dcda..a39b3fb9 100644 --- a/test/completion/pytest.py +++ b/test/completion/pytest.py @@ -183,3 +183,28 @@ def with_annot() -> Generator[float, None, None]: def test_with_annot(inheritance_fixture, with_annot): #? float() with_annot + +# ----------------- +# pytest external plugins +# ----------------- + +#? ['admin_user', 'admin_client'] +def test_z(admin + +#! 15 ['def admin_client'] +def test_p(admin_client): + #? ['login', 'logout'] + admin_client.log + +@pytest.fixture +@some_decorator +#? ['admin_user'] +def bla(admin_u + return + +@pytest.fixture +@some_decorator +#! 12 ['def admin_user'] +def bla(admin_user): + pass + diff --git a/test/examples/pytest_plugin_package/pytest_plugin/fixtures.py b/test/examples/pytest_plugin_package/pytest_plugin/fixtures.py new file mode 100644 index 00000000..a27cfc71 --- /dev/null +++ b/test/examples/pytest_plugin_package/pytest_plugin/fixtures.py @@ -0,0 +1,6 @@ +from pytest import fixture + + +@fixture() +def admin_user(): + pass diff --git a/test/examples/pytest_plugin_package/pytest_plugin/plugin.py b/test/examples/pytest_plugin_package/pytest_plugin/plugin.py new file mode 100644 index 00000000..569d38db --- /dev/null +++ b/test/examples/pytest_plugin_package/pytest_plugin/plugin.py @@ -0,0 +1,18 @@ +import pytest +from pytest import fixture + + +from pytest_plugin.fixtures import admin_user # noqa + + +class Client: + def login(self, **credentials): + ... + + def logout(self): + ... + + +@pytest.fixture() +def admin_client(): + return Client() diff --git a/test/test_integration.py b/test/test_integration.py index 2e5703aa..7f482db4 100644 --- a/test/test_integration.py +++ b/test/test_integration.py @@ -1,4 +1,5 @@ import os +from collections import namedtuple import pytest @@ -42,6 +43,22 @@ def test_completion(case, monkeypatch, environment, has_django): if (not has_django) and case.path.endswith('django.py'): pytest.skip('Needs django to be installed to run this test.') + + if case.path.endswith("pytest.py"): + # to test finding pytest fixtures from external plugins + # add a stub pytest plugin to the project sys_path... + pytest_plugin_dir = str(helpers.get_example_dir("pytest_plugin_package")) + case._project.added_sys_path = [pytest_plugin_dir] + + # ... and mock setuptools entry points to include it + # see https://docs.pytest.org/en/stable/how-to/writing_plugins.html#setuptools-entry-points + def mock_entry_points(group): + assert group == "pytest11" + EntryPoint = namedtuple("EntryPoint", ["value"]) + return [EntryPoint(value="pytest_plugin.plugin")] + + monkeypatch.setattr("jedi.plugins.pytest.entry_points", mock_entry_points) + repo_root = helpers.root_dir monkeypatch.chdir(os.path.join(repo_root, 'jedi')) case.run(assert_case_equal, environment)