Passed
Pull Request — dev (#30)
by Konstantinos
03:23 queued 01:53
created

tabular_interfaces_contracts()   A

Complexity

Conditions 1

Size

Total Lines 17
Code Lines 15

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 15
nop 0
dl 0
loc 17
rs 9.65
c 0
b 0
f 0
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
    return {
9
        'retriever': PDTabularRetriever,
10
        'iterator': PDTabularIterator,
11
        'mutator': PDTabularMutator,
12
    }
13
14
@pytest.fixture
15
def tabular_operators_reverse():
16
    from so_magic.data.backend.panda_handling.df_backend import PDTabularRetriever, PDTabularIterator, PDTabularMutator
17
    return {
18
        PDTabularRetriever: 'retriever',
19
        PDTabularIterator: 'iterator',
20
        PDTabularMutator: 'mutator',
21
    }
22
23
24
@pytest.fixture
25
def tabular_interfaces_contracts():
26
    return {
27
        'retriever': {
28
            'column': '(identifier, data)',
29
            'row': '(identifier, data)',
30
            'nb_columns': '(data)',
31
            'nb_rows': '(data)',
32
            'get_numerical_attributes': '(data)',
33
        },
34
        'iterator': {
35
            'columnnames': '(data)',
36
            'itercolumns': '(data)',
37
            'iterrows': '(data)',
38
        },
39
        'mutator': {
40
            'add_column': '(datapoints, values, new_attribute, **kwargs)',
41
        },
42
    }
43
44
45
@pytest.fixture
46
def assert_correct_signatures(tabular_interfaces_contracts, tabular_operators_reverse):
47
    def _assert_correct_signatures(instance):
48
        interface_id = tabular_operators_reverse[type(instance)]
49
        expected_implemented_methods_names = tabular_interfaces_contracts[interface_id].keys()
50
        runtime_members = list(x[0] for x in inspect.getmembers(instance, predicate=lambda x: any([inspect.ismethod(x), inspect.isfunction(x)])))
51
        assert all(member in runtime_members and str(inspect.signature(getattr(instance, member))) == tabular_interfaces_contracts[interface_id][member] for member in expected_implemented_methods_names)
52
    return _assert_correct_signatures
53
54
55
@pytest.fixture
56
def assert_correct_delegate_behaviour(tabular_interfaces_contracts, tabular_operators_reverse):
57
    def _assert_correct_delegate_behaviour(instance1, instance2):
58
        instance1_type = type(instance1)
59
        assert instance1_type == type(instance2)
60
        assert id(instance1._delegate) != id(instance2._delegate) 
61
62
        for function in tabular_interfaces_contracts[tabular_operators_reverse[instance1_type]]:
63
            assert id(getattr(instance1, function)) != id(getattr(instance2, function))
64
            assert id(getattr(instance1._delegate, function)) != id(getattr(instance2._delegate, function))
65
    return _assert_correct_delegate_behaviour
66
67
68
@pytest.mark.parametrize('interface_id', [
69
    ('retriever'),
70
    ('iterator'),
71
    ('mutator'),
72
])
73
def test_tabular_interfaces2(interface_id, tabular_operators, assert_correct_signatures, assert_correct_delegate_behaviour):
74
    operator_instance1, operator_instance2 = tuple(tabular_operators[_interface_id]() for _interface_id in [interface_id] * 2)
75
76
    assert_correct_signatures(operator_instance1)
77
    assert_correct_delegate_behaviour(operator_instance1, operator_instance2)
78