# 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_get_extra_links(self) -> None:
        """Test case for get_extra_links

        Get Extra Links
        """
        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


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