Passed
Push — mpeta ( 34d264...0f873c )
by Konstantinos
01:36
created

test_tabular_operators.member_names()   A

Complexity

Conditions 2

Size

Total Lines 5
Code Lines 5

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 2
eloc 5
nop 0
dl 0
loc 5
rs 10
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 member_names():
47
    def get_member_names(_object):
48
        return list(x[0] for x in inspect.getmembers(_object, predicate=lambda x: any([inspect.ismethod(x), inspect.isfunction(x)])))    
49
    return get_member_names
50
51
52
@pytest.fixture
53
def create_instances(tabular_operators):
54
    def _create_operators(*interface_ids):
55
        return tuple(tabular_operators[interface_id]() for interface_id in interface_ids)
56
    return _create_operators
57
58
59
@pytest.fixture
60
def assert_correct_signatures(tabular_interfaces_contracts, member_names, tabular_operators_reverse):
61
    def _assert_correct_signatures(instance):
62
        interface_id = tabular_operators_reverse[type(instance)]
63
        expected_implemented_methods_names = tabular_interfaces_contracts[interface_id].keys()
64
        runtime_members = member_names(instance)
65
        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)
66
    return _assert_correct_signatures
67
68
69
@pytest.fixture
70
def assert_correct_delegate_behaviour(tabular_interfaces_contracts, tabular_operators_reverse):
71
    def _assert_correct_delegate_behaviour(instance1, instance2):
72
        instance1_type = type(instance1)
73
        assert instance1_type == type(instance2)
74
        assert id(instance1._delegate) != id(instance2._delegate) 
75
76
        for function in tabular_interfaces_contracts[tabular_operators_reverse[instance1_type]]:
77
            assert id(getattr(instance1, function)) != id(getattr(instance2, function))
78
            assert id(getattr(instance1._delegate, function)) != id(getattr(instance2._delegate, function))
79
    return _assert_correct_delegate_behaviour
80
81
82
@pytest.mark.parametrize('interface_id', [
83
    ('retriever'),
84
    ('iterator'),
85
    ('mutator'),
86
])
87
def test_tabular_interfaces2(interface_id, create_instances, assert_correct_signatures, assert_correct_delegate_behaviour):
88
    operator_instance1, operator_instance2 = create_instances(*list([interface_id] * 2))
89
90
    assert_correct_signatures(operator_instance1)
91
    assert_correct_delegate_behaviour(operator_instance1, operator_instance2)
92