# coding: utf-8

"""
    Airflow API

    Airflow API. All endpoints located under ``/api/v2`` can be used safely, are stable and backward compatible. Endpoints located under ``/ui`` are dedicated to the UI and are subject to breaking change depending on the need of the frontend. Users should not rely on those but use the public ones instead.

    The version of the OpenAPI document: 2
    Generated by OpenAPI Generator (https://openapi-generator.tech)

    Do not edit the class manually.
"""  # noqa: E501


import unittest

from airflow_client.client.api.task_instance_api import TaskInstanceApi


class TestTaskInstanceApi(unittest.TestCase):
    """TaskInstanceApi unit test stubs"""

    def setUp(self) -> None:
        self.api = TaskInstanceApi()

    def tearDown(self) -> None:
        pass

    def test_bulk_task_instances(self) -> None:
        """Test case for bulk_task_instances

        Bulk Task Instances
        """
        pass

    def test_delete_task_instance(self) -> None:
        """Test case for delete_task_instance

        Delete Task Instance
        """
        pass

    def test_get_external_log_url(self) -> None:
        """Test case for get_external_log_url

        Get External Log Url
        """
        pass

    def test_get_extra_links(self) -> None:
        """Test case for get_extra_links

        Get Extra Links
        """
        pass

    def test_get_hitl_detail(self) -> None:
        """Test case for get_hitl_detail

        Get Hitl Detail
        """
        pass

    def test_get_hitl_detail_try_detail(self) -> None:
        """Test case for get_hitl_detail_try_detail

        Get Hitl Detail Try Detail
        """
        pass

    def test_get_hitl_details(self) -> None:
        """Test case for get_hitl_details

        Get Hitl Details
        """
        pass

    def test_get_log(self) -> None:
        """Test case for get_log

        Get Log
        """
        pass

    def test_get_mapped_task_instance(self) -> None:
        """Test case for get_mapped_task_instance

        Get Mapped Task Instance
        """
        pass

    def test_get_mapped_task_instance_tries(self) -> None:
        """Test case for get_mapped_task_instance_tries

        Get Mapped Task Instance Tries
        """
        pass

    def test_get_mapped_task_instance_try_details(self) -> None:
        """Test case for get_mapped_task_instance_try_details

        Get Mapped Task Instance Try Details
        """
        pass

    def test_get_mapped_task_instances(self) -> None:
        """Test case for get_mapped_task_instances

        Get Mapped Task Instances
        """
        pass

    def test_get_task_instance(self) -> None:
        """Test case for get_task_instance

        Get Task Instance
        """
        pass

    def test_get_task_instance_dependencies(self) -> None:
        """Test case for get_task_instance_dependencies

        Get Task Instance Dependencies
        """
        pass

    def test_get_task_instance_dependencies_by_map_index(self) -> None:
        """Test case for get_task_instance_dependencies_by_map_index

        Get Task Instance Dependencies
        """
        pass

    def test_get_task_instance_tries(self) -> None:
        """Test case for get_task_instance_tries

        Get Task Instance Tries
        """
        pass

    def test_get_task_instance_try_details(self) -> None:
        """Test case for get_task_instance_try_details

        Get Task Instance Try Details
        """
        pass

    def test_get_task_instances(self) -> None:
        """Test case for get_task_instances

        Get Task Instances
        """
        pass

    def test_get_task_instances_batch(self) -> None:
        """Test case for get_task_instances_batch

        Get Task Instances Batch
        """
        pass

    def test_patch_task_group_instances(self) -> None:
        """Test case for patch_task_group_instances

        Patch Task Group Instances
        """
        pass

    def test_patch_task_group_instances_dry_run(self) -> None:
        """Test case for patch_task_group_instances_dry_run

        Patch Task Group Instances Dry Run
        """
        pass

    def test_patch_task_instance(self) -> None:
        """Test case for patch_task_instance

        Patch Task Instance
        """
        pass

    def test_patch_task_instance_by_map_index(self) -> None:
        """Test case for patch_task_instance_by_map_index

        Patch Task Instance
        """
        pass

    def test_patch_task_instance_dry_run(self) -> None:
        """Test case for patch_task_instance_dry_run

        Patch Task Instance Dry Run
        """
        pass

    def test_patch_task_instance_dry_run_by_map_index(self) -> None:
        """Test case for patch_task_instance_dry_run_by_map_index

        Patch Task Instance Dry Run
        """
        pass

    def test_post_clear_task_instances(self) -> None:
        """Test case for post_clear_task_instances

        Post Clear Task Instances
        """
        pass

    def test_update_hitl_detail(self) -> None:
        """Test case for update_hitl_detail

        Update Hitl Detail
        """
        pass


if __name__ == '__main__':
    unittest.main()
