|
5 | 5 | import pytest |
6 | 6 | import yaml |
7 | 7 |
|
8 | | -from flagpole import Feature |
| 8 | +from flagpole import Feature, OwnerInfo |
9 | 9 | from flagpole.conditions import EqualsCondition, Segment |
10 | 10 | from flagpole.evaluation_context import EvaluationContext |
11 | 11 | from flagpole.flagpole_eval import evaluate_flag, get_arguments, read_feature |
@@ -163,6 +163,66 @@ def test_read_feature_missing_flag(self): |
163 | 163 | Path(temp_file).unlink() |
164 | 164 |
|
165 | 165 |
|
| 166 | +class TestOwnerInfo: |
| 167 | + """Test OwnerInfo dataclass and Feature with OwnerInfo owner.""" |
| 168 | + |
| 169 | + def test_feature_with_owner_info(self): |
| 170 | + """Test creating a Feature with OwnerInfo as owner.""" |
| 171 | + owner = OwnerInfo(team="test-team", email="owner@sentry.io") |
| 172 | + feature = Feature( |
| 173 | + name="test-feature", |
| 174 | + owner=owner, |
| 175 | + enabled=True, |
| 176 | + segments=[Segment(name="test-segment", rollout=100, conditions=[])], |
| 177 | + ) |
| 178 | + |
| 179 | + assert isinstance(feature.owner, OwnerInfo) |
| 180 | + assert feature.owner.team == "test-team" |
| 181 | + assert feature.owner.email == "owner@sentry.io" |
| 182 | + |
| 183 | + def test_feature_with_owner_info_no_email(self): |
| 184 | + """Test creating a Feature with OwnerInfo without email.""" |
| 185 | + owner = OwnerInfo(team="test-team") |
| 186 | + feature = Feature( |
| 187 | + name="test-feature", |
| 188 | + owner=owner, |
| 189 | + enabled=True, |
| 190 | + segments=[Segment(name="test-segment", rollout=100, conditions=[])], |
| 191 | + ) |
| 192 | + |
| 193 | + assert isinstance(feature.owner, OwnerInfo) |
| 194 | + assert feature.owner.team == "test-team" |
| 195 | + assert feature.owner.email is None |
| 196 | + |
| 197 | + def test_feature_from_dict_with_owner_object(self): |
| 198 | + """Test parsing a Feature from dict with owner as object.""" |
| 199 | + config_dict = { |
| 200 | + "enabled": True, |
| 201 | + "owner": {"team": "test-team", "email": "owner@sentry.io"}, |
| 202 | + "segments": [{"name": "test-segment", "rollout": 100, "conditions": []}], |
| 203 | + } |
| 204 | + |
| 205 | + feature = Feature.from_feature_dictionary("test-feature", config_dict) |
| 206 | + |
| 207 | + assert isinstance(feature.owner, OwnerInfo) |
| 208 | + assert feature.owner.team == "test-team" |
| 209 | + assert feature.owner.email == "owner@sentry.io" |
| 210 | + |
| 211 | + def test_feature_from_dict_with_owner_object_no_email(self): |
| 212 | + """Test parsing a Feature from dict with owner object without email.""" |
| 213 | + config_dict = { |
| 214 | + "enabled": True, |
| 215 | + "owner": {"team": "test-team"}, |
| 216 | + "segments": [{"name": "test-segment", "rollout": 100, "conditions": []}], |
| 217 | + } |
| 218 | + |
| 219 | + feature = Feature.from_feature_dictionary("test-feature", config_dict) |
| 220 | + |
| 221 | + assert isinstance(feature.owner, OwnerInfo) |
| 222 | + assert feature.owner.team == "test-team" |
| 223 | + assert feature.owner.email is None |
| 224 | + |
| 225 | + |
166 | 226 | class TestEvaluateFlag: |
167 | 227 | """Test evaluate_flag() function for different flag scenarios.""" |
168 | 228 |
|
|
0 commit comments