Passed
Push — master ( 812b05...176334 )
by Konstantinos
02:19 queued 01:50
created

test_tabular_operators   A

Complexity

Total Complexity 6

Size/Duplication

Total Lines 74
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
eloc 56
dl 0
loc 74
rs 10
c 0
b 0
f 0
wmc 6

4 Functions

Rating   Name   Duplication   Size   Complexity  
A assert_correct_delegate_behaviour() 0 12 2
A assert_correct_signatures() 0 8 2
A tabular_operators() 0 32 1
A test_tabular_interfaces2() 0 10 1
1
import pytest
2
import inspect
3
4
5
@pytest.fixture
6
def tabular_operators():
7
    from so_magic.data.backend.panda_handling.df_backend import PDTabularRetriever, PDTabularIterator, PDTabularMutator
8
    operators = {
9
        'retriever': {
10
            'class': PDTabularRetriever,
11
            'interface': {
12
                'column': '(identifier, data)',
13
                'row': '(identifier, data)',
14
                'nb_columns': '(data)',
15
                'nb_rows': '(data)',
16
                'get_numerical_attributes': '(data)',
17
            }
18
        },
19
        'iterator': {
20
            'class': PDTabularIterator,
21
            'interface': {
22
                'columnnames': '(data)',
23
                'itercolumns': '(data)',
24
                'iterrows': '(data)',
25
            },
26
        },
27
        'mutator': {
28
            'class': PDTabularMutator,
29
            'interface': {
30
                'add_column': '(datapoints, values, new_attribute, **kwargs)',
31
            },
32
        },
33
    }
34
    return {
35
        'operators': operators,
36
        'reverse_dict': {operator_dict['class']: key for key, operator_dict in operators.items()},
37
    }
38
39
40
@pytest.fixture
41
def assert_correct_signatures(tabular_operators):
42
    def _assert_correct_signatures(instance):
43
        interface_id = tabular_operators['reverse_dict'][type(instance)]
44
        expected_implemented_methods_names = tabular_operators['operators'][interface_id]['interface'].keys()
45
        runtime_members = list(x[0] for x in inspect.getmembers(instance, predicate=lambda x: any([inspect.ismethod(x), inspect.isfunction(x)])))
46
        assert all(member in runtime_members and str(inspect.signature(getattr(instance, member))) == tabular_operators['operators'][interface_id]['interface'][member] for member in expected_implemented_methods_names)
47
    return _assert_correct_signatures
48
49
50
@pytest.fixture
51
def assert_correct_delegate_behaviour(tabular_operators):
52
    def _assert_correct_delegate_behaviour(instance1, instance2):
53
        instance1_type = type(instance1)
54
        instance1_operator_id = tabular_operators['reverse_dict'][instance1_type]
55
        assert instance1_type == type(instance2)
56
        assert id(instance1._delegate) != id(instance2._delegate)
57
        for function in tabular_operators['operators'][instance1_operator_id]['interface']:
58
        # for function in tabular_interfaces_contracts[tabular_operators_reverse[instance1_type]]:
59
            assert id(getattr(instance1, function)) != id(getattr(instance2, function))
60
            assert id(getattr(instance1._delegate, function)) != id(getattr(instance2._delegate, function))
61
    return _assert_correct_delegate_behaviour
62
63
64
@pytest.mark.parametrize('interface_id', [
65
    ('retriever'),
66
    ('iterator'),
67
    ('mutator'),
68
])
69
def test_tabular_interfaces2(interface_id, tabular_operators, assert_correct_signatures, assert_correct_delegate_behaviour):
70
    operator_instance1, operator_instance2 = tuple(tabular_operators['operators'][_interface_id]['class']() for _interface_id in [interface_id] * 2)
71
72
    assert_correct_signatures(operator_instance1)
73
    assert_correct_delegate_behaviour(operator_instance1, operator_instance2)
74