code: def test_get_features(feature_args, input_set, commutative, expected):
      features = [LiteFeature(*args) for args in feature_args]
      feature_collection = FeatureCollection(features).reindex()
  
      column_keys = _index_column_set(input_set)
      actual = _get_features(
          feature_collection, tuple(column_keys), commutative
      )
  
      assert set([tuple([y.id for y in x]) for x in actual]) == set(
          [tuple(x) for x in expected],
      )
  
imports: from unittest.mock import patch
  import pytest
  from woodwork.column_schema import ColumnSchema
  from woodwork.logical_types import Boolean, BooleanNullable, Datetime, Double, NaturalLanguage, Ordinal
  from featuretools.entityset.entityset import EntitySet
  from featuretools.feature_discovery.feature_discovery import _get_features, _get_matching_features, _index_column_set, generate_features_from_primitives, schema_to_features
  from featuretools.feature_discovery.FeatureCollection import FeatureCollection
  from featuretools.feature_discovery.LiteFeature import LiteFeature
  from featuretools.feature_discovery.utils import column_schema_to_keys
  from featuretools.primitives import Absolute, AddNumeric, Count, DateFirstEvent, Equal, Lag, MultiplyNumericBoolean, NumUnique, TransformPrimitive
  from featuretools.primitives.utils import get_transform_primitives
  from featuretools.synthesis import dfs
  from featuretools.tests.testing_utils.generate_fake_dataframe import generate_fake_dataframe
label_desc: Use image node_id 3 for calling a global function with example usage: test_get_features(feature_args, input_set, commutative, expected) without return types