Skip to content

Commit

Permalink
Merge 7b21a17 into 2e88e22
Browse files Browse the repository at this point in the history
  • Loading branch information
kurniliya committed May 15, 2014
2 parents 2e88e22 + 7b21a17 commit da29c9e
Show file tree
Hide file tree
Showing 2 changed files with 140 additions and 1 deletion.
2 changes: 1 addition & 1 deletion nose2/events.py
Original file line number Diff line number Diff line change
Expand Up @@ -1124,7 +1124,7 @@ class CreateTestsEvent(Event):
considered relative to this module.
"""
_attrs = Event._attrs = ('loader', 'testNames', 'module')
_attrs = Event._attrs + ('loader', 'testNames', 'module')

def __init__(self, loader, testNames, module, **kw):
self.loader = loader
Expand Down
139 changes: 139 additions & 0 deletions nose2/tests/unit/test_printhooks_plugin.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,139 @@
import sys

import six

from nose2.plugins import printhooks
from nose2 import events, session
from nose2.tests._common import TestCase


class CustomEvent(events.Event):

_attrs = events.Event._attrs + ('args',)

def __init__(self, args, **kw):
self.args = args
super(CustomEvent, self).__init__(**kw)


class TestPluginA(events.Plugin):

def register(self):
super(TestPluginA, self).register()
self.addMethods('pluginHookA')

def register_with_nested_hook(self):
super(TestPluginA, self).register()
self.addMethods('pluginHookB')


class TestPluginB(events.Plugin):

def pluginHookA(self, event):
event.handled = True
return "TestPluginB.pluginHookA"


class TestPluginC(events.Plugin):

def register(self):
super(TestPluginC, self).register()
self.addMethods('pluginHookB1')

def pluginHookB(self, event):
nested_event = CustomEvent('level_two_args')
self.session.hooks.pluginHookB1(nested_event)
event.handled = True
return "TestPluginC.pluginHookB"


class IndentAwarePlugin(events.Plugin):

def pluginHookA(self, event):
event.handled = True
return printhooks.INDENT.pop()


class TestPrintHooksPlugin(TestCase):
tags = ['unit']

def setUp(self):
self.err = sys.stderr
self.buf = six.StringIO()
sys.stderr = self.buf
self.addCleanup(self.restore_stderr)

self.session = session.Session()
self.print_hooks_plugin = printhooks.PrintHooks(session=self.session)
self.plugin_a = TestPluginA(session=self.session)
self.plugin_b = TestPluginB(session=self.session)

def restore_stderr(self):
sys.stderr = self.err

def test_traces_hooks_created_after_own_registration(self):
self.print_hooks_plugin.register()
self.plugin_a.register()
self.plugin_b.register()

event = CustomEvent('args')
result = self.session.hooks.pluginHookA(event)
self.assertEqual(result, "TestPluginB.pluginHookA")
self.assertEqual("\n"
"pluginHookA: "
"CustomEvent(handled=False, args='args')",
self.buf.getvalue())

def test_traces_hooks_created_before_own_registration(self):
self.plugin_a.register()
self.plugin_b.register()
self.print_hooks_plugin.register()

event = CustomEvent('args')
result = self.session.hooks.pluginHookA(event)
self.assertEqual(result, "TestPluginB.pluginHookA")
self.assertEqual("\n"
"pluginHookA: "
"CustomEvent(handled=False, args='args')",
self.buf.getvalue())

def test_traces_hooks_that_nobody_implements(self):
self.plugin_a.register()
self.print_hooks_plugin.register()

event = CustomEvent('args')
result = self.session.hooks.pluginHookA(event)
self.assertEqual(result, None)
self.assertEqual("\n"
"pluginHookA: "
"CustomEvent(handled=False, args='args')",
self.buf.getvalue())

def test_indents_nested_hooks_in_trace(self):
self.plugin_c = TestPluginC(session=self.session)

self.plugin_a.register_with_nested_hook()
self.plugin_c.register()
self.print_hooks_plugin.register()

event = CustomEvent('level_one_args')
result = self.session.hooks.pluginHookB(event)
self.assertEqual(result, "TestPluginC.pluginHookB")
self.assertEqual("\n"
"pluginHookB: "
"CustomEvent(handled=False, args='level_one_args')"
"\n "
"pluginHookB1: "
"CustomEvent(handled=False, args='level_two_args')",
self.buf.getvalue())

def test_hook_implementors_can_modify_trace_indent(self):
self.indent_aware_plugin = IndentAwarePlugin(session=self.session)

self.plugin_a.register()
self.indent_aware_plugin.register()
self.print_hooks_plugin.register()

event = CustomEvent('args')
result = self.session.hooks.pluginHookA(event)
self.assertEqual(result, " ")

0 comments on commit da29c9e

Please sign in to comment.