summaryrefslogtreecommitdiff
path: root/tests/test_plugin.py
diff options
context:
space:
mode:
authorkotfu <kotfu@kotfu.net>2018-05-26 16:23:15 -0600
committerkotfu <kotfu@kotfu.net>2018-05-26 16:23:15 -0600
commit4d7d98c0c856cb5ce1ac1dbe214a542f4a83a813 (patch)
tree0c7ae5f309d6a7141118d75beaa4c69efc1c1fde /tests/test_plugin.py
parentc390a6bc1aed393b7c7d4e493d61636b34bcdc9a (diff)
downloadcmd2-git-4d7d98c0c856cb5ce1ac1dbe214a542f4a83a813.tar.gz
Document and test postparsing hooks
Diffstat (limited to 'tests/test_plugin.py')
-rw-r--r--tests/test_plugin.py179
1 files changed, 179 insertions, 0 deletions
diff --git a/tests/test_plugin.py b/tests/test_plugin.py
new file mode 100644
index 00000000..c82e6bcd
--- /dev/null
+++ b/tests/test_plugin.py
@@ -0,0 +1,179 @@
+# coding=utf-8
+"""
+Test plugin infrastructure and hooks.
+
+Copyright 2018 Jared Crapo <jared@kotfu.net>
+Released under MIT license, see LICENSE file
+"""
+
+from typing import Tuple
+
+import pytest
+
+import cmd2
+
+from .conftest import StdOut
+
+class Plugin:
+ "A mixin class for testing hook registration and calling"
+ def __init__(self, *args, **kwargs):
+ super().__init__(*args, **kwargs)
+ self.reset_counters()
+
+ def reset_counters(self):
+ self.called_pph = 0
+
+ def pph(self, statement: cmd2.Statement) -> Tuple[bool, cmd2.Statement]:
+ self.called_pph += 1
+ return False, statement
+
+ def pph_stop(self, statement: cmd2.Statement) -> Tuple[bool, cmd2.Statement]:
+ self.called_pph += 1
+ return True, statement
+
+ def pph_emptystatement(self, statement: cmd2.Statement) -> Tuple[bool, cmd2.Statement]:
+ self.called_pph += 1
+ raise cmd2.EmptyStatement
+
+ def pph_exception(self, statement: cmd2.Statement) -> Tuple[bool, cmd2.Statement]:
+ self.called_pph += 1
+ raise ValueError
+
+class PluggedApp(Plugin, cmd2.Cmd):
+ "A sample app with a plugin mixed in"
+ def __init__(self, *args, **kwargs):
+ super().__init__(*args, **kwargs)
+
+ def do_say(self, statement):
+ """Repeat back the arguments"""
+ self.poutput(statement)
+
+###
+#
+# test hooks
+#
+###
+def test_postparsing_hook(capsys):
+ app = PluggedApp()
+ app.onecmd_plus_hooks('say hello')
+ out, err = capsys.readouterr()
+ assert out == 'hello\n'
+ assert not err
+ assert not app.called_pph
+
+ app.reset_counters()
+ app.register_postparsing_hook(app.pph)
+ app.onecmd_plus_hooks('say hello')
+ out, err = capsys.readouterr()
+ assert out == 'hello\n'
+ assert not err
+ assert app.called_pph == 1
+
+ # register the function again, so it should be called
+ # twice
+ app.reset_counters()
+ app.register_postparsing_hook(app.pph)
+ app.onecmd_plus_hooks('say hello')
+ out, err = capsys.readouterr()
+ assert out == 'hello\n'
+ assert not err
+ assert app.called_pph == 2
+
+def test_postparsing_hook_stop_first(capsys):
+ app = PluggedApp()
+ app.register_postparsing_hook(app.pph_stop)
+ stop = app.onecmd_plus_hooks('say hello')
+ assert app.called_pph == 1
+ assert stop
+
+ # register another function but it shouldn't be called
+ app.reset_counters()
+ app.register_postparsing_hook(app.pph)
+ stop = app.onecmd_plus_hooks('say hello')
+ assert app.called_pph == 1
+ assert stop
+
+def test_postparsing_hook_stop_second(capsys):
+ app = PluggedApp()
+ app.register_postparsing_hook(app.pph)
+ stop = app.onecmd_plus_hooks('say hello')
+ assert app.called_pph == 1
+ assert not stop
+
+ # register another function and make sure it gets called
+ app.reset_counters()
+ app.register_postparsing_hook(app.pph_stop)
+ stop = app.onecmd_plus_hooks('say hello')
+ assert app.called_pph == 2
+ assert stop
+
+ # register a third function which shouldn't be called
+ app.reset_counters()
+ app.register_postparsing_hook(app.pph)
+ stop = app.onecmd_plus_hooks('say hello')
+ assert app.called_pph == 2
+ assert stop
+
+def test_postparsing_hook_emptystatement_first(capsys):
+ app = PluggedApp()
+ app.register_postparsing_hook(app.pph_emptystatement)
+ app.onecmd_plus_hooks('say hello')
+ out, err = capsys.readouterr()
+ assert not out
+ assert not err
+ assert app.called_pph == 1
+
+ # register another function but it shouldn't be called
+ app.reset_counters()
+ app.register_postparsing_hook(app.pph)
+ app.onecmd_plus_hooks('say hello')
+ out, err = capsys.readouterr()
+ assert not out
+ assert not err
+ assert app.called_pph == 1
+
+def test_postparsing_hook_emptystatement_second(capsys):
+ app = PluggedApp()
+ app.register_postparsing_hook(app.pph)
+ app.onecmd_plus_hooks('say hello')
+ out, err = capsys.readouterr()
+ assert out == 'hello\n'
+ assert not err
+ assert app.called_pph == 1
+
+ # register another function and make sure it gets called
+ app.reset_counters()
+ app.register_postparsing_hook(app.pph_emptystatement)
+ app.onecmd_plus_hooks('say hello')
+ out, err = capsys.readouterr()
+ assert not out
+ assert not err
+ assert app.called_pph == 2
+
+ # register a third function which shouldn't be called
+ app.reset_counters()
+ app.register_postparsing_hook(app.pph)
+ stop = app.onecmd_plus_hooks('say hello')
+ out, err = capsys.readouterr()
+ assert not out
+ assert not err
+ assert app.called_pph == 2
+ assert not stop
+
+def test_postparsing_hook_exception(capsys):
+ app = PluggedApp()
+ app.register_postparsing_hook(app.pph_exception)
+ app.onecmd_plus_hooks('say hello')
+ out, err = capsys.readouterr()
+ assert not out
+ assert err
+ assert app.called_pph == 1
+
+ # register another function, but it shouldn't be called
+ app.reset_counters()
+ app.register_postparsing_hook(app.pph)
+ app.onecmd_plus_hooks('say hello')
+ out, err = capsys.readouterr()
+ assert not out
+ assert err
+ assert app.called_pph == 1