-
Notifications
You must be signed in to change notification settings - Fork 134
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
2 changed files
with
140 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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, " ") |