code: def test_groupby_transform(es):
      feat = GroupByTransformFeature(
          IdentityFeature(es["customers"].ww["age"]),
          CumMax,
          IdentityFeature(es["customers"].ww["cohort"]),
      )
      graph = graph_feature(feat).source
  
      feat_name = feat.get_name()
      prim_node = "0_{}_cum_max".format(feat_name)
      groupby_node = "{}_groupby_customers--cohort".format(feat_name)
      dataframe_table = "\u2605 customers (target)"
  
      groupby_edge = 'customers:cohort -> "{}"'.format(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 = [
          feat_name,
          prim_node,
          groupby_node,
          dataframe_table,
          groupby_edge,
          groupby_input,
          prim_input,
          feat_edge,
      ]
      for component in graph_components:
          assert component in graph
  
      matches = re.findall(
          r"customers \[label=<\n<TABLE.*?</TABLE>>", graph, re.DOTALL
      )
      assert len(matches) == 1
      rows = re.findall(r"<TR.*?</TR>", matches[0], re.DOTALL)
      assert len(rows) == 4
      assert dataframe_table in rows[0]
      assert feat_name in rows[-1]
      assert ("age" in rows[1] and "cohort" in rows[2]) or (
          "age" in rows[2] and "cohort" in rows[1]
      )
  
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 9 for calling a global function with example usage: test_groupby_transform(es) without return types