# 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_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_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()
