Files
openfe/openfecli/tests/test_cli.py
2023-05-10 12:13:57 -04:00

99 lines
2.9 KiB
Python

import pytest
import click.testing
import contextlib
import logging
from openfecli.cli import OpenFECLI, main
from openfecli.plugins import OFECommandPlugin
@click.command(
'null-command',
short_help="Do nothing (testing)"
)
def null_command():
logger = logging.getLogger("null_command_logger")
logger.info("Running null command")
PLUGIN = OFECommandPlugin(
command=null_command,
section="Analysis",
requires_ofe=(0, 3),
)
@contextlib.contextmanager
def null_command_context(cli):
PLUGIN.attach_metadata(location=__file__,
plugin_type="file")
try:
cli._register_plugin(PLUGIN)
yield cli
finally:
cli._deregister_plugin(PLUGIN)
@pytest.fixture
def cli():
return OpenFECLI()
class TestCLI:
def test_invoke(self):
runner = click.testing.CliRunner()
with runner.isolated_filesystem():
# isolated_filesystem is overkill here, but good practice for
# testing with CliRunner
result = runner.invoke(main, ["-h"])
assert result.exit_code == 0
assert "Usage: openfe" in result.output
def test_command_sections(self, cli):
# This test does not ensure the order of the sections, and does not
# prevent other sections from being added later. It only ensures
# that the main 4 sections continue to exist.
included = ["Network Planning", "Quickrun Executor",
"Miscellaneous"]
for sec in included:
assert sec in cli.COMMAND_SECTIONS
def test_get_installed_plugins(self, cli):
# Test that we correctly load some plugins. This test only ensures
# that some plugins are loaded; it currently does nothing to ensure
# the identity of the specific plugins.
plugins = cli.get_installed_plugins()
for plugin in plugins:
assert isinstance(plugin, OFECommandPlugin)
assert len(plugins) > 0
@pytest.mark.parametrize('with_log', [True, False])
def test_main_log(with_log):
logged_text = "Running null command\n"
logfile_text = "\n".join([
"[loggers]", "keys=root", "",
"[handlers]", "keys=std", "",
"[formatters]", "keys=default", "",
"[formatter_default]", "format=%(message)s", "",
"[handler_std]", "class=StreamHandler", "level=NOTSET",
"formatter=default", "args=(sys.stdout,)", ""
"[logger_root]", "level=DEBUG", "handlers=std"
])
runner = click.testing.CliRunner()
invocation = ['null_command']
if with_log:
invocation = ['--log', 'logging.conf'] + invocation
expected = logged_text if with_log else ""
with runner.isolated_filesystem():
with open("logging.conf", mode='w') as log_conf:
log_conf.write(logfile_text)
with null_command_context(main):
result = runner.invoke(main, invocation)
found = result.stdout_bytes
assert found.decode('utf-8') == expected