| # 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. |
| |
| import pytest |
| |
| from aria.modeling import models |
| from aria.storage import collection_instrumentation |
| |
| |
| class MockActor(object): |
| def __init__(self): |
| self.dict_ = {} |
| self.list_ = [] |
| |
| |
| class MockMAPI(object): |
| |
| def __init__(self): |
| pass |
| |
| def put(self, *args, **kwargs): |
| pass |
| |
| def update(self, *args, **kwargs): |
| pass |
| |
| |
| class CollectionInstrumentation(object): |
| |
| @pytest.fixture |
| def actor(self): |
| return MockActor() |
| |
| @pytest.fixture |
| def model(self): |
| return MockMAPI() |
| |
| @pytest.fixture |
| def dict_(self, actor, model): |
| return collection_instrumentation._InstrumentedDict(model, actor, 'dict_', models.Attribute) |
| |
| @pytest.fixture |
| def list_(self, actor, model): |
| return collection_instrumentation._InstrumentedList(model, actor, 'list_', models.Attribute) |
| |
| |
| class TestDict(CollectionInstrumentation): |
| |
| def test_keys(self, actor, dict_): |
| dict_.update( |
| { |
| 'key1': models.Attribute.wrap('key1', 'value1'), |
| 'key2': models.Attribute.wrap('key2', 'value2') |
| } |
| ) |
| assert sorted(dict_.keys()) == sorted(['key1', 'key2']) == sorted(actor.dict_.keys()) |
| |
| def test_values(self, actor, dict_): |
| dict_.update({ |
| 'key1': models.Attribute.wrap('key1', 'value1'), |
| 'key2': models.Attribute.wrap('key1', 'value2') |
| }) |
| assert (sorted(dict_.values()) == |
| sorted(['value1', 'value2']) == |
| sorted(v.value for v in actor.dict_.values())) |
| |
| def test_items(self, dict_): |
| dict_.update({ |
| 'key1': models.Attribute.wrap('key1', 'value1'), |
| 'key2': models.Attribute.wrap('key1', 'value2') |
| }) |
| assert sorted(dict_.items()) == sorted([('key1', 'value1'), ('key2', 'value2')]) |
| |
| def test_iter(self, actor, dict_): |
| dict_.update({ |
| 'key1': models.Attribute.wrap('key1', 'value1'), |
| 'key2': models.Attribute.wrap('key1', 'value2') |
| }) |
| assert sorted(list(dict_)) == sorted(['key1', 'key2']) == sorted(actor.dict_.keys()) |
| |
| def test_bool(self, dict_): |
| assert not dict_ |
| dict_.update({ |
| 'key1': models.Attribute.wrap('key1', 'value1'), |
| 'key2': models.Attribute.wrap('key1', 'value2') |
| }) |
| assert dict_ |
| |
| def test_set_item(self, actor, dict_): |
| dict_['key1'] = models.Attribute.wrap('key1', 'value1') |
| assert dict_['key1'] == 'value1' == actor.dict_['key1'].value |
| assert isinstance(actor.dict_['key1'], models.Attribute) |
| |
| def test_nested(self, actor, dict_): |
| dict_['key'] = {} |
| assert isinstance(actor.dict_['key'], models.Attribute) |
| assert dict_['key'] == actor.dict_['key'].value == {} |
| |
| dict_['key']['inner_key'] = 'value' |
| |
| assert len(dict_) == 1 |
| assert 'inner_key' in dict_['key'] |
| assert dict_['key']['inner_key'] == 'value' |
| assert dict_['key'].keys() == ['inner_key'] |
| assert dict_['key'].values() == ['value'] |
| assert dict_['key'].items() == [('inner_key', 'value')] |
| assert isinstance(actor.dict_['key'], models.Attribute) |
| assert isinstance(dict_['key'], collection_instrumentation._InstrumentedDict) |
| |
| dict_['key'].update({'updated_key': 'updated_value'}) |
| assert len(dict_) == 1 |
| assert 'updated_key' in dict_['key'] |
| assert dict_['key']['updated_key'] == 'updated_value' |
| assert sorted(dict_['key'].keys()) == sorted(['inner_key', 'updated_key']) |
| assert sorted(dict_['key'].values()) == sorted(['value', 'updated_value']) |
| assert sorted(dict_['key'].items()) == sorted([('inner_key', 'value'), |
| ('updated_key', 'updated_value')]) |
| assert isinstance(actor.dict_['key'], models.Attribute) |
| assert isinstance(dict_['key'], collection_instrumentation._InstrumentedDict) |
| |
| dict_.update({'key': 'override_value'}) |
| assert len(dict_) == 1 |
| assert 'key' in dict_ |
| assert dict_['key'] == 'override_value' |
| assert len(actor.dict_) == 1 |
| assert isinstance(actor.dict_['key'], models.Attribute) |
| assert actor.dict_['key'].value == 'override_value' |
| |
| def test_get_item(self, actor, dict_): |
| dict_['key1'] = models.Attribute.wrap('key1', 'value1') |
| assert isinstance(actor.dict_['key1'], models.Attribute) |
| |
| def test_update(self, actor, dict_): |
| dict_['key1'] = 'value1' |
| |
| new_dict = {'key2': 'value2'} |
| dict_.update(new_dict) |
| assert len(dict_) == 2 |
| assert dict_['key2'] == 'value2' |
| assert isinstance(actor.dict_['key2'], models.Attribute) |
| |
| new_dict = {} |
| new_dict.update(dict_) |
| assert new_dict['key1'] == dict_['key1'] |
| |
| def test_copy(self, dict_): |
| dict_['key1'] = 'value1' |
| |
| new_dict = dict_.copy() |
| assert new_dict is not dict_ |
| assert new_dict == dict_ |
| |
| dict_['key1'] = 'value2' |
| assert new_dict['key1'] == 'value1' |
| assert dict_['key1'] == 'value2' |
| |
| def test_clear(self, dict_): |
| dict_['key1'] = 'value1' |
| dict_.clear() |
| |
| assert len(dict_) == 0 |
| |
| |
| class TestList(CollectionInstrumentation): |
| |
| def test_append(self, actor, list_): |
| list_.append(models.Attribute.wrap('name', 'value1')) |
| list_.append('value2') |
| assert len(actor.list_) == 2 |
| assert len(list_) == 2 |
| assert isinstance(actor.list_[0], models.Attribute) |
| assert list_[0] == 'value1' |
| |
| assert isinstance(actor.list_[1], models.Attribute) |
| assert list_[1] == 'value2' |
| |
| list_[0] = 'new_value1' |
| list_[1] = 'new_value2' |
| assert isinstance(actor.list_[1], models.Attribute) |
| assert isinstance(actor.list_[1], models.Attribute) |
| assert list_[0] == 'new_value1' |
| assert list_[1] == 'new_value2' |
| |
| def test_iter(self, list_): |
| list_.append('value1') |
| list_.append('value2') |
| assert sorted(list_) == sorted(['value1', 'value2']) |
| |
| def test_insert(self, actor, list_): |
| list_.append('value1') |
| list_.insert(0, 'value2') |
| list_.insert(2, 'value3') |
| list_.insert(10, 'value4') |
| assert sorted(list_) == sorted(['value1', 'value2', 'value3', 'value4']) |
| assert len(actor.list_) == 4 |
| |
| def test_set(self, list_): |
| list_.append('value1') |
| list_.append('value2') |
| |
| list_[1] = 'value3' |
| assert len(list_) == 2 |
| assert sorted(list_) == sorted(['value1', 'value3']) |
| |
| def test_insert_into_nested(self, actor, list_): |
| list_.append([]) |
| |
| list_[0].append('inner_item') |
| assert isinstance(actor.list_[0], models.Attribute) |
| assert len(list_) == 1 |
| assert list_[0][0] == 'inner_item' |
| |
| list_[0].append('new_item') |
| assert isinstance(actor.list_[0], models.Attribute) |
| assert len(list_) == 1 |
| assert list_[0][1] == 'new_item' |
| |
| assert list_[0] == ['inner_item', 'new_item'] |
| assert ['inner_item', 'new_item'] == list_[0] |
| |
| |
| class TestDictList(CollectionInstrumentation): |
| def test_dict_in_list(self, actor, list_): |
| list_.append({}) |
| assert len(list_) == 1 |
| assert isinstance(actor.list_[0], models.Attribute) |
| assert actor.list_[0].value == {} |
| |
| list_[0]['key'] = 'value' |
| assert list_[0]['key'] == 'value' |
| assert len(actor.list_) == 1 |
| assert isinstance(actor.list_[0], models.Attribute) |
| assert actor.list_[0].value['key'] == 'value' |
| |
| def test_list_in_dict(self, actor, dict_): |
| dict_['key'] = [] |
| assert len(dict_) == 1 |
| assert isinstance(actor.dict_['key'], models.Attribute) |
| assert actor.dict_['key'].value == [] |
| |
| dict_['key'].append('value') |
| assert dict_['key'][0] == 'value' |
| assert len(actor.dict_) == 1 |
| assert isinstance(actor.dict_['key'], models.Attribute) |
| assert actor.dict_['key'].value[0] == 'value' |