exception_message()   A
last analyzed

Complexity

Conditions 1

Size

Total Lines 16
Code Lines 13

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 13
nop 1
dl 0
loc 16
rs 9.75
c 0
b 0
f 0
1
import pytest
2
3
4
@pytest.fixture
5
def test_transformers():
6
    from so_magic.utils import Transformer
7
    def func1(a, b=2):
8
        return a * b + 1
9
    def func2(a, b, *, c=1):
10
        return a * b + c
11
    def func3(a, b, **kwargs):
12
        return a * b + kwargs.get('c', 1)
13
    return {
14
        'lambda': {
15
            'transformer': Transformer(lambda x: x + 1),
16
            'expected_nb_positional_args': 1,
17
            'kwarg_allowed': lambda key_to_check: False,
18
        },
19
        'func1': {
20
            'transformer': Transformer(func1),
21
            'expected_nb_positional_args': 1,
22
            'kwarg_allowed': lambda key_to_check: key_to_check in set(['b']),
23
        },
24
        'func2': {
25
            'transformer': Transformer(func2),
26
            'expected_nb_positional_args': 2,
27
            'kwarg_allowed': lambda key_to_check: key_to_check in set(['c']),
28
        },
29
        'func3': {
30
            'transformer': Transformer(func3),
31
            'expected_nb_positional_args': 2,
32
            'kwarg_allowed': lambda key_to_check: True,
33
        },
34
    }
35
36
37
@pytest.mark.parametrize('transformer, args_list, kwargs_dict, expected_result', [
38
    ('lambda', [1], {}, 2),
39
    ('lambda', [0], {}, 1),
40
    ('func1', [10], {}, 21),
41
    ('func1', [10], {'b': 3}, 31),
42
    # ('func2', [10, 2], {}, 21),  # this should work commented out
43
    # ('func2', [10, 2], {'c': 3}, 23),  # this should work commented out
44
    # ('func3', [10, 2], {}, 21),  # this should work commented out!
45
    # ('func3', [10, 2], {'a': 100}, 21),  # this should work commented out!
46
    # ('func3', [10, 2], {'c': 1}, 21),  # this should work commented out!
47
    # ('func3', [10, 2], {'c': 3}, 23),  # this should work commented out!
48
])
49
def test_transform_method(transformer, args_list, kwargs_dict, expected_result, test_transformers):
50
    assert expected_result == test_transformers[transformer]['transformer'].transform(*args_list, **kwargs_dict)
51
52
53
@pytest.fixture(params=[
54
    ['instance', ValueError, lambda x: f"Expected a callable as argument; instead got '{type(x)}'"],
55
    ['function', ValueError, lambda x: f"Expected a callable that receives at least one positional argument; instead got a callable that receives '{x.__code__.co_argcount}' arguments."],
56
])
57
def false_arguments(request):
58
    a = object()
59
    def f(): pass
60
    callables = {'instance': a, 'function': f}
61
    first_argument = callables[request.param[0]]
62
    return {'args': [first_argument],
63
            'exception': request.param[1],
64
            'exception_text': request.param[2](first_argument),
65
            }
66
67
68
def test_false_arguments(false_arguments):
69
    from so_magic.utils import Transformer
70
    with pytest.raises(false_arguments['exception'], match=false_arguments['exception_text']):
71
        _ = Transformer(*false_arguments['args'])
72
73
74
@pytest.fixture
75
def exception_message(test_transformers):
76
    def more_args_error(args_list, kwargs_dict, data):
77
        return rf"transform\(\) takes {data['expected_nb_positional_args'] + 1} positional arguments but {len(args_list) + 1} were given"
78
    
79
    def more_kwargs_error(args_list, kwargs_dict, data):
80
        unexpected_keywords = set([k for k in kwargs_dict.keys() if not data['kwarg_allowed'](k)])
81
        return rf"func1\(\) got an unexpected keyword argument '[{''.join(unexpected_keywords)}]'"
82
    
83
    e = {
84
        'more_args_error': more_args_error,
85
        'more_kwargs_error': more_kwargs_error,
86
    }
87
    def get_exception_message(transformer_id, args_list, kwargs_dict, error_type: str):   
88
        return e[error_type](args_list, kwargs_dict, test_transformers[transformer_id])
89
    return get_exception_message
90
91
92
@pytest.mark.parametrize('transformer_id, args_list, kwargs_dict, error_type', [
93
    ('lambda', [0, 2], {}, 'more_args_error'),
94
    ('func1', [2], {'b': 2, 'f': 8}, 'more_kwargs_error'),
95
    ('func1', [10, 20], {'b': 2}, 'more_args_error'),
96
    ('func1', [10, 3], {}, 'more_args_error'),
97
])
98
def test_wrong_transform_arguments(transformer_id, args_list, kwargs_dict, error_type, test_transformers, exception_message):
99
    transformer = test_transformers[transformer_id]['transformer']
100
    with pytest.raises(TypeError, match=exception_message(transformer_id, args_list, kwargs_dict, error_type)):
101
        _ = transformer.transform(*args_list, **kwargs_dict)
102