diff options
author | kotfu <kotfu@kotfu.net> | 2018-05-26 16:23:15 -0600 |
---|---|---|
committer | kotfu <kotfu@kotfu.net> | 2018-05-26 16:23:15 -0600 |
commit | 4d7d98c0c856cb5ce1ac1dbe214a542f4a83a813 (patch) | |
tree | 0c7ae5f309d6a7141118d75beaa4c69efc1c1fde /tests/test_plugin.py | |
parent | c390a6bc1aed393b7c7d4e493d61636b34bcdc9a (diff) | |
download | cmd2-git-4d7d98c0c856cb5ce1ac1dbe214a542f4a83a813.tar.gz |
Document and test postparsing hooks
Diffstat (limited to 'tests/test_plugin.py')
-rw-r--r-- | tests/test_plugin.py | 179 |
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 |