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