From e82f17c83e7aa1fd7d3b810420e2fc3b3747044e Mon Sep 17 00:00:00 2001 From: Beto Dealmeida Date: Wed, 8 Dec 2021 06:50:02 -0800 Subject: [PATCH 1/2] chore: convert feature flag tests to unit tests --- tests/integration_tests/feature_flag_tests.py | 83 ------------------- tests/unit_tests/feature_flag_test.py | 71 ++++++++++++++++ 2 files changed, 71 insertions(+), 83 deletions(-) delete mode 100644 tests/integration_tests/feature_flag_tests.py create mode 100644 tests/unit_tests/feature_flag_test.py diff --git a/tests/integration_tests/feature_flag_tests.py b/tests/integration_tests/feature_flag_tests.py deleted file mode 100644 index a5818bd8c187c..0000000000000 --- a/tests/integration_tests/feature_flag_tests.py +++ /dev/null @@ -1,83 +0,0 @@ -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. -from unittest.mock import patch - -from parameterized import parameterized - -from superset import get_feature_flags, is_feature_enabled -from tests.integration_tests.base_tests import SupersetTestCase - - -def dummy_is_feature_enabled(feature_flag_name: str, default: bool = True) -> bool: - return True if feature_flag_name.startswith("True_") else default - - -class TestFeatureFlag(SupersetTestCase): - @patch.dict( - "superset.extensions.feature_flag_manager._feature_flags", - {"FOO": True}, - clear=True, - ) - def test_existing_feature_flags(self): - self.assertTrue(is_feature_enabled("FOO")) - - @patch.dict( - "superset.extensions.feature_flag_manager._feature_flags", {}, clear=True - ) - def test_nonexistent_feature_flags(self): - self.assertFalse(is_feature_enabled("FOO")) - - def test_feature_flags(self): - self.assertEqual(is_feature_enabled("foo"), "bar") - self.assertEqual(is_feature_enabled("super"), "set") - - -@patch.dict( - "superset.extensions.feature_flag_manager._feature_flags", - {"True_Flag1": False, "True_Flag2": True, "Flag3": False, "Flag4": True}, - clear=True, -) -class TestFeatureFlagBackend(SupersetTestCase): - @parameterized.expand( - [ - ("True_Flag1", True), - ("True_Flag2", True), - ("Flag3", False), - ("Flag4", True), - ("True_DoesNotExist", False), - ] - ) - @patch( - "superset.extensions.feature_flag_manager._is_feature_enabled_func", - dummy_is_feature_enabled, - ) - def test_feature_flags_override(self, feature_flag_name, expected): - self.assertEqual(is_feature_enabled(feature_flag_name), expected) - - @patch( - "superset.extensions.feature_flag_manager._is_feature_enabled_func", - dummy_is_feature_enabled, - ) - @patch( - "superset.extensions.feature_flag_manager._get_feature_flags_func", None, - ) - def test_get_feature_flags(self): - feature_flags = get_feature_flags() - self.assertEqual( - feature_flags, - {"True_Flag1": True, "True_Flag2": True, "Flag3": False, "Flag4": True}, - ) diff --git a/tests/unit_tests/feature_flag_test.py b/tests/unit_tests/feature_flag_test.py new file mode 100644 index 0000000000000..14366cfd8ece1 --- /dev/null +++ b/tests/unit_tests/feature_flag_test.py @@ -0,0 +1,71 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +from pytest_mock import MockFixture + +from superset import get_feature_flags, is_feature_enabled + + +def dummy_is_feature_enabled(feature_flag_name: str, default: bool = True) -> bool: + return True if feature_flag_name.startswith("True_") else default + + +def test_existing_feature_flags(mocker: MockFixture) -> None: + """ + Test that ``is_feature_enabled`` reads flags correctly. + """ + mocker.patch.dict( + "superset.extensions.feature_flag_manager._feature_flags", + {"FOO": True}, + clear=True, + ) + assert is_feature_enabled("FOO") is True + + +def test_nonexistent_feature_flags(mocker: MockFixture) -> None: + """ + Test that ``is_feature_enabled`` returns ``False`` when flag not set. + """ + mocker.patch.dict( + "superset.extensions.feature_flag_manager._feature_flags", {}, clear=True + ) + assert is_feature_enabled("FOO") is False + + +def test_is_feature_enabled(mocker: MockFixture) -> None: + """ + Test ``_is_feature_enabled_func``. + """ + mocker.patch.dict( + "superset.extensions.feature_flag_manager._feature_flags", + {"True_Flag1": False, "True_Flag2": True, "Flag3": False, "Flag4": True}, + clear=True, + ) + mocker.patch( + "superset.extensions.feature_flag_manager._is_feature_enabled_func", + dummy_is_feature_enabled, + ) + + assert is_feature_enabled("True_Flag1") is True + assert is_feature_enabled("True_Flag2") is True + assert is_feature_enabled("Flag3") is False + assert is_feature_enabled("Flag4") is True + assert get_feature_flags() == { + "True_Flag1": True, + "True_Flag2": True, + "Flag3": False, + "Flag4": True, + } From eb83ade8374aa98fed96d97d1b39036da379424a Mon Sep 17 00:00:00 2001 From: Beto Dealmeida Date: Wed, 8 Dec 2021 11:34:57 -0800 Subject: [PATCH 2/2] Fix test --- tests/unit_tests/feature_flag_test.py | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/tests/unit_tests/feature_flag_test.py b/tests/unit_tests/feature_flag_test.py index 14366cfd8ece1..43d142e7f67d3 100644 --- a/tests/unit_tests/feature_flag_test.py +++ b/tests/unit_tests/feature_flag_test.py @@ -16,7 +16,7 @@ # under the License. from pytest_mock import MockFixture -from superset import get_feature_flags, is_feature_enabled +from superset import is_feature_enabled def dummy_is_feature_enabled(feature_flag_name: str, default: bool = True) -> bool: @@ -63,9 +63,3 @@ def test_is_feature_enabled(mocker: MockFixture) -> None: assert is_feature_enabled("True_Flag2") is True assert is_feature_enabled("Flag3") is False assert is_feature_enabled("Flag4") is True - assert get_feature_flags() == { - "True_Flag1": True, - "True_Flag2": True, - "Flag3": False, - "Flag4": True, - }