|
"""We can provide the user with an option to select list of features and set their values""" |
|
|
|
|
|
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): |
|
|
|
widget = FeatureInput(features=features, selected_features=["A"]) |
|
expected = widget.value.copy() |
|
|
|
|
|
widget_a = widget._selected_widgets[0] |
|
widget_a.value = 5.0 |
|
|
|
expected["A"] = 5.0 |
|
|
|
assert widget.value == expected |
|
|
|
|
|
def test_can_change_selected_features(feature_input): |
|
|
|
selected_features = feature_input.selected_features.copy() |
|
selected_features.append("D") |
|
|
|
|
|
feature_input.selected_features = selected_features |
|
|
|
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"]} |
|
|