def test_get_incoming(self): """Test that `Node.get_incoming` will return stored and cached input links.""" source_one = Data().store() source_two = Data().store() target = CalculationNode() target.add_incoming(source_one, LinkType.INPUT_CALC, 'link_one') target.add_incoming(source_two, LinkType.INPUT_CALC, 'link_two') # Without link type incoming_nodes = target.get_incoming().all() incoming_uuids = sorted( [neighbor.node.uuid for neighbor in incoming_nodes]) self.assertEqual(incoming_uuids, sorted([source_one.uuid, source_two.uuid])) # Using a single link type incoming_nodes = target.get_incoming( link_type=LinkType.INPUT_CALC).all() incoming_uuids = sorted( [neighbor.node.uuid for neighbor in incoming_nodes]) self.assertEqual(incoming_uuids, sorted([source_one.uuid, source_two.uuid])) # Using a link type tuple incoming_nodes = target.get_incoming( link_type=(LinkType.INPUT_CALC, LinkType.INPUT_WORK)).all() incoming_uuids = sorted( [neighbor.node.uuid for neighbor in incoming_nodes]) self.assertEqual(incoming_uuids, sorted([source_one.uuid, source_two.uuid]))
def test_node_indegree_unique_pair(self): """Test that the validation of links with indegree `unique_pair` works correctly The example here is a `DataNode` that has two incoming links with the same label, but with different types. This is legal and should pass validation. """ caller = WorkflowNode().store() data = Data().store() called = CalculationNode() # Verify that adding two incoming links with the same link label but different type is allowed called.add_incoming(caller, link_type=LinkType.CALL_CALC, link_label='call') called.add_incoming(data, link_type=LinkType.INPUT_CALC, link_label='call') called.store() uuids_incoming = set(node.uuid for node in called.get_incoming().all_nodes()) uuids_expected = set([caller.uuid, data.uuid]) self.assertEqual(uuids_incoming, uuids_expected)