code: def test_get_joinable_semantic_models_multi_hop(  # noqa: D
      multi_hop_join_semantic_manifest_lookup: SemanticManifestLookup,
  ) -> None:
      semantic_model_reference = SemanticModelReference(
          semantic_model_name="account_month_txns"
      )
      join_evaluator = SemanticModelJoinEvaluator(
          semantic_model_lookup=multi_hop_join_semantic_manifest_lookup.semantic_model_lookup
      )
  
      # 2-hop
      joinable_semantic_models = (
          join_evaluator.get_joinable_semantic_models(
              left_semantic_model_reference=semantic_model_reference,
              include_multi_hop=True,
          )
      )
      assert set(joinable_semantic_models.keys()) == {
          "bridge_table",
          "customer_other_data",
          "customer_table",
      }
      assert joinable_semantic_models[
          "bridge_table"
      ] == SemanticModelLink(
          left_semantic_model_reference=SemanticModelReference(
              semantic_model_name="account_month_txns"
          ),
          join_path=[
              SemanticModelEntityJoin(
                  right_semantic_model_reference=SemanticModelReference(
                      semantic_model_name="bridge_table"
                  ),
                  entity_reference=EntityReference(
                      element_name="account_id"
                  ),
                  join_type=SemanticModelEntityJoinType(
                      left_entity_type=EntityType.PRIMARY,
                      right_entity_type=EntityType.UNIQUE,
                  ),
              )
          ],
      )
      assert joinable_semantic_models[
          "customer_other_data"
      ] == SemanticModelLink(
          left_semantic_model_reference=SemanticModelReference(
              semantic_model_name="account_month_txns"
          ),
          join_path=[
              SemanticModelEntityJoin(
                  right_semantic_model_reference=SemanticModelReference(
                      semantic_model_name="bridge_table"
                  ),
                  entity_reference=EntityReference(
                      element_name="account_id"
                  ),
                  join_type=SemanticModelEntityJoinType(
                      left_entity_type=EntityType.PRIMARY,
                      right_entity_type=EntityType.UNIQUE,
                  ),
              ),
              SemanticModelEntityJoin(
                  right_semantic_model_reference=SemanticModelReference(
                      semantic_model_name="customer_other_data"
                  ),
                  entity_reference=EntityReference(
                      element_name="customer_id"
                  ),
                  join_type=SemanticModelEntityJoinType(
                      left_entity_type=EntityType.FOREIGN,
                      right_entity_type=EntityType.PRIMARY,
                  ),
              ),
          ],
      )
      assert joinable_semantic_models[
          "customer_table"
      ] == SemanticModelLink(
          left_semantic_model_reference=SemanticModelReference(
              semantic_model_name="account_month_txns"
          ),
          join_path=[
              SemanticModelEntityJoin(
                  right_semantic_model_reference=SemanticModelReference(
                      semantic_model_name="bridge_table"
                  ),
                  entity_reference=EntityReference(
                      element_name="account_id"
                  ),
                  join_type=SemanticModelEntityJoinType(
                      left_entity_type=EntityType.PRIMARY,
                      right_entity_type=EntityType.UNIQUE,
                  ),
              ),
              SemanticModelEntityJoin(
                  right_semantic_model_reference=SemanticModelReference(
                      semantic_model_name="customer_table"
                  ),
                  entity_reference=EntityReference(
                      element_name="customer_id"
                  ),
                  join_type=SemanticModelEntityJoinType(
                      left_entity_type=EntityType.FOREIGN,
                      right_entity_type=EntityType.PRIMARY,
                  ),
              ),
          ],
      )
  
file_path: metricflow/metricflow/test/model/semantics/test_semantic_model_join_evaluator.py
imports: from __future__ import annotations
  from typing import Dict, Sequence
  from dbt_semantic_interfaces.enum_extension import assert_values_exhausted
  from dbt_semantic_interfaces.protocols.entity import EntityType
  from dbt_semantic_interfaces.references import EntityReference, SemanticModelReference
  from metricflow.model.semantic_manifest_lookup import SemanticManifestLookup
  from metricflow.model.semantics.semantic_model_join_evaluator import SemanticModelEntityJoin, SemanticModelEntityJoinType, SemanticModelJoinEvaluator, SemanticModelLink
  from metricflow.test.fixtures.model_fixtures import ConsistentIdObjectRepository
label_desc: Use image node_id 10 for calling a global function with example usage: test_get_joinable_semantic_models_multi_hop(multi_hop_join_semantic_manifest_lookup) without return types