code: def test_groupby_transform_direct_groupby(es):
      groupby = DirectFeature(
          IdentityFeature(es["cohorts"].ww["cohort_name"]),
          "customers",
      )
      feat = GroupByTransformFeature(
          IdentityFeature(es["customers"].ww["age"]),
          CumMax,
          groupby,
      )
      graph = graph_feature(feat).source
  
      groupby_name = groupby.get_name()
      feat_name = feat.get_name()
      join_node = "1_{}_join".format(groupby_name)
      prim_node = "0_{}_cum_max".format(feat_name)
      groupby_node = "{}_groupby_customers--{}".format(
          feat_name, groupby_name
      )
      customers_table = "\u2605 customers (target)"
      cohorts_table = "cohorts"
  
      join_groupby = '"{}" -> customers:cohort'.format(join_node)
      join_input = 'cohorts:cohort_name -> "{}"'.format(join_node)
      join_out_edge = '"{}" -> customers:"{}"'.format(
          join_node, groupby_name
      )
      groupby_edge = 'customers:"{}" -> "{}"'.format(
          groupby_name, groupby_node
      )
      groupby_input = 'customers:age -> "{}"'.format(groupby_node)
      prim_input = '"{}" -> "{}"'.format(groupby_node, prim_node)
      feat_edge = '"{}" -> customers:"{}"'.format(prim_node, feat_name)
  
      graph_components = [
          groupby_name,
          feat_name,
          join_node,
          prim_node,
          groupby_node,
          customers_table,
          cohorts_table,
          join_groupby,
          join_input,
          join_out_edge,
          groupby_edge,
          groupby_input,
          prim_input,
          feat_edge,
      ]
      for component in graph_components:
          assert component in graph
  
      dataframes = {
          "cohorts": [cohorts_table, "cohort_name"],
          "customers": [
              customers_table,
              "cohort",
              "age",
              groupby_name,
              feat_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 10 for calling a global function with example usage: test_groupby_transform_direct_groupby(es) without return types