code: def test_action_graph_service_add_action_no_mutagen(
      in_mem_action_graph_service: ActionGraphService,
      authed_context: AuthedServiceContext,
  ) -> None:
      """
      Test the `add_action` method of ActionGraphService when there is no
      mutagen, i.e. a node that causes mutation. Scenario:
          node_1: action_obj_a = [1,2,3]
          node_2: action_obj_b = [2,3,4]
          node_3: action -> add(a, b)
          node_4: action_obj = a + b  (automatically created)
      """
      action_obj_a = ActionObject.from_obj([1, 2, 3])
      action_obj_b = ActionObject.from_obj([2, 3, 4])
      in_mem_action_graph_service.add_action_obj(
          context=authed_context, action_obj=action_obj_a
      )
      in_mem_action_graph_service.add_action_obj(
          context=authed_context, action_obj=action_obj_b
      )
      action = Action(
          path="action.execute",
          op="__add__",
          remote_self=action_obj_a.syft_lineage_id,
          args=[action_obj_b.syft_lineage_id],
          kwargs={},
      )
      action_node, result_node = in_mem_action_graph_service.add_action(
          context=authed_context, action=action
      )
  
      assert (
          len(in_mem_action_graph_service.get_all_nodes(authed_context))
          == 4
      )
      assert (
          len(in_mem_action_graph_service.get_all_edges(authed_context))
          == 3
      )
  
      assert action_node.id == action.id
      assert action_node.type == NodeType.ACTION
      assert action_node.status == ExecutionStatus.PROCESSING
      assert action_node.retry == 0
      assert isinstance(action_node.created_at, DateTime)
      assert action_node.updated_at is None
      assert action_node.user_verify_key == authed_context.credentials
      assert action_node.is_mutated is False
      assert action_node.is_mutagen is False
      assert action_node.next_mutagen_node is None
      assert action_node.last_nm_mutagen_node is None
  
      assert result_node.id == action.result_id.id
      assert result_node.type == NodeType.ACTION_OBJECT
      assert result_node.status == ExecutionStatus.PROCESSING
      assert result_node.retry == 0
      assert isinstance(result_node.created_at, DateTime)
      assert result_node.updated_at is None
      assert result_node.user_verify_key == authed_context.credentials
      assert result_node.is_mutated is False
      assert result_node.is_mutagen is False
      assert result_node.next_mutagen_node is None
      assert result_node.last_nm_mutagen_node is None
  
imports: from syft.node.credentials import SyftSigningKey
  from syft.node.credentials import SyftVerifyKey
  from syft.node.worker import Worker
  from syft.service.action.action_graph import ExecutionStatus
  from syft.service.action.action_graph import InMemoryActionGraphStore
  from syft.service.action.action_graph import NetworkXBackingStore
  from syft.service.action.action_graph import NodeActionData
  from syft.service.action.action_graph import NodeActionDataUpdate
  from syft.service.action.action_graph import NodeType
  from syft.service.action.action_graph_service import ActionGraphService
  from syft.service.action.action_object import Action
  from syft.service.action.action_object import ActionObject
  from syft.service.context import AuthedServiceContext
  from syft.service.response import SyftError
  from syft.service.response import SyftSuccess
  from syft.types.datetime import DateTime
  from syft.types.uid import UID
label_desc: Use image node_id 3 for calling a global function with example usage: test_action_graph_service_add_action_no_mutagen(in_mem_action_graph_service, authed_context) without return types