bigchaindb/tests/commands/test_utils.py

133 lines
4.4 KiB
Python

# Copyright BigchainDB GmbH and BigchainDB contributors
# SPDX-License-Identifier: (Apache-2.0 AND CC-BY-4.0)
# Code is Apache-2.0 and docs are CC-BY-4.0
import argparse
from argparse import Namespace
import logging
import pytest
from unittest.mock import patch
@pytest.fixture
def reset_bigchaindb_config(monkeypatch):
import bigchaindb
monkeypatch.setattr('bigchaindb.config', bigchaindb._config)
def test_input_on_stderr():
from bigchaindb.commands.utils import input_on_stderr, _convert
with patch('builtins.input', return_value='I love cats'):
assert input_on_stderr() == 'I love cats'
# input_on_stderr uses `_convert` internally, from now on we will
# just use that function
assert _convert('hack the planet') == 'hack the planet'
assert _convert('42') == '42'
assert _convert('42', default=10) == 42
assert _convert('', default=10) == 10
assert _convert('42', convert=int) == 42
assert _convert('True', convert=bool) is True
assert _convert('False', convert=bool) is False
assert _convert('t', convert=bool) is True
assert _convert('3.14', default=1.0) == 3.14
assert _convert('TrUe', default=False) is True
with pytest.raises(ValueError):
assert _convert('TRVE', default=False)
with pytest.raises(ValueError):
assert _convert('ಠ_ಠ', convert=int)
@pytest.mark.usefixtures('ignore_local_config_file', 'reset_bigchaindb_config')
def test_configure_bigchaindb_configures_bigchaindb():
from bigchaindb.commands.utils import configure_bigchaindb
from bigchaindb.config_utils import is_configured
assert not is_configured()
@configure_bigchaindb
def test_configure(args):
assert is_configured()
args = Namespace(config=None)
test_configure(args)
@pytest.mark.usefixtures('ignore_local_config_file',
'reset_bigchaindb_config',
'reset_logging_config')
@pytest.mark.parametrize('log_level', tuple(map(
logging.getLevelName,
(logging.DEBUG,
logging.INFO,
logging.WARNING,
logging.ERROR,
logging.CRITICAL)
)))
def test_configure_bigchaindb_logging(log_level):
# TODO: See following comment:
# This is a dirty test. If a test *preceding* this test makes use of the logger, and then another test *after* this
# test also makes use of the logger, somehow we get logger.disabled == True, and the later test fails. We need to
# either engineer this somehow to leave the test env in the same state as it finds it, or make an assessment
# whether or not we even need this test, and potentially just remove it.
from bigchaindb.commands.utils import configure_bigchaindb
@configure_bigchaindb
def test_configure_logger(args):
pass
args = Namespace(config=None, log_level=log_level)
test_configure_logger(args)
from bigchaindb import config
assert config['log']['level_console'] == log_level
assert config['log']['level_logfile'] == log_level
def test_start_raises_if_command_not_implemented():
from bigchaindb.commands import utils
from bigchaindb.commands.bigchaindb import create_parser
parser = create_parser()
with pytest.raises(NotImplementedError):
# Will raise because `scope`, the third parameter,
# doesn't contain the function `run_start`
utils.start(parser, ['start'], {})
def test_start_raises_if_no_arguments_given():
from bigchaindb.commands import utils
from bigchaindb.commands.bigchaindb import create_parser
parser = create_parser()
with pytest.raises(SystemExit):
utils.start(parser, [], {})
@patch('multiprocessing.cpu_count', return_value=42)
def test_start_sets_multiprocess_var_based_on_cli_args(mock_cpu_count):
from bigchaindb.commands import utils
def run_mp_arg_test(args):
return args
parser = argparse.ArgumentParser()
subparser = parser.add_subparsers(title='Commands',
dest='command')
mp_arg_test_parser = subparser.add_parser('mp_arg_test')
mp_arg_test_parser.add_argument('-m', '--multiprocess',
nargs='?',
type=int,
default=False)
scope = {'run_mp_arg_test': run_mp_arg_test}
assert utils.start(parser, ['mp_arg_test'], scope).multiprocess == 1
assert utils.start(parser, ['mp_arg_test', '--multiprocess'], scope).multiprocess == 42