def test_action_defaults():
    parser = ConfigArgumentParser(description='test program')
    parser.add_argument('--foo', default='blah')
    args = []
    ns = parser.parse_args(args)
    assert ns.foo == 'blah'
    assert len(vars(ns)) == 1
def test_env_not_set():
    parser = ConfigArgumentParser(description='test program')
    parser.add_argument('--foo', env='ENV_FOO', default='cars')
    args = []
    ns = parser.parse_args(args)
    assert ns.foo == 'cars'
    assert len(vars(ns)) == 1
def test_coerce_env():
    os.environ['ENV_NUM'] = '10'
    parser = ConfigArgumentParser(description='test program')
    parser.add_argument('--num', env='ENV_NUM', default=0, type=int)
    args = []
    ns = parser.parse_args(args)
    assert ns.num == 10
    assert len(vars(ns)) == 1
def test_env_over_defaults():
    os.environ['ENV_FOO'] = 'bats'
    parser = ConfigArgumentParser(description='test program')
    parser.add_argument('--foo', env='ENV_FOO', default='cars', config='foo')
    args = []
    ns = parser.parse_args(args)
    assert ns.foo == 'bats'
    assert len(vars(ns)) == 1
def test_config_over_defaults(mockconfig):
    parser = ConfigArgumentParser(description='test program')
    parser.add_argument('--foo', env='ENV_FOO', default='cars', config='foo')
    parser._set_config(mockconfig)
    args = []
    ns = parser.parse_args(args)
    assert ns.foo == 'google'
    assert len(vars(ns)) == 1
def test_second_defaults_settings_wins():
    parser = ConfigArgumentParser(description='test program')
    parser.set_defaults(**{'foo': 'bar'})
    parser.add_argument('--foo', default='blah')
    args = []
    ns = parser.parse_args(args)
    assert ns.foo == 'blah'
    assert len(vars(ns)) == 1
def test_command_over_all(mockconfig):
    os.environ['ENV_FOO'] = 'bats'
    parser = ConfigArgumentParser(description='test program')
    parser.add_argument('--foo', env='ENV_FOO', default='cars', config='foo')
    parser._set_config(mockconfig)
    args = ['--foo', 'red']
    ns = parser.parse_args(args)
    assert ns.foo == 'red'
    assert len(vars(ns)) == 1
def test_coerce_config(mockconfig):
    parser = ConfigArgumentParser(description='test program')
    parser.add_argument('--num1', config='num1', default=0, type=int)
    parser.add_argument('--num2', config='num2', default=0, type=int)
    parser._set_config(mockconfig)
    args = []
    ns = parser.parse_args(args)
    # num1 did not coerce because it was not a string (matches argparse spec)
    assert ns.num1 == 10.0
    # num2 coerced because it was a string in the config
    assert ns.num2 == 20
    assert len(vars(ns)) == 2