| # 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 sqlalchemy import ( |
| Column, |
| Integer, |
| Text |
| ) |
| |
| from aria import ( |
| application_model_storage, |
| modeling |
| ) |
| from aria.storage import ( |
| ModelStorage, |
| exceptions, |
| sql_mapi, |
| ) |
| |
| from tests import ( |
| mock, |
| storage as tests_storage, |
| modeling as tests_modeling |
| ) |
| |
| |
| @pytest.fixture |
| def storage(): |
| base_storage = ModelStorage(sql_mapi.SQLAlchemyModelAPI, |
| initiator=tests_storage.init_inmemory_model_storage) |
| base_storage.register(tests_modeling.MockModel) |
| yield base_storage |
| tests_storage.release_sqlite_storage(base_storage) |
| |
| |
| @pytest.fixture(scope='module', autouse=True) |
| def module_cleanup(): |
| modeling.models.aria_declarative_base.metadata.remove(tests_modeling.MockModel.__table__) # pylint: disable=no-member |
| |
| |
| def test_storage_base(storage): |
| with pytest.raises(AttributeError): |
| storage.non_existent_attribute() |
| |
| |
| def test_model_storage(storage): |
| mock_model = tests_modeling.MockModel(value=0, name='model_name') |
| storage.mock_model.put(mock_model) |
| |
| assert storage.mock_model.get_by_name('model_name') == mock_model |
| |
| assert [mm_from_storage for mm_from_storage in storage.mock_model.iter()] == [mock_model] |
| assert [mm_from_storage for mm_from_storage in storage.mock_model] == [mock_model] |
| |
| storage.mock_model.delete(mock_model) |
| with pytest.raises(exceptions.StorageError): |
| storage.mock_model.get(mock_model.id) |
| |
| |
| def test_application_storage_factory(): |
| storage = application_model_storage(sql_mapi.SQLAlchemyModelAPI, |
| initiator=tests_storage.init_inmemory_model_storage) |
| |
| assert storage.service_template |
| assert storage.node_template |
| assert storage.group_template |
| assert storage.policy_template |
| assert storage.substitution_template |
| assert storage.substitution_template_mapping |
| assert storage.requirement_template |
| assert storage.relationship_template |
| assert storage.capability_template |
| assert storage.interface_template |
| assert storage.operation_template |
| assert storage.artifact_template |
| |
| assert storage.service |
| assert storage.node |
| assert storage.group |
| assert storage.policy |
| assert storage.substitution |
| assert storage.substitution_mapping |
| assert storage.relationship |
| assert storage.capability |
| assert storage.interface |
| assert storage.operation |
| assert storage.artifact |
| |
| assert storage.execution |
| assert storage.service_update |
| assert storage.service_update_step |
| assert storage.service_modification |
| assert storage.plugin |
| assert storage.task |
| |
| assert storage.input |
| assert storage.output |
| assert storage.property |
| assert storage.attribute |
| |
| assert storage.type |
| assert storage.metadata |
| |
| tests_storage.release_sqlite_storage(storage) |
| |
| |
| def test_cascade_deletion(context): |
| service = context.model.service.list()[0] |
| |
| assert len(context.model.service_template.list()) == 1 |
| assert len(service.nodes) == len(context.model.node.list()) == 2 |
| |
| context.model.service.delete(service) |
| |
| assert len(context.model.service_template.list()) == 1 |
| assert len(context.model.service.list()) == 0 |
| assert len(context.model.node.list()) == 0 |
| |
| |
| @pytest.fixture |
| def context(tmpdir): |
| result = mock.context.simple(str(tmpdir)) |
| yield result |
| tests_storage.release_sqlite_storage(result.model) |
| |
| |
| def test_mapi_include(context): |
| service1 = context.model.service.list()[0] |
| service1.name = 'service1' |
| service1.service_template.name = 'service_template1' |
| context.model.service.update(service1) |
| |
| service_template2 = mock.models.create_service_template('service_template2') |
| service2 = mock.models.create_service(service_template2, 'service2') |
| context.model.service.put(service2) |
| |
| assert service1 != service2 |
| assert service1.service_template != service2.service_template |
| |
| def assert_include(service): |
| st_name = context.model.service.get(service.id, include=('service_template_name',)) |
| st_name_list = context.model.service.list(filters={'id': service.id}, |
| include=('service_template_name', )) |
| assert len(st_name) == len(st_name_list) == 1 |
| assert st_name[0] == st_name_list[0][0] == service.service_template.name |
| |
| assert_include(service1) |
| assert_include(service2) |
| |
| |
| class MockModel(modeling.models.aria_declarative_base, modeling.mixins.ModelMixin): # pylint: disable=abstract-method |
| __tablename__ = 'op_mock_model' |
| |
| name = Column(Text) |
| value = Column(Integer) |
| |
| |
| class TestFilterOperands(object): |
| |
| @pytest.fixture() |
| def storage(self): |
| model_storage = application_model_storage( |
| sql_mapi.SQLAlchemyModelAPI, initiator=tests_storage.init_inmemory_model_storage) |
| model_storage.register(MockModel) |
| for value in (1, 2, 3, 4): |
| model_storage.op_mock_model.put(MockModel(value=value)) |
| yield model_storage |
| tests_storage.release_sqlite_storage(model_storage) |
| |
| def test_gt(self, storage): |
| assert len(storage.op_mock_model.list(filters=dict(value=dict(gt=3)))) == 1 |
| assert len(storage.op_mock_model.list(filters=dict(value=dict(gt=4)))) == 0 |
| |
| def test_ge(self, storage): |
| assert len(storage.op_mock_model.list(filters=dict(value=dict(ge=3)))) == 2 |
| assert len(storage.op_mock_model.list(filters=dict(value=dict(ge=5)))) == 0 |
| |
| def test_lt(self, storage): |
| assert len(storage.op_mock_model.list(filters=dict(value=dict(lt=2)))) == 1 |
| assert len(storage.op_mock_model.list(filters=dict(value=dict(lt=1)))) == 0 |
| |
| def test_le(self, storage): |
| assert len(storage.op_mock_model.list(filters=dict(value=dict(le=2)))) == 2 |
| assert len(storage.op_mock_model.list(filters=dict(value=dict(le=0)))) == 0 |
| |
| def test_eq(self, storage): |
| assert len(storage.op_mock_model.list(filters=dict(value=dict(eq=2)))) == 1 |
| assert len(storage.op_mock_model.list(filters=dict(value=dict(eq=0)))) == 0 |
| |
| def test_neq(self, storage): |
| assert len(storage.op_mock_model.list(filters=dict(value=dict(ne=2)))) == 3 |
| |
| def test_gt_and_lt(self, storage): |
| assert len(storage.op_mock_model.list(filters=dict(value=dict(gt=1, lt=3)))) == 1 |
| assert len(storage.op_mock_model.list(filters=dict(value=dict(gt=2, lt=2)))) == 0 |
| |
| def test_eq_and_ne(self, storage): |
| assert len(storage.op_mock_model.list(filters=dict(value=dict(eq=1, ne=3)))) == 1 |
| assert len(storage.op_mock_model.list(filters=dict(value=dict(eq=1, ne=1)))) == 0 |