code: def test_describe_training_job_with_complete_states(
      self, mock_client, mock_log_client, log_state
  ):
      mock_session = mock.Mock()
      mock_log_session = mock.Mock()
      attrs = {
          "describe_training_job.return_value": DESCRIBE_TRAINING_COMPLETED_RETURN
      }
      log_attrs = {
          "describe_log_streams.side_effect": LIFECYCLE_LOG_STREAMS,
          "get_log_events.side_effect": STREAM_LOG_EVENTS,
      }
      mock_session.configure_mock(**attrs)
      mock_client.return_value = mock_session
      mock_log_session.configure_mock(**log_attrs)
      mock_log_client.return_value = mock_log_session
      hook = SageMakerHook(aws_conn_id="sagemaker_test_conn_id")
      response = hook.describe_training_job_with_log(
          job_name=job_name,
          positions={},
          stream_names=[],
          instance_count=1,
          state=log_state,
          last_description={},
          last_describe_job_call=0,
      )
      assert response == (LogState.COMPLETE, {}, 0)
  
imports: from __future__ import annotations
  import time
  from datetime import datetime
  from unittest import mock
  from unittest.mock import patch
  import pytest
  from botocore.exceptions import ClientError
  from dateutil.tz import tzlocal
  from moto import mock_sagemaker
  from airflow.exceptions import AirflowException
  from airflow.providers.amazon.aws.hooks.logs import AwsLogsHook
  from airflow.providers.amazon.aws.hooks.s3 import S3Hook
  from airflow.providers.amazon.aws.hooks.sagemaker import LogState, SageMakerHook, secondary_training_status_changed, secondary_training_status_message
label_desc: Use image node_id 27 for calling the TestSageMakerHook obj's underlying member method code with example usage: obj.test_describe_training_job_with_complete_states(mock_client, mock_log_client, log_state) without return types