From 7802ee678cb3d040a81d21972b278debcce00a58 Mon Sep 17 00:00:00 2001 From: Yannick DAYER <yannick.dayer@idiap.ch> Date: Tue, 8 Nov 2022 12:48:15 +0100 Subject: [PATCH] Add a click command result handler for tests. --- bob/io/base/test/test_utlilities.py | 38 +++++++++++++++++++++++++++ bob/io/base/test_utils.py | 40 +++++++++++++++++++++++++++++ 2 files changed, 78 insertions(+) create mode 100644 bob/io/base/test/test_utlilities.py diff --git a/bob/io/base/test/test_utlilities.py b/bob/io/base/test/test_utlilities.py new file mode 100644 index 0000000..d5f3da1 --- /dev/null +++ b/bob/io/base/test/test_utlilities.py @@ -0,0 +1,38 @@ +import sys + +import click + +from click.testing import CliRunner + +from bob.io.base import test_utils + + +@click.command("dummy") +def dummy_command_0(): + sys.exit(0) + + +@click.command("dummy_exit_1") +def dummy_command_1(): + sys.exit(1) + + +@click.command("dummy_exit_raise") +def dummy_command_raise(): + raise RuntimeError("Expected exception") + + +def test_assert_dummy(): + result = CliRunner().invoke(dummy_command_0) + assert result.exit_code == 0 + test_utils.assert_click_runner_result(result) + + result = CliRunner().invoke(dummy_command_1) + assert result.exit_code == 1 + test_utils.assert_click_runner_result(result, exit_code=1) + + result = CliRunner().invoke(dummy_command_raise) + assert result.exit_code == 1 + test_utils.assert_click_runner_result( + result, exit_code=1, exception_type=RuntimeError + ) diff --git a/bob/io/base/test_utils.py b/bob/io/base/test_utils.py index 6156c4b..193b323 100644 --- a/bob/io/base/test_utils.py +++ b/bob/io/base/test_utils.py @@ -10,8 +10,13 @@ import functools import os +import traceback import unittest +from typing import Optional + +import click.testing + def datafile(f, module=None, path="data"): """datafile(f, [module], [data]) -> filename @@ -117,3 +122,38 @@ def extension_available(extension): return wrapper return test_wrapper + + +def assert_click_runner_result( + result: click.testing.Result, + exit_code: int = 0, + exception_type: Optional[Exception] = None, +): + """Helper for asserting click runner results. + + Parameters + ---------- + result + The return value on ``click.testing.CLIRunner.invoke()``. + exit_code + The expected command exit code (defaults to 0). + exception_type + If given, will ensure that the raised exception is of that type. + """ + + m = ( + "Click command exited with code '{}', instead of '{}'.\n" + "Exception:\n{}\n" + "Output:\n{}" + ) + exception = ( + "None" + if result.exc_info is None + else "".join(traceback.format_exception(*result.exc_info)) + ) + m = m.format(result.exit_code, exit_code, exception, result.output) + assert result.exit_code == exit_code, m + if exit_code == 0: + assert not result.exception, m + if exception_type is not None: + assert isinstance(result.exception, exception_type), m -- GitLab