code: def test_direct(es):
      d1 = DirectFeature(
          IdentityFeature(es["customers"].ww["engagement_level"]),
          "sessions",
      )
      d2 = DirectFeature(d1, "log")
      graph = graph_feature(d2).source
  
      d1_name = d1.get_name()
      d2_name = d2.get_name()
      prim_node1 = "1_{}_join".format(d1_name)
      prim_node2 = "0_{}_join".format(d2_name)
  
      log_table = "\u2605 log (target)"
      sessions_table = "sessions"
      customers_table = "customers"
      groupby_edge1 = '"{}" -> sessions:customer_id'.format(prim_node1)
      groupby_edge2 = '"{}" -> log:session_id'.format(prim_node2)
      groupby_input1 = 'customers:engagement_level -> "{}"'.format(
          prim_node1
      )
      groupby_input2 = 'sessions:"{}" -> "{}"'.format(
          d1_name, prim_node2
      )
      d1_edge = '"{}" -> sessions:"{}"'.format(prim_node1, d1_name)
      d2_edge = '"{}" -> log:"{}"'.format(prim_node2, d2_name)
  
      graph_components = [
          d1_name,
          d2_name,
          prim_node1,
          prim_node2,
          log_table,
          sessions_table,
          customers_table,
          groupby_edge1,
          groupby_edge2,
          groupby_input1,
          groupby_input2,
          d1_edge,
          d2_edge,
      ]
      for component in graph_components:
          assert component in graph
  
      dataframes = {
          "customers": [customers_table, "engagement_level"],
          "sessions": [sessions_table, "customer_id", d1_name],
          "log": [log_table, "session_id", d2_name],
      }
  
      for dataframe in dataframes:
          regex = r"{} \[label=<\n<TABLE.*?</TABLE>>".format(dataframe)
          matches = re.findall(regex, graph, re.DOTALL)
          assert len(matches) == 1
  
          rows = re.findall(r"<TR.*?</TR>", matches[0], re.DOTALL)
          assert len(rows) == len(dataframes[dataframe])
          for row in rows:
              matched = False
              for i in dataframes[dataframe]:
                  if i in row:
                      matched = True
                      dataframes[dataframe].remove(i)
                      break
              assert matched
  
imports: import json
  import os
  import re
  import graphviz
  import pytest
  from featuretools.feature_base import AggregationFeature, DirectFeature, FeatureOutputSlice, GroupByTransformFeature, IdentityFeature, TransformFeature, graph_feature
  from featuretools.primitives import Count, CumMax, Mode, NMostCommon, Year
label_desc: Use image node_id 13 for calling a global function with example usage: test_direct(es) without return types