Skip to content

Commit

Permalink
Move manager related tests to proper module
Browse files Browse the repository at this point in the history
  • Loading branch information
Tyler Goodlet committed May 22, 2018
1 parent 32a0287 commit b093f9e
Show file tree
Hide file tree
Showing 2 changed files with 151 additions and 150 deletions.
149 changes: 1 addition & 148 deletions testing/test_hookcaller.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,6 @@
import pytest
import sys
import types

from pluggy import PluginManager, HookimplMarker, HookspecMarker
from pluggy import HookimplMarker, HookspecMarker
from pluggy.hooks import HookImpl

hookspec = HookspecMarker("example")
Expand Down Expand Up @@ -206,148 +204,3 @@ def hello(self, arg):
assert not hasattr(hook, 'world')
pm.unregister(plugin)
assert hook.hello(arg=3) == []


def test_load_setuptools_instantiation(monkeypatch, pm):
pkg_resources = pytest.importorskip("pkg_resources")

def my_iter(name):
assert name == "hello"

class EntryPoint(object):
name = "myname"
dist = None

def load(self):
class PseudoPlugin(object):
x = 42
return PseudoPlugin()

return iter([EntryPoint()])

monkeypatch.setattr(pkg_resources, 'iter_entry_points', my_iter)
num = pm.load_setuptools_entrypoints("hello")
assert num == 1
plugin = pm.get_plugin("myname")
assert plugin.x == 42
assert pm.list_plugin_distinfo() == [(plugin, None)]


def test_load_setuptools_not_installed(monkeypatch, pm):
monkeypatch.setitem(
sys.modules, 'pkg_resources',
types.ModuleType("pkg_resources"))

with pytest.raises(ImportError):
pm.load_setuptools_entrypoints("qwe")


def test_add_tracefuncs(he_pm):
out = []

class api1(object):
@hookimpl
def he_method1(self):
out.append("he_method1-api1")

class api2(object):
@hookimpl
def he_method1(self):
out.append("he_method1-api2")

he_pm.register(api1())
he_pm.register(api2())

def before(hook_name, hook_impls, kwargs):
out.append((hook_name, list(hook_impls), kwargs))

def after(outcome, hook_name, hook_impls, kwargs):
out.append((outcome, hook_name, list(hook_impls), kwargs))

undo = he_pm.add_hookcall_monitoring(before, after)

he_pm.hook.he_method1(arg=1)
assert len(out) == 4
assert out[0][0] == "he_method1"
assert len(out[0][1]) == 2
assert isinstance(out[0][2], dict)
assert out[1] == "he_method1-api2"
assert out[2] == "he_method1-api1"
assert len(out[3]) == 4
assert out[3][1] == out[0][0]

undo()
he_pm.hook.he_method1(arg=1)
assert len(out) == 4 + 2


def test_hook_tracing(he_pm):
saveindent = []

class api1(object):
@hookimpl
def he_method1(self):
saveindent.append(he_pm.trace.root.indent)

class api2(object):
@hookimpl
def he_method1(self):
saveindent.append(he_pm.trace.root.indent)
raise ValueError()

he_pm.register(api1())
out = []
he_pm.trace.root.setwriter(out.append)
undo = he_pm.enable_tracing()
try:
indent = he_pm.trace.root.indent
he_pm.hook.he_method1(arg=1)
assert indent == he_pm.trace.root.indent
assert len(out) == 2
assert 'he_method1' in out[0]
assert 'finish' in out[1]

out[:] = []
he_pm.register(api2())

with pytest.raises(ValueError):
he_pm.hook.he_method1(arg=1)
assert he_pm.trace.root.indent == indent
assert saveindent[0] > indent
finally:
undo()


@pytest.mark.parametrize('include_hookspec', [True, False])
def test_prefix_hookimpl(include_hookspec):
with pytest.deprecated_call():
pm = PluginManager(hookspec.project_name, "hello_")

if include_hookspec:
class HookSpec(object):
@hookspec
def hello_myhook(self, arg1):
""" add to arg1 """

pm.add_hookspecs(HookSpec)

class Plugin(object):
def hello_myhook(self, arg1):
return arg1 + 1

with pytest.deprecated_call():
pm.register(Plugin())
pm.register(Plugin())
results = pm.hook.hello_myhook(arg1=17)
assert results == [18, 18]


def test_prefix_hookimpl_dontmatch_module():
with pytest.deprecated_call():
pm = PluginManager(hookspec.project_name, "hello_")

class BadPlugin(object):
hello_module = __import__('email')

pm.register(BadPlugin())
pm.check_pending()
152 changes: 150 additions & 2 deletions testing/test_pluginmanager.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,10 @@
import pytest
import types
from pluggy import (PluginValidationError,
HookCallError, HookimplMarker, HookspecMarker)
import sys
from pluggy import (
PluginManager, PluginValidationError,
HookCallError, HookimplMarker, HookspecMarker
)


hookspec = HookspecMarker("example")
Expand Down Expand Up @@ -418,3 +421,148 @@ def m(self, x):
pm.register(p1)
with pytest.deprecated_call():
pm.hook.m.call_historic(kwargs=dict(x=10), proc=lambda res: res)


def test_load_setuptools_instantiation(monkeypatch, pm):
pkg_resources = pytest.importorskip("pkg_resources")

def my_iter(name):
assert name == "hello"

class EntryPoint(object):
name = "myname"
dist = None

def load(self):
class PseudoPlugin(object):
x = 42
return PseudoPlugin()

return iter([EntryPoint()])

monkeypatch.setattr(pkg_resources, 'iter_entry_points', my_iter)
num = pm.load_setuptools_entrypoints("hello")
assert num == 1
plugin = pm.get_plugin("myname")
assert plugin.x == 42
assert pm.list_plugin_distinfo() == [(plugin, None)]


def test_load_setuptools_not_installed(monkeypatch, pm):
monkeypatch.setitem(
sys.modules, 'pkg_resources',
types.ModuleType("pkg_resources"))

with pytest.raises(ImportError):
pm.load_setuptools_entrypoints("qwe")


def test_add_tracefuncs(he_pm):
out = []

class api1(object):
@hookimpl
def he_method1(self):
out.append("he_method1-api1")

class api2(object):
@hookimpl
def he_method1(self):
out.append("he_method1-api2")

he_pm.register(api1())
he_pm.register(api2())

def before(hook_name, hook_impls, kwargs):
out.append((hook_name, list(hook_impls), kwargs))

def after(outcome, hook_name, hook_impls, kwargs):
out.append((outcome, hook_name, list(hook_impls), kwargs))

undo = he_pm.add_hookcall_monitoring(before, after)

he_pm.hook.he_method1(arg=1)
assert len(out) == 4
assert out[0][0] == "he_method1"
assert len(out[0][1]) == 2
assert isinstance(out[0][2], dict)
assert out[1] == "he_method1-api2"
assert out[2] == "he_method1-api1"
assert len(out[3]) == 4
assert out[3][1] == out[0][0]

undo()
he_pm.hook.he_method1(arg=1)
assert len(out) == 4 + 2


def test_hook_tracing(he_pm):
saveindent = []

class api1(object):
@hookimpl
def he_method1(self):
saveindent.append(he_pm.trace.root.indent)

class api2(object):
@hookimpl
def he_method1(self):
saveindent.append(he_pm.trace.root.indent)
raise ValueError()

he_pm.register(api1())
out = []
he_pm.trace.root.setwriter(out.append)
undo = he_pm.enable_tracing()
try:
indent = he_pm.trace.root.indent
he_pm.hook.he_method1(arg=1)
assert indent == he_pm.trace.root.indent
assert len(out) == 2
assert 'he_method1' in out[0]
assert 'finish' in out[1]

out[:] = []
he_pm.register(api2())

with pytest.raises(ValueError):
he_pm.hook.he_method1(arg=1)
assert he_pm.trace.root.indent == indent
assert saveindent[0] > indent
finally:
undo()


@pytest.mark.parametrize('include_hookspec', [True, False])
def test_prefix_hookimpl(include_hookspec):
with pytest.deprecated_call():
pm = PluginManager(hookspec.project_name, "hello_")

if include_hookspec:
class HookSpec(object):
@hookspec
def hello_myhook(self, arg1):
""" add to arg1 """

pm.add_hookspecs(HookSpec)

class Plugin(object):
def hello_myhook(self, arg1):
return arg1 + 1

with pytest.deprecated_call():
pm.register(Plugin())
pm.register(Plugin())
results = pm.hook.hello_myhook(arg1=17)
assert results == [18, 18]


def test_prefix_hookimpl_dontmatch_module():
with pytest.deprecated_call():
pm = PluginManager(hookspec.project_name, "hello_")

class BadPlugin(object):
hello_module = __import__('email')

pm.register(BadPlugin())
pm.check_pending()

0 comments on commit b093f9e

Please sign in to comment.