http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/2b3276bb/tests/orchestrator/workflows/executor/test_executor.py ---------------------------------------------------------------------- diff --git a/tests/orchestrator/workflows/executor/test_executor.py b/tests/orchestrator/workflows/executor/test_executor.py index d983fe9..580bf8b 100644 --- a/tests/orchestrator/workflows/executor/test_executor.py +++ b/tests/orchestrator/workflows/executor/test_executor.py @@ -28,7 +28,7 @@ except ImportError: _celery = None app = None -from aria.storage import model +from aria.storage.modeling import model from aria.orchestrator import events from aria.orchestrator.workflows.executor import ( thread, @@ -43,7 +43,7 @@ def test_execute(executor): expected_value = 'value' successful_task = MockTask(mock_successful_task) failing_task = MockTask(mock_failing_task) - task_with_inputs = MockTask(mock_task_with_input, inputs={'input': expected_value}) + task_with_inputs = MockTask(mock_task_with_input, inputs=dict(input='value')) for task in [successful_task, failing_task, task_with_inputs]: executor.execute(task) @@ -105,8 +105,9 @@ class MockTask(object): self.exception = None self.id = str(uuid.uuid4()) name = func.__name__ - operation = 'tests.orchestrator.workflows.executor.test_executor.{name}'.format(name=name) - self.operation_mapping = operation + implementation = 'tests.orchestrator.workflows.executor.test_executor.{name}'.format( + name=name) + self.implementation = implementation self.logger = logging.getLogger() self.name = name self.inputs = inputs or {}
http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/2b3276bb/tests/orchestrator/workflows/executor/test_process_executor.py ---------------------------------------------------------------------- diff --git a/tests/orchestrator/workflows/executor/test_process_executor.py b/tests/orchestrator/workflows/executor/test_process_executor.py index ff5dce6..e904eb3 100644 --- a/tests/orchestrator/workflows/executor/test_process_executor.py +++ b/tests/orchestrator/workflows/executor/test_process_executor.py @@ -42,7 +42,7 @@ class TestProcessExecutor(object): def test_plugin_execution(self, executor, mock_plugin): task = MockTask(plugin=mock_plugin, - operation='mock_plugin1.operation') + implementation='mock_plugin1.operation') queue = Queue.Queue() @@ -131,11 +131,11 @@ class MockTask(object): INFINITE_RETRIES = aria_model.Task.INFINITE_RETRIES - def __init__(self, plugin, operation): + def __init__(self, plugin, implementation): self.id = str(uuid.uuid4()) - self.operation_mapping = operation + self.implementation = implementation self.logger = logging.getLogger() - self.name = operation + self.name = implementation self.inputs = {} self.context = MockContext() self.retry_count = 0 http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/2b3276bb/tests/orchestrator/workflows/executor/test_process_executor_extension.py ---------------------------------------------------------------------- diff --git a/tests/orchestrator/workflows/executor/test_process_executor_extension.py b/tests/orchestrator/workflows/executor/test_process_executor_extension.py index 18957f1..cf9c071 100644 --- a/tests/orchestrator/workflows/executor/test_process_executor_extension.py +++ b/tests/orchestrator/workflows/executor/test_process_executor_extension.py @@ -30,14 +30,17 @@ def test_decorate_extension(context, executor): inputs = {'input1': 1, 'input2': 2} def get_node_instance(ctx): - return ctx.model.node_instance.get_by_name(mock.models.DEPENDENCY_NODE_INSTANCE_NAME) + return ctx.model.node.get_by_name(mock.models.DEPENDENCY_NODE_INSTANCE_NAME) @workflow def mock_workflow(ctx, graph): node_instance = get_node_instance(ctx) op = 'test.op' - op_dict = {'operation': '{0}.{1}'.format(__name__, _mock_operation.__name__)} - node_instance.node.operations['test.op'] = op_dict + node_instance.interfaces = [mock.models.get_interface( + op, + operation_kwargs=dict(implementation='{0}.{1}'.format(__name__, + _mock_operation.__name__)) + )] task = api.task.OperationTask.node_instance(instance=node_instance, name=op, inputs=inputs) graph.add_tasks(task) return graph @@ -55,7 +58,7 @@ class MockProcessExecutorExtension(object): def decorate(self): def decorator(function): def wrapper(ctx, **operation_inputs): - ctx.node_instance.runtime_properties['out'] = {'wrapper_inputs': operation_inputs} + ctx.node.runtime_properties['out'] = {'wrapper_inputs': operation_inputs} function(ctx=ctx, **operation_inputs) return wrapper return decorator @@ -63,7 +66,7 @@ class MockProcessExecutorExtension(object): @operation def _mock_operation(ctx, **operation_inputs): - ctx.node_instance.runtime_properties['out']['function_inputs'] = operation_inputs + ctx.node.runtime_properties['out']['function_inputs'] = operation_inputs @pytest.fixture http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/2b3276bb/tests/orchestrator/workflows/executor/test_process_executor_tracked_changes.py ---------------------------------------------------------------------- diff --git a/tests/orchestrator/workflows/executor/test_process_executor_tracked_changes.py b/tests/orchestrator/workflows/executor/test_process_executor_tracked_changes.py index e383859..4198e3b 100644 --- a/tests/orchestrator/workflows/executor/test_process_executor_tracked_changes.py +++ b/tests/orchestrator/workflows/executor/test_process_executor_tracked_changes.py @@ -45,13 +45,13 @@ def test_track_changes_of_failed_operation(context, executor): def _assert_tracked_changes_are_applied(context): - instance = context.model.node_instance.get_by_name(mock.models.DEPENDENCY_NODE_INSTANCE_NAME) + instance = context.model.node.get_by_name(mock.models.DEPENDENCY_NODE_INSTANCE_NAME) assert instance.runtime_properties == _TEST_RUNTIME_PROPERTIES def _update_runtime_properties(context): - context.node_instance.runtime_properties.clear() - context.node_instance.runtime_properties.update(_TEST_RUNTIME_PROPERTIES) + context.node.runtime_properties.clear() + context.node.runtime_properties.update(_TEST_RUNTIME_PROPERTIES) def test_refresh_state_of_tracked_attributes(context, executor): @@ -66,7 +66,7 @@ def test_apply_tracked_changes_during_an_operation(context, executor): 'changed_but_refreshed': {'some': 'newer', 'properties': 'right there'} } - expected_initial = context.model.node_instance.get_by_name( + expected_initial = context.model.node.get_by_name( mock.models.DEPENDENCY_NODE_INSTANCE_NAME).runtime_properties out = _run_workflow(context=context, executor=executor, op_func=_mock_updating_operation, @@ -87,17 +87,18 @@ def test_apply_tracked_changes_during_an_operation(context, executor): def _run_workflow(context, executor, op_func, inputs=None): @workflow def mock_workflow(ctx, graph): - node_instance = ctx.model.node_instance.get_by_name( - mock.models.DEPENDENCY_NODE_INSTANCE_NAME) - node_instance.node.operations['test.op'] = {'operation': _operation_mapping(op_func)} - task = api.task.OperationTask.node_instance(instance=node_instance, name='test.op', + node = ctx.model.node.get_by_name(mock.models.DEPENDENCY_NODE_INSTANCE_NAME) + node.interfaces = [mock.models.get_interface( + 'test.op', operation_kwargs=dict(implementation=_operation_mapping(op_func)))] + task = api.task.OperationTask.node_instance(instance=node, + name='test.op', inputs=inputs or {}) graph.add_tasks(task) return graph graph = mock_workflow(ctx=context) # pylint: disable=no-value-for-parameter eng = engine.Engine(executor=executor, workflow_context=context, tasks_graph=graph) eng.execute() - return context.model.node_instance.get_by_name( + return context.model.node.get_by_name( mock.models.DEPENDENCY_NODE_INSTANCE_NAME).runtime_properties.get('out') @@ -114,25 +115,25 @@ def _mock_fail_operation(ctx): @operation def _mock_refreshing_operation(ctx): - out = {'initial': copy.deepcopy(ctx.node_instance.runtime_properties)} - ctx.node_instance.runtime_properties.update({'some': 'new', 'properties': 'right here'}) - out['after_change'] = copy.deepcopy(ctx.node_instance.runtime_properties) - ctx.model.node_instance.refresh(ctx.node_instance) - out['after_refresh'] = copy.deepcopy(ctx.node_instance.runtime_properties) - ctx.node_instance.runtime_properties['out'] = out + out = {'initial': copy.deepcopy(ctx.node.runtime_properties)} + ctx.node.runtime_properties.update({'some': 'new', 'properties': 'right here'}) + out['after_change'] = copy.deepcopy(ctx.node.runtime_properties) + ctx.model.node.refresh(ctx.node) + out['after_refresh'] = copy.deepcopy(ctx.node.runtime_properties) + ctx.node.runtime_properties['out'] = out @operation def _mock_updating_operation(ctx, committed, changed_but_refreshed): - out = {'initial': copy.deepcopy(ctx.node_instance.runtime_properties)} - ctx.node_instance.runtime_properties.update(committed) - ctx.model.node_instance.update(ctx.node_instance) - out['after_update'] = copy.deepcopy(ctx.node_instance.runtime_properties) - ctx.node_instance.runtime_properties.update(changed_but_refreshed) - out['after_change'] = copy.deepcopy(ctx.node_instance.runtime_properties) - ctx.model.node_instance.refresh(ctx.node_instance) - out['after_refresh'] = copy.deepcopy(ctx.node_instance.runtime_properties) - ctx.node_instance.runtime_properties['out'] = out + out = {'initial': copy.deepcopy(ctx.node.runtime_properties)} + ctx.node.runtime_properties.update(committed) + ctx.model.node.update(ctx.node) + out['after_update'] = copy.deepcopy(ctx.node.runtime_properties) + ctx.node.runtime_properties.update(changed_but_refreshed) + out['after_change'] = copy.deepcopy(ctx.node.runtime_properties) + ctx.model.node.refresh(ctx.node) + out['after_refresh'] = copy.deepcopy(ctx.node.runtime_properties) + ctx.node.runtime_properties['out'] = out def _operation_mapping(func): http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/2b3276bb/tests/resources/scripts/test_ssh.sh ---------------------------------------------------------------------- diff --git a/tests/resources/scripts/test_ssh.sh b/tests/resources/scripts/test_ssh.sh index 6f18278..90202c7 100644 --- a/tests/resources/scripts/test_ssh.sh +++ b/tests/resources/scripts/test_ssh.sh @@ -4,7 +4,7 @@ set -u set -e test_run_script_basic() { - ctx node-instance runtime-properties test_value $test_value + ctx node runtime-properties test_value $test_value } test_run_script_as_sudo() { @@ -12,7 +12,7 @@ test_run_script_as_sudo() { } test_run_script_default_base_dir() { - ctx node-instance runtime-properties work_dir $PWD + ctx node runtime-properties work_dir $PWD } test_run_script_with_hide() { @@ -20,44 +20,44 @@ test_run_script_with_hide() { } test_run_script_process_config() { - ctx node-instance runtime-properties env_value $test_value_env - ctx node-instance runtime-properties bash_version $BASH_VERSION - ctx node-instance runtime-properties arg1_value $1 - ctx node-instance runtime-properties arg2_value $2 - ctx node-instance runtime-properties cwd $PWD - ctx node-instance runtime-properties ctx_path $(which ctx) + ctx node runtime-properties env_value $test_value_env + ctx node runtime-properties bash_version $BASH_VERSION + ctx node runtime-properties arg1_value $1 + ctx node runtime-properties arg2_value $2 + ctx node runtime-properties cwd $PWD + ctx node runtime-properties ctx_path $(which ctx) } test_run_script_command_prefix() { - ctx node-instance runtime-properties dollar_dash $- + ctx node runtime-properties dollar_dash $- } test_run_script_reuse_existing_ctx_1() { - ctx node-instance runtime-properties test_value1 $test_value1 + ctx node runtime-properties test_value1 $test_value1 } test_run_script_reuse_existing_ctx_2() { - ctx node-instance runtime-properties test_value2 $test_value2 + ctx node runtime-properties test_value2 $test_value2 } test_run_script_download_resource_plain() { local destination=$(mktemp) ctx download-resource ${destination} test_resource - ctx node-instance runtime-properties test_value "$(cat ${destination})" + ctx node runtime-properties test_value "$(cat ${destination})" } test_run_script_download_resource_and_render() { local destination=$(mktemp) ctx download-resource-and-render ${destination} test_resource - ctx node-instance runtime-properties test_value "$(cat ${destination})" + ctx node runtime-properties test_value "$(cat ${destination})" } test_run_script_inputs_as_env_variables_no_override() { - ctx node-instance runtime-properties test_value "$custom_env_var" + ctx node runtime-properties test_value "$custom_env_var" } test_run_script_inputs_as_env_variables_process_env_override() { - ctx node-instance runtime-properties test_value "$custom_env_var" + ctx node runtime-properties test_value "$custom_env_var" } test_run_script_error_in_script() { http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/2b3276bb/tests/storage/__init__.py ---------------------------------------------------------------------- diff --git a/tests/storage/__init__.py b/tests/storage/__init__.py index b798e01..0000387 100644 --- a/tests/storage/__init__.py +++ b/tests/storage/__init__.py @@ -14,8 +14,8 @@ # limitations under the License. import os import platform -from tempfile import mkdtemp from shutil import rmtree +from tempfile import mkdtemp from sqlalchemy import ( create_engine, @@ -29,13 +29,14 @@ from sqlalchemy import ( from aria.storage import ( model, - structure, type as aria_type, + structure, + modeling ) -class MockModel(model.DeclarativeBase, structure.ModelMixin): #pylint: disable=abstract-method - __tablename__ = 'mock_models' +class MockModel(model.DB, structure.ModelMixin): #pylint: disable=abstract-method + __tablename__ = 'mock_model' model_dict = Column(aria_type.Dict) model_list = Column(aria_type.List) value = Column(Integer) @@ -51,6 +52,35 @@ class TestFileSystem(object): rmtree(self.path, ignore_errors=True) +def get_sqlite_api_kwargs(base_dir=None, filename='db.sqlite'): + """ + Create sql params. works in in-memory and in filesystem mode. + If base_dir is passed, the mode will be filesystem mode. while the default mode is in-memory. + :param str base_dir: The base dir for the filesystem memory file. + :param str filename: the file name - defaults to 'db.sqlite'. + :return: + """ + if base_dir is not None: + uri = 'sqlite:///{platform_char}{path}'.format( + # Handles the windows behavior where there is not root, but drivers. + # Thus behaving as relative path. + platform_char='' if 'Windows' in platform.system() else '/', + + path=os.path.join(base_dir, filename)) + engine_kwargs = {} + else: + uri = 'sqlite:///:memory:' + engine_kwargs = dict(connect_args={'check_same_thread': False}, + poolclass=pool.StaticPool) + + engine = create_engine(uri, **engine_kwargs) + session_factory = orm.sessionmaker(bind=engine) + session = orm.scoped_session(session_factory=session_factory) if base_dir else session_factory() + + modeling.declarative_base.metadata.create_all(bind=engine) + return dict(engine=engine, session=session) + + def release_sqlite_storage(storage): """ Drops the tables and clears the session @@ -64,7 +94,7 @@ def release_sqlite_storage(storage): session.rollback() session.close() for engine in set(mapi._engine for mapi in mapis): - model.DeclarativeBase.metadata.drop_all(engine) + modeling.declarative_base.metadata.drop_all(engine) def init_inmemory_model_storage(): http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/2b3276bb/tests/storage/test_instrumentation.py ---------------------------------------------------------------------- diff --git a/tests/storage/test_instrumentation.py b/tests/storage/test_instrumentation.py index 771342c..1420785 100644 --- a/tests/storage/test_instrumentation.py +++ b/tests/storage/test_instrumentation.py @@ -17,17 +17,16 @@ import pytest from sqlalchemy import Column, Text, Integer, event from aria.storage import ( - model, structure, - type as aria_type, ModelStorage, sql_mapi, instrumentation, - exceptions + exceptions, + type as aria_type, + model ) from ..storage import release_sqlite_storage, init_inmemory_model_storage - STUB = instrumentation._STUB Value = instrumentation._Value instruments_holder = [] @@ -346,15 +345,15 @@ class _MockModel(structure.ModelMixin): string2 = Column(Text) -class MockModel1(model.DeclarativeBase, _MockModel): - __tablename__ = 'mock_model1' +class MockModel1(_MockModel, model.DB): + __tablename__ = 'mock_model_1' -class MockModel2(model.DeclarativeBase, _MockModel): - __tablename__ = 'mock_model2' +class MockModel2(_MockModel, model.DB): + __tablename__ = 'mock_model_2' -class StrictMockModel(model.DeclarativeBase): +class StrictMockModel(structure.ModelMixin, model.DB): __tablename__ = 'strict_mock_model' strict_dict = Column(aria_type.StrictDict(basestring, basestring)) http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/2b3276bb/tests/storage/test_model_storage.py ---------------------------------------------------------------------- diff --git a/tests/storage/test_model_storage.py b/tests/storage/test_model_storage.py index 34cc5df..7019da7 100644 --- a/tests/storage/test_model_storage.py +++ b/tests/storage/test_model_storage.py @@ -17,9 +17,9 @@ import pytest from aria.storage import ( ModelStorage, - model, exceptions, sql_mapi, + modeling, ) from aria import application_model_storage from ..storage import release_sqlite_storage, init_inmemory_model_storage @@ -38,7 +38,7 @@ def storage(): @pytest.fixture(scope='module', autouse=True) def module_cleanup(): - model.DeclarativeBase.metadata.remove(MockModel.__table__) #pylint: disable=no-member + modeling.model.DB.metadata.remove(MockModel.__table__) #pylint: disable=no-member def test_storage_base(storage): @@ -63,14 +63,41 @@ def test_model_storage(storage): def test_application_storage_factory(): storage = application_model_storage(sql_mapi.SQLAlchemyModelAPI, initiator=init_inmemory_model_storage) + + assert storage.parameter + assert storage.mapping_template + assert storage.substitution_template + assert storage.service_template + assert storage.node_template + assert storage.group_template + assert storage.interface_template + assert storage.operation_template + assert storage.artifact_template + assert storage.policy_template + assert storage.group_policy_template + assert storage.group_policy_trigger_template + assert storage.requirement_template + assert storage.capability_template + + assert storage.mapping + assert storage.substitution + assert storage.service_instance assert storage.node - assert storage.node_instance - assert storage.plugin - assert storage.blueprint - assert storage.deployment - assert storage.deployment_update - assert storage.deployment_update_step - assert storage.deployment_modification + assert storage.group + assert storage.interface + assert storage.operation + assert storage.capability + assert storage.artifact + assert storage.policy + assert storage.group_policy + assert storage.group_policy_trigger + assert storage.relationship + assert storage.execution + assert storage.service_instance_update + assert storage.service_instance_update_step + assert storage.service_instance_modification + assert storage.plugin + assert storage.task release_sqlite_storage(storage) http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/2b3276bb/tests/storage/test_structures.py ---------------------------------------------------------------------- diff --git a/tests/storage/test_structures.py b/tests/storage/test_structures.py index 4127905..6d3e5d2 100644 --- a/tests/storage/test_structures.py +++ b/tests/storage/test_structures.py @@ -21,22 +21,22 @@ from aria.storage import ( ModelStorage, sql_mapi, model, + exceptions, type, - exceptions ) from ..storage import release_sqlite_storage, structure, init_inmemory_model_storage from . import MockModel from ..mock import ( models, - operations, context as mock_context ) @pytest.fixture def storage(): - base_storage = ModelStorage(sql_mapi.SQLAlchemyModelAPI, initiator=init_inmemory_model_storage) + base_storage = ModelStorage(sql_mapi.SQLAlchemyModelAPI, + initiator=init_inmemory_model_storage) base_storage.register(MockModel) yield base_storage release_sqlite_storage(base_storage) @@ -44,7 +44,7 @@ def storage(): @pytest.fixture(scope='module', autouse=True) def module_cleanup(): - model.DeclarativeBase.metadata.remove(MockModel.__table__) #pylint: disable=no-member + model.DB.metadata.remove(MockModel.__table__) #pylint: disable=no-member @pytest.fixture @@ -89,144 +89,96 @@ def test_inner_list_update(storage): def test_model_to_dict(context): - deployment = context.deployment - deployment_dict = deployment.to_dict() + service_instance = context.service_instance + service_instance = service_instance.to_dict() expected_keys = [ - 'created_at', 'description', - 'inputs', - 'groups', + '_metadata', + 'created_at', 'permalink', 'policy_triggers', 'policy_types', - 'outputs', 'scaling_groups', 'updated_at', 'workflows', - 'blueprint_name', ] for expected_key in expected_keys: - assert expected_key in deployment_dict - - assert 'blueprint_fk' not in deployment_dict + assert expected_key in service_instance def test_relationship_model_ordering(context): - deployment = context.model.deployment.get_by_name(models.DEPLOYMENT_NAME) - source_node = context.model.node.get_by_name(models.DEPENDENT_NODE_NAME) - source_node_instance = context.model.node_instance.get_by_name( - models.DEPENDENT_NODE_INSTANCE_NAME) - target_node = context.model.node.get_by_name(models.DEPENDENCY_NODE_NAME) - target_node_instance = context.model.node_instance.get_by_name( - models.DEPENDENCY_NODE_INSTANCE_NAME) - new_node = model.Node( + service_instance = context.model.service_instance.get_by_name(models.DEPLOYMENT_NAME) + source_node = context.model.node.get_by_name(models.DEPENDENT_NODE_INSTANCE_NAME) + target_node = context.model.node.get_by_name(models.DEPENDENCY_NODE_INSTANCE_NAME) + new_node_template = model.NodeTemplate( name='new_node', - type='test_node_type', - type_hierarchy=[], - number_of_instances=1, - planned_number_of_instances=1, - deploy_number_of_instances=1, - properties={}, - operations=dict((key, {}) for key in operations.NODE_OPERATIONS), - min_number_of_instances=1, - max_number_of_instances=1, - deployment=deployment - ) - source_to_new_relationship = model.Relationship( - source_node=source_node, - target_node=new_node, - source_interfaces={}, - source_operations=dict((key, {}) for key in operations.RELATIONSHIP_OPERATIONS), - target_interfaces={}, - target_operations=dict((key, {}) for key in operations.RELATIONSHIP_OPERATIONS), - type='rel_type', + type_name='test_node_type', type_hierarchy=[], - properties={}, + default_instances=1, + min_instances=1, + max_instances=1, + service_template=service_instance.service_template ) - new_node_instance = model.NodeInstance( + new_node = model.Node( name='new_node_instance', runtime_properties={}, + service_instance=service_instance, version=None, - node=new_node, + node_template=new_node_template, state='', scaling_groups=[] ) - source_to_new_relationship_instance = model.RelationshipInstance( - relationship=source_to_new_relationship, - source_node_instance=source_node_instance, - target_node_instance=new_node_instance, + + source_to_new_relationship = model.Relationship( + target_node=new_node, + source_node=source_node, ) new_to_target_relationship = model.Relationship( source_node=new_node, target_node=target_node, - source_interfaces={}, - source_operations=dict((key, {}) for key in operations.RELATIONSHIP_OPERATIONS), - target_interfaces={}, - target_operations=dict((key, {}) for key in operations.RELATIONSHIP_OPERATIONS), - type='rel_type', - type_hierarchy=[], - properties={}, - ) - new_to_target_relationship_instance = model.RelationshipInstance( - relationship=new_to_target_relationship, - source_node_instance=new_node_instance, - target_node_instance=target_node_instance, ) + context.model.node_template.put(new_node_template) context.model.node.put(new_node) - context.model.node_instance.put(new_node_instance) context.model.relationship.put(source_to_new_relationship) context.model.relationship.put(new_to_target_relationship) - context.model.relationship_instance.put(source_to_new_relationship_instance) - context.model.relationship_instance.put(new_to_target_relationship_instance) - def flip_and_assert(node_instance, direction): + def flip_and_assert(node, direction): """ Reversed the order of relationships and assert effects took place. - :param node_instance: the node instance to operatate on + :param node: the node instance to operatate on :param direction: the type of relationships to flip (inbound/outbount) :return: """ assert direction in ('inbound', 'outbound') - relationships = getattr(node_instance.node, direction + '_relationships') - relationship_instances = getattr(node_instance, direction + '_relationship_instances') + relationships = getattr(node, direction + '_relationships') assert len(relationships) == 2 - assert len(relationship_instances) == 2 - first_rel, second_rel = relationships - first_rel_instance, second_rel_instance = relationship_instances - assert getattr(first_rel, relationships.ordering_attr) == 0 - assert getattr(second_rel, relationships.ordering_attr) == 1 - assert getattr(first_rel_instance, relationship_instances.ordering_attr) == 0 - assert getattr(second_rel_instance, relationship_instances.ordering_attr) == 1 + first_rel_instance, second_rel_instance = relationships + assert getattr(first_rel_instance, relationships.ordering_attr) == 0 + assert getattr(second_rel_instance, relationships.ordering_attr) == 1 - reversed_relationships = list(reversed(relationships)) - reversed_relationship_instances = list(reversed(relationship_instances)) + reversed_relationship_instances = list(reversed(relationships)) - assert relationships != reversed_relationships - assert relationship_instances != reversed_relationship_instances + assert relationships != reversed_relationship_instances - relationships[:] = reversed_relationships - relationship_instances[:] = reversed_relationship_instances - context.model.node_instance.update(node_instance) + relationships[:] = reversed_relationship_instances + context.model.node.update(node) - assert relationships == reversed_relationships - assert relationship_instances == reversed_relationship_instances + assert relationships == reversed_relationship_instances - assert getattr(first_rel, relationships.ordering_attr) == 1 - assert getattr(second_rel, relationships.ordering_attr) == 0 - assert getattr(first_rel_instance, relationship_instances.ordering_attr) == 1 - assert getattr(second_rel_instance, relationship_instances.ordering_attr) == 0 + assert getattr(first_rel_instance, relationships.ordering_attr) == 1 + assert getattr(second_rel_instance, relationships.ordering_attr) == 0 - flip_and_assert(source_node_instance, 'outbound') - flip_and_assert(target_node_instance, 'inbound') + flip_and_assert(source_node, 'outbound') + flip_and_assert(target_node, 'inbound') -class StrictClass(model.DeclarativeBase, structure.ModelMixin): +class StrictClass(model.DB, structure.ModelMixin): __tablename__ = 'strict_class' strict_dict = sqlalchemy.Column(type.StrictDict(basestring, basestring))
