code: def test_FeatureFetcher_homo():
      graph = gb_test_utils.rand_csc_graph(
          20, 0.15, bidirection_edge=True
      )
      a = torch.tensor(
          [
              [random.randint(0, 10)]
              for _ in range(graph.total_num_nodes)
          ]
      )
      b = torch.tensor(
          [
              [random.randint(0, 10)]
              for _ in range(graph.total_num_edges)
          ]
      )
  
      features = {}
      keys = [("node", None, "a"), ("edge", None, "b")]
      features[keys[0]] = gb.TorchBasedFeature(a)
      features[keys[1]] = gb.TorchBasedFeature(b)
      feature_store = gb.BasicFeatureStore(features)
  
      itemset = gb.ItemSet(torch.arange(10), names="seed_nodes")
      item_sampler = gb.ItemSampler(itemset, batch_size=2)
      num_layer = 2
      fanouts = [torch.LongTensor([2]) for _ in range(num_layer)]
      sampler_dp = gb.NeighborSampler(item_sampler, graph, fanouts)
      fetcher_dp = gb.FeatureFetcher(
          sampler_dp, feature_store, ["a"], ["b"]
      )
  
      assert len(list(fetcher_dp)) == 5
  
file_path: dgl/tests/python/pytorch/graphbolt/test_feature_fetcher.py
imports: import random
  from enum import Enum
  import dgl.graphbolt
  import pytest
  import torch
  from torchdata.datapipes.iter import Mapper
  from .None import gb_test_utils
label_desc: Use image node_id 2 for calling a global function with example usage: test_FeatureFetcher_homo() without return types