|
2 | 2 |
|
3 | 3 | from typing import TYPE_CHECKING |
4 | 4 |
|
5 | | -from uipath.core.feature_flags import configure, get, is_enabled, reset |
| 5 | +from uipath.core.feature_flags import FeatureFlags |
6 | 6 | from uipath.core.feature_flags.feature_flags import _parse_env_value |
7 | 7 |
|
8 | 8 | if TYPE_CHECKING: |
@@ -55,106 +55,113 @@ def test_plain_string_not_json(self) -> None: |
55 | 55 | assert _parse_env_value("gpt-4") == "gpt-4" |
56 | 56 |
|
57 | 57 |
|
58 | | -class TestConfigure: |
59 | | - """Tests for configure / reset.""" |
| 58 | +class TestConfigureFlags: |
| 59 | + """Tests for configure_flags / reset_flags.""" |
60 | 60 |
|
61 | 61 | def setup_method(self) -> None: |
62 | | - reset() |
| 62 | + FeatureFlags.reset_flags() |
63 | 63 |
|
64 | 64 | def test_configure_sets_flags(self) -> None: |
65 | | - configure({"FeatureA": True, "FeatureB": "value"}) |
66 | | - assert get("FeatureA") is True |
67 | | - assert get("FeatureB") == "value" |
| 65 | + FeatureFlags.configure_flags({"FeatureA": True, "FeatureB": "value"}) |
| 66 | + assert FeatureFlags.get_flag("FeatureA") is True |
| 67 | + assert FeatureFlags.get_flag("FeatureB") == "value" |
68 | 68 |
|
69 | 69 | def test_configure_merges(self) -> None: |
70 | | - configure({"FeatureA": True}) |
71 | | - configure({"FeatureB": False}) |
72 | | - assert get("FeatureA") is True |
73 | | - assert get("FeatureB") is False |
| 70 | + FeatureFlags.configure_flags({"FeatureA": True}) |
| 71 | + FeatureFlags.configure_flags({"FeatureB": False}) |
| 72 | + assert FeatureFlags.get_flag("FeatureA") is True |
| 73 | + assert FeatureFlags.get_flag("FeatureB") is False |
74 | 74 |
|
75 | 75 | def test_configure_overwrites(self) -> None: |
76 | | - configure({"FeatureA": True}) |
77 | | - configure({"FeatureA": False}) |
78 | | - assert get("FeatureA") is False |
| 76 | + FeatureFlags.configure_flags({"FeatureA": True}) |
| 77 | + FeatureFlags.configure_flags({"FeatureA": False}) |
| 78 | + assert FeatureFlags.get_flag("FeatureA") is False |
79 | 79 |
|
80 | 80 | def test_reset_clears_all(self) -> None: |
81 | | - configure({"FeatureA": True}) |
82 | | - reset() |
83 | | - assert get("FeatureA") is None |
| 81 | + FeatureFlags.configure_flags({"FeatureA": True}) |
| 82 | + FeatureFlags.reset_flags() |
| 83 | + assert FeatureFlags.get_flag("FeatureA") is None |
84 | 84 |
|
85 | 85 |
|
86 | | -class TestGet: |
87 | | - """Tests for get.""" |
| 86 | +class TestGetFlag: |
| 87 | + """Tests for get_flag.""" |
88 | 88 |
|
89 | 89 | def setup_method(self) -> None: |
90 | | - reset() |
| 90 | + FeatureFlags.reset_flags() |
91 | 91 |
|
92 | 92 | def test_returns_default_when_unset(self) -> None: |
93 | | - assert get("Missing") is None |
| 93 | + assert FeatureFlags.get_flag("Missing") is None |
94 | 94 |
|
95 | 95 | def test_returns_custom_default(self) -> None: |
96 | | - assert get("Missing", default="fallback") == "fallback" |
| 96 | + assert FeatureFlags.get_flag("Missing", default="fallback") == "fallback" |
97 | 97 |
|
98 | 98 | def test_returns_configured_value(self) -> None: |
99 | | - configure({"FeatureA": "hello"}) |
100 | | - assert get("FeatureA") == "hello" |
| 99 | + FeatureFlags.configure_flags({"FeatureA": "hello"}) |
| 100 | + assert FeatureFlags.get_flag("FeatureA") == "hello" |
101 | 101 |
|
102 | | - def test_env_var_overrides_configured(self, monkeypatch: "MonkeyPatch") -> None: |
103 | | - configure({"FeatureA": True}) |
| 102 | + def test_configured_value_takes_precedence_over_env_var( |
| 103 | + self, monkeypatch: "MonkeyPatch" |
| 104 | + ) -> None: |
| 105 | + FeatureFlags.configure_flags({"FeatureA": True}) |
104 | 106 | monkeypatch.setenv("UIPATH_FEATURE_FeatureA", "false") |
105 | | - assert get("FeatureA") is False |
| 107 | + assert FeatureFlags.get_flag("FeatureA") is True |
106 | 108 |
|
107 | | - def test_env_var_overrides_default(self, monkeypatch: "MonkeyPatch") -> None: |
| 109 | + def test_env_var_used_when_nothing_configured( |
| 110 | + self, monkeypatch: "MonkeyPatch" |
| 111 | + ) -> None: |
108 | 112 | monkeypatch.setenv("UIPATH_FEATURE_X", "custom") |
109 | | - assert get("X", default="other") == "custom" |
| 113 | + assert FeatureFlags.get_flag("X", default="other") == "custom" |
110 | 114 |
|
111 | 115 | def test_env_var_string_value(self, monkeypatch: "MonkeyPatch") -> None: |
112 | 116 | monkeypatch.setenv("UIPATH_FEATURE_Model", "gpt-4-turbo") |
113 | | - assert get("Model") == "gpt-4-turbo" |
| 117 | + assert FeatureFlags.get_flag("Model") == "gpt-4-turbo" |
114 | 118 |
|
115 | 119 | def test_env_var_json_dict(self, monkeypatch: "MonkeyPatch") -> None: |
116 | 120 | monkeypatch.setenv("UIPATH_FEATURE_Models", '{"gpt-4": true, "claude": false}') |
117 | | - assert get("Models") == {"gpt-4": True, "claude": False} |
| 121 | + assert FeatureFlags.get_flag("Models") == {"gpt-4": True, "claude": False} |
118 | 122 |
|
119 | 123 | def test_env_var_json_list(self, monkeypatch: "MonkeyPatch") -> None: |
120 | 124 | monkeypatch.setenv("UIPATH_FEATURE_AllowedModels", '["gpt-4", "claude"]') |
121 | | - assert get("AllowedModels") == ["gpt-4", "claude"] |
| 125 | + assert FeatureFlags.get_flag("AllowedModels") == ["gpt-4", "claude"] |
122 | 126 |
|
123 | 127 |
|
124 | | -class TestIsEnabled: |
125 | | - """Tests for is_enabled.""" |
| 128 | +class TestIsFlagEnabled: |
| 129 | + """Tests for is_flag_enabled.""" |
126 | 130 |
|
127 | 131 | def setup_method(self) -> None: |
128 | | - reset() |
| 132 | + FeatureFlags.reset_flags() |
129 | 133 |
|
130 | 134 | def test_enabled_flag(self) -> None: |
131 | | - configure({"FeatureA": True}) |
132 | | - assert is_enabled("FeatureA") is True |
| 135 | + FeatureFlags.configure_flags({"FeatureA": True}) |
| 136 | + assert FeatureFlags.is_flag_enabled("FeatureA") is True |
133 | 137 |
|
134 | 138 | def test_disabled_flag(self) -> None: |
135 | | - configure({"FeatureA": False}) |
136 | | - assert is_enabled("FeatureA") is False |
| 139 | + FeatureFlags.configure_flags({"FeatureA": False}) |
| 140 | + assert FeatureFlags.is_flag_enabled("FeatureA") is False |
137 | 141 |
|
138 | 142 | def test_missing_flag_defaults_false(self) -> None: |
139 | | - assert is_enabled("Missing") is False |
| 143 | + assert FeatureFlags.is_flag_enabled("Missing") is False |
140 | 144 |
|
141 | 145 | def test_missing_flag_custom_default(self) -> None: |
142 | | - assert is_enabled("Missing", default=True) is True |
| 146 | + assert FeatureFlags.is_flag_enabled("Missing", default=True) is True |
143 | 147 |
|
144 | 148 | def test_truthy_string_is_enabled(self) -> None: |
145 | | - configure({"FeatureA": "some-value"}) |
146 | | - assert is_enabled("FeatureA") is True |
| 149 | + FeatureFlags.configure_flags({"FeatureA": "some-value"}) |
| 150 | + assert FeatureFlags.is_flag_enabled("FeatureA") is True |
147 | 151 |
|
148 | 152 | def test_none_is_disabled(self) -> None: |
149 | | - configure({"FeatureA": None}) |
150 | | - assert is_enabled("FeatureA") is False |
| 153 | + FeatureFlags.configure_flags({"FeatureA": None}) |
| 154 | + assert FeatureFlags.is_flag_enabled("FeatureA") is False |
151 | 155 |
|
152 | | - def test_env_override_disables(self, monkeypatch: "MonkeyPatch") -> None: |
153 | | - configure({"FeatureA": True}) |
| 156 | + def test_configured_value_takes_precedence_over_env_var( |
| 157 | + self, monkeypatch: "MonkeyPatch" |
| 158 | + ) -> None: |
| 159 | + FeatureFlags.configure_flags({"FeatureA": True}) |
154 | 160 | monkeypatch.setenv("UIPATH_FEATURE_FeatureA", "false") |
155 | | - assert is_enabled("FeatureA") is False |
| 161 | + assert FeatureFlags.is_flag_enabled("FeatureA") is True |
156 | 162 |
|
157 | | - def test_env_override_enables(self, monkeypatch: "MonkeyPatch") -> None: |
158 | | - configure({"FeatureA": False}) |
| 163 | + def test_env_var_used_when_nothing_configured( |
| 164 | + self, monkeypatch: "MonkeyPatch" |
| 165 | + ) -> None: |
159 | 166 | monkeypatch.setenv("UIPATH_FEATURE_FeatureA", "true") |
160 | | - assert is_enabled("FeatureA") is True |
| 167 | + assert FeatureFlags.is_flag_enabled("FeatureA") is True |
0 commit comments