Files
openfe/openfecli/tests/test_cli.py
Alyssa Travitz 036869ae81 Ci/add ruff format part4 - the final format! (#1623)
* format cli tests top level

* format cli commands tests

* format cli parameters tests
2025-10-24 23:50:52 +00:00

112 lines
3.1 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