| 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 |  |  |  |