Changeset View
Changeset View
Standalone View
Standalone View
swh/core/tests/test_cli.py
# | # | ||||
import logging | import logging | ||||
import textwrap | import textwrap | ||||
import click | import click | ||||
from click.testing import CliRunner | from click.testing import CliRunner | ||||
import pytest | import pytest | ||||
from swh.core.cli import swh as swhmain | |||||
help_msg = '''Usage: swh [OPTIONS] COMMAND [ARGS]... | help_msg = '''Usage: swh [OPTIONS] COMMAND [ARGS]... | ||||
Command line interface for Software Heritage. | Command line interface for Software Heritage. | ||||
Options: | Options: | ||||
-l, --log-level [NOTSET|DEBUG|INFO|WARNING|ERROR|CRITICAL] | -l, --log-level [NOTSET|DEBUG|INFO|WARNING|ERROR|CRITICAL] | ||||
Log level (defaults to INFO). | Log level (defaults to INFO). | ||||
--log-config FILENAME Python yaml logging configuration file. | --log-config FILENAME Python yaml logging configuration file. | ||||
-h, --help Show this message and exit. | -h, --help Show this message and exit. | ||||
Notes: | Notes: | ||||
If both options are present, --log-level will override the root logger | If both options are present, --log-level will override the root logger | ||||
configuration set in --log-config. | configuration set in --log-config. | ||||
The --log-config YAML must conform to the logging.config.dictConfig schema | The --log-config YAML must conform to the logging.config.dictConfig schema | ||||
documented at https://docs.python.org/3/library/logging.config.html. | documented at https://docs.python.org/3/library/logging.config.html. | ||||
''' | ''' | ||||
def test_swh_help(): | def test_swh_help(swhmain): | ||||
runner = CliRunner() | runner = CliRunner() | ||||
result = runner.invoke(swhmain, ['-h']) | result = runner.invoke(swhmain, ['-h']) | ||||
assert result.exit_code == 0 | assert result.exit_code == 0 | ||||
assert result.output.startswith(help_msg) | assert result.output.startswith(help_msg) | ||||
result = runner.invoke(swhmain, ['--help']) | result = runner.invoke(swhmain, ['--help']) | ||||
assert result.exit_code == 0 | assert result.exit_code == 0 | ||||
assert result.output.startswith(help_msg) | assert result.output.startswith(help_msg) | ||||
def test_command(): | def test_command(swhmain): | ||||
@swhmain.command(name='test') | @swhmain.command(name='test') | ||||
@click.pass_context | @click.pass_context | ||||
def swhtest(ctx): | def swhtest(ctx): | ||||
click.echo('Hello SWH!') | click.echo('Hello SWH!') | ||||
runner = CliRunner() | runner = CliRunner() | ||||
result = runner.invoke(swhmain, ['test']) | result = runner.invoke(swhmain, ['test']) | ||||
assert result.exit_code == 0 | assert result.exit_code == 0 | ||||
assert result.output.strip() == 'Hello SWH!' | assert result.output.strip() == 'Hello SWH!' | ||||
def test_loglevel_default(caplog): | def test_loglevel_default(caplog, swhmain): | ||||
@swhmain.command(name='test') | @swhmain.command(name='test') | ||||
@click.pass_context | @click.pass_context | ||||
def swhtest(ctx): | def swhtest(ctx): | ||||
assert logging.root.level == 20 | assert logging.root.level == 20 | ||||
click.echo('Hello SWH!') | click.echo('Hello SWH!') | ||||
runner = CliRunner() | runner = CliRunner() | ||||
result = runner.invoke(swhmain, ['test']) | result = runner.invoke(swhmain, ['test']) | ||||
assert result.exit_code == 0 | assert result.exit_code == 0 | ||||
print(result.output) | print(result.output) | ||||
assert result.output.strip() == '''Hello SWH!''' | assert result.output.strip() == '''Hello SWH!''' | ||||
def test_loglevel_error(caplog): | def test_loglevel_error(caplog, swhmain): | ||||
@swhmain.command(name='test') | @swhmain.command(name='test') | ||||
@click.pass_context | @click.pass_context | ||||
def swhtest(ctx): | def swhtest(ctx): | ||||
assert logging.root.level == 40 | assert logging.root.level == 40 | ||||
click.echo('Hello SWH!') | click.echo('Hello SWH!') | ||||
runner = CliRunner() | runner = CliRunner() | ||||
result = runner.invoke(swhmain, ['-l', 'ERROR', 'test']) | result = runner.invoke(swhmain, ['-l', 'ERROR', 'test']) | ||||
assert result.exit_code == 0 | assert result.exit_code == 0 | ||||
assert result.output.strip() == '''Hello SWH!''' | assert result.output.strip() == '''Hello SWH!''' | ||||
def test_loglevel_debug(caplog): | def test_loglevel_debug(caplog, swhmain): | ||||
@swhmain.command(name='test') | @swhmain.command(name='test') | ||||
@click.pass_context | @click.pass_context | ||||
def swhtest(ctx): | def swhtest(ctx): | ||||
assert logging.root.level == 10 | assert logging.root.level == 10 | ||||
click.echo('Hello SWH!') | click.echo('Hello SWH!') | ||||
runner = CliRunner() | runner = CliRunner() | ||||
result = runner.invoke(swhmain, ['-l', 'DEBUG', 'test']) | result = runner.invoke(swhmain, ['-l', 'DEBUG', 'test']) | ||||
Show All 24 Lines | loggers: | ||||
level: INFO | level: INFO | ||||
''') | ''') | ||||
(tmp_path / 'log_config.yml').write_text(log_config) | (tmp_path / 'log_config.yml').write_text(log_config) | ||||
yield str(tmp_path / 'log_config.yml') | yield str(tmp_path / 'log_config.yml') | ||||
def test_log_config(caplog, log_config_path): | def test_log_config(caplog, log_config_path, swhmain): | ||||
@swhmain.command(name='test') | @swhmain.command(name='test') | ||||
@click.pass_context | @click.pass_context | ||||
def swhtest(ctx): | def swhtest(ctx): | ||||
logging.debug('Root log debug') | logging.debug('Root log debug') | ||||
logging.info('Root log info') | logging.info('Root log info') | ||||
logging.getLogger('dontshowdebug').debug('Not shown') | logging.getLogger('dontshowdebug').debug('Not shown') | ||||
logging.getLogger('dontshowdebug').info('Shown') | logging.getLogger('dontshowdebug').info('Shown') | ||||
runner = CliRunner() | runner = CliRunner() | ||||
result = runner.invoke( | result = runner.invoke( | ||||
swhmain, [ | swhmain, [ | ||||
'--log-config', log_config_path, | '--log-config', log_config_path, | ||||
'test', | 'test', | ||||
], | ], | ||||
) | ) | ||||
assert result.exit_code == 0 | assert result.exit_code == 0 | ||||
assert result.output.strip() == '\n'.join([ | assert result.output.strip() == '\n'.join([ | ||||
'custom format:root:DEBUG:Root log debug', | 'custom format:root:DEBUG:Root log debug', | ||||
'custom format:root:INFO:Root log info', | 'custom format:root:INFO:Root log info', | ||||
'custom format:dontshowdebug:INFO:Shown', | 'custom format:dontshowdebug:INFO:Shown', | ||||
]) | ]) | ||||
def test_log_config_log_level_interaction(caplog, log_config_path): | def test_log_config_log_level_interaction(caplog, log_config_path, swhmain): | ||||
@swhmain.command(name='test') | @swhmain.command(name='test') | ||||
@click.pass_context | @click.pass_context | ||||
def swhtest(ctx): | def swhtest(ctx): | ||||
logging.debug('Root log debug') | logging.debug('Root log debug') | ||||
logging.info('Root log info') | logging.info('Root log info') | ||||
logging.getLogger('dontshowdebug').debug('Not shown') | logging.getLogger('dontshowdebug').debug('Not shown') | ||||
logging.getLogger('dontshowdebug').info('Shown') | logging.getLogger('dontshowdebug').info('Shown') | ||||
runner = CliRunner() | runner = CliRunner() | ||||
result = runner.invoke( | result = runner.invoke( | ||||
swhmain, [ | swhmain, [ | ||||
'--log-config', log_config_path, | '--log-config', log_config_path, | ||||
'--log-level', 'INFO', | '--log-level', 'INFO', | ||||
'test', | 'test', | ||||
], | ], | ||||
) | ) | ||||
assert result.exit_code == 0 | assert result.exit_code == 0 | ||||
assert result.output.strip() == '\n'.join([ | assert result.output.strip() == '\n'.join([ | ||||
'custom format:root:INFO:Root log info', | 'custom format:root:INFO:Root log info', | ||||
'custom format:dontshowdebug:INFO:Shown', | 'custom format:dontshowdebug:INFO:Shown', | ||||
]) | ]) | ||||
def test_aliased_command(): | def test_aliased_command(swhmain): | ||||
@swhmain.command(name='canonical-test') | @swhmain.command(name='canonical-test') | ||||
@click.pass_context | @click.pass_context | ||||
def swhtest(ctx): | def swhtest(ctx): | ||||
'A test command.' | 'A test command.' | ||||
click.echo('Hello SWH!') | click.echo('Hello SWH!') | ||||
swhmain.add_alias(swhtest, 'othername') | swhmain.add_alias(swhtest, 'othername') | ||||
runner = CliRunner() | runner = CliRunner() | ||||
Show All 16 Lines |