|
16 | 16 | import pytest |
17 | 17 | import requests |
18 | 18 |
|
| 19 | +from f5.bigip.resource import BooleansToReduceHaveSameValue |
19 | 20 | from f5.bigip.resource import Collection |
20 | 21 | from f5.bigip.resource import DeviceProvidesIncompatibleKey |
21 | 22 | from f5.bigip.resource import ExclusiveAttributesPresent |
|
38 | 39 | from f5.sdk_exception import UnsupportedMethod |
39 | 40 |
|
40 | 41 |
|
| 42 | +@pytest.fixture |
| 43 | +def fake_vs(): |
| 44 | + r = Virtual(mock.MagicMock()) |
| 45 | + MRO = MockResponse({u"kind": u"tm:ltm:virtual:virtualstate", |
| 46 | + u"selfLink": u".../~Common~test_create"}) |
| 47 | + r._meta_data['bigip']._meta_data['icr_session'].post.return_value = MRO |
| 48 | + r._meta_data['required_json_kind'] = u"tm:ltm:virtual:virtualstate" |
| 49 | + r._meta_data['allowed_lazy_attributes'] = [] |
| 50 | + return r |
| 51 | + |
| 52 | + |
| 53 | +@pytest.fixture |
| 54 | +def fake_rsrc(): |
| 55 | + r = Resource(mock.MagicMock()) |
| 56 | + r._meta_data['allowed_lazy_attributes'] = [] |
| 57 | + r._meta_data['uri'] = 'URI' |
| 58 | + r._meta_data['read_only_attributes'] = [u"READONLY"] |
| 59 | + attrs = {'put.return_value': MockResponse({u"generation": 0}), |
| 60 | + 'get.return_value': MockResponse({u"generation": 0})} |
| 61 | + mock_session = mock.MagicMock(**attrs) |
| 62 | + r._meta_data['bigip']._meta_data = {'icr_session': mock_session} |
| 63 | + return r |
| 64 | + |
| 65 | + |
41 | 66 | class MockResponse(object): |
42 | 67 | def __init__(self, attr_dict): |
43 | 68 | self.__dict__ = attr_dict |
@@ -115,17 +140,51 @@ def test_KindTypeMismatch(self): |
115 | 140 | "be ''tm:ltm:virtual:virtualstate'' but creation returned "\ |
116 | 141 | "JSON with kind: u'tm:'" |
117 | 142 |
|
118 | | - def test_success(self): |
119 | | - r = Virtual(mock.MagicMock()) |
120 | | - MRO = MockResponse({u"kind": u"tm:ltm:virtual:virtualstate", |
121 | | - u"selfLink": u".../~Common~test_create"}) |
122 | | - r._meta_data['bigip']._meta_data['icr_session'].post.return_value = MRO |
123 | | - r._meta_data['required_json_kind'] = u"tm:ltm:virtual:virtualstate" |
124 | | - r._meta_data['allowed_lazy_attributes'] = [] |
125 | | - x = r.create(partition="Common", name="test_create") |
| 143 | + def test_success(self, fake_vs): |
| 144 | + x = fake_vs.create(partition="Common", name="test_create") |
126 | 145 | assert x.kind == u"tm:ltm:virtual:virtualstate" |
127 | 146 | assert x.selfLink == u".../~Common~test_create" |
128 | 147 |
|
| 148 | + def test_reduce_boolean_removes_enabled(self, fake_vs): |
| 149 | + assert fake_vs._meta_data['reduction_forcing_pairs'] == \ |
| 150 | + [ |
| 151 | + ('enabled', 'disabled'), |
| 152 | + ('online', 'offline'), |
| 153 | + ('vlansEnabled', 'vlansDisabled') |
| 154 | + ] |
| 155 | + fake_vs.create(partition="Common", name="test_create", enabled=False) |
| 156 | + pos, kwargs = fake_vs._meta_data['bigip']._meta_data['icr_session'].post.\ |
| 157 | + call_args |
| 158 | + assert kwargs['json']['disabled'] is True |
| 159 | + assert 'enabled' not in kwargs['json'] |
| 160 | + |
| 161 | + def test_reduce_boolean_removes_disabled(self, fake_vs): |
| 162 | + fake_vs.create(partition='Common', name='test_create', disabled=False) |
| 163 | + pos, kwargs = fake_vs._meta_data['bigip']._meta_data['icr_session'].post.\ |
| 164 | + call_args |
| 165 | + assert kwargs['json']['enabled'] is True |
| 166 | + assert 'disabled' not in kwargs['json'] |
| 167 | + |
| 168 | + def test_reduce_boolean_removes_nothing(self, fake_vs): |
| 169 | + fake_vs.create(partition='Common', name='test_create', enabled=True) |
| 170 | + pos, kwargs = fake_vs._meta_data['bigip']._meta_data['icr_session'].post.\ |
| 171 | + call_args |
| 172 | + assert kwargs['json']['enabled'] is True |
| 173 | + assert 'disabled' not in kwargs['json'] |
| 174 | + |
| 175 | + def test_reduce_boolean_same_value(self, fake_vs): |
| 176 | + with pytest.raises(BooleansToReduceHaveSameValue) as ex: |
| 177 | + fake_vs.create( |
| 178 | + partition='Common', |
| 179 | + name='test_create', |
| 180 | + enabled=True, |
| 181 | + disabled=True |
| 182 | + ) |
| 183 | + msg = 'Boolean pair, enabled and disabled, have same value: True. ' \ |
| 184 | + 'If both are given to this method, they cannot be the same, as ' \ |
| 185 | + 'this method cannot decide which one should be True.' |
| 186 | + assert msg == ex.value.message |
| 187 | + |
129 | 188 |
|
130 | 189 | def test__activate_URI(): |
131 | 190 | r = Resource(mock.MagicMock()) |
@@ -219,6 +278,40 @@ def test_read_only_removal(self): |
219 | 278 | _meta_data['icr_session'].put.call_args[1]['json'] |
220 | 279 | assert 'READONLY' not in submitted |
221 | 280 |
|
| 281 | + def test_reduce_boolean_removes_enabled(self, fake_rsrc): |
| 282 | + fake_rsrc.update(enabled=False) |
| 283 | + pos, kwargs = fake_rsrc._meta_data['bigip']._meta_data['icr_session'].put.\ |
| 284 | + call_args |
| 285 | + assert kwargs['json']['disabled'] is True |
| 286 | + assert 'enabled' not in kwargs['json'] |
| 287 | + |
| 288 | + def test_reduce_boolean_removes_disabled(self, fake_rsrc): |
| 289 | + fake_rsrc.update(disabled=False) |
| 290 | + pos, kwargs = fake_rsrc._meta_data['bigip']._meta_data['icr_session'].put.\ |
| 291 | + call_args |
| 292 | + assert kwargs['json']['enabled'] is True |
| 293 | + assert 'disabled' not in kwargs['json'] |
| 294 | + |
| 295 | + def test_reduce_boolean_removes_nothing(self, fake_rsrc): |
| 296 | + fake_rsrc.update(partition='Common', name='test_create', enabled=True) |
| 297 | + pos, kwargs = fake_rsrc._meta_data['bigip']._meta_data['icr_session'].put.\ |
| 298 | + call_args |
| 299 | + assert kwargs['json']['enabled'] is True |
| 300 | + assert 'disabled' not in kwargs['json'] |
| 301 | + |
| 302 | + def test_reduce_boolean_same_value(self, fake_rsrc): |
| 303 | + with pytest.raises(BooleansToReduceHaveSameValue) as ex: |
| 304 | + fake_rsrc.update( |
| 305 | + partition='Common', |
| 306 | + name='test_create', |
| 307 | + enabled=True, |
| 308 | + disabled=True |
| 309 | + ) |
| 310 | + msg = 'Boolean pair, enabled and disabled, have same value: True. ' \ |
| 311 | + 'If both are given to this method, they cannot be the same, as ' \ |
| 312 | + 'this method cannot decide which one should be True.' |
| 313 | + assert msg == ex.value.message |
| 314 | + |
222 | 315 |
|
223 | 316 | class TestResource_delete(object): |
224 | 317 | def test_success(self): |
|
0 commit comments