File size: 2,834 Bytes
686fea4
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
"""We can provide the user with an option to select list of features and set their values"""

# pylint: disable=redefined-outer-name,missing-function-docstring,protected-access
import pytest

from app import FeatureInput


@pytest.fixture
def features() -> dict:
    return {
        "A": 1.0,
        "B": 2.0,
        "C": 3.0,
        "D": 4.0,
    }


@pytest.fixture(params=[[], ["A", "C"]])
def selected_features(request):
    return request.param


@pytest.fixture
def feature_input(features, selected_features):
    return FeatureInput(features=features, selected_features=selected_features)


def test_feature_input_constructor(feature_input, features, selected_features):
    assert feature_input.selected_features == selected_features
    assert feature_input.features == features

    assert feature_input.value == {key: features[key] for key in selected_features}

    assert [w.name for w in feature_input._selected_widgets] == selected_features
    for widget in feature_input._selected_widgets:
        assert widget.value == features[widget.name]


def test_can_change_features(feature_input):
    features = {"E": 5.0, "F": 6.0}
    feature_input.features = features

    assert feature_input.selected_features == []
    assert feature_input.value == {}

    assert list(feature_input._selected_widgets) == list(feature_input.selected_features)
    for feature in feature_input.selected_features:
        feature_widget = feature_input._selected_widgets[feature]
        assert feature_widget.name == feature
        assert feature_widget.value == features[feature]


def test_can_change_value(features):
    # Given
    widget = FeatureInput(features=features, selected_features=["A"])
    expected = widget.value.copy()

    # When update widget for feature A
    widget_a = widget._selected_widgets[0]
    widget_a.value = 5.0
    # Then
    expected["A"] = 5.0

    assert widget.value == expected


def test_can_change_selected_features(feature_input):
    # Given
    selected_features = feature_input.selected_features.copy()
    selected_features.append("D")

    # When update widget for feature A
    feature_input.selected_features = selected_features
    # Then
    assert [w.name for w in feature_input._selected_widgets] == selected_features
    assert feature_input.value == {w.name: w.value for w in feature_input._selected_widgets}


def test_reset_state(features):
    """When a feature is deselected and selected again its value should be the default value"""
    widget = FeatureInput(features=features, selected_features=["A"])
    widget._selected_widgets[0].value = features["A"] + 1
    widget.selected_features = []
    assert not widget.value
    widget.selected_features = ["A"]
    assert widget._selected_widgets[0].value == features["A"]
    assert widget.value == {"A": features["A"]}