| """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"]} |
|
|