# 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.connection_api import ConnectionApi


class TestConnectionApi(unittest.TestCase):
    """ConnectionApi unit test stubs"""

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

    def tearDown(self) -> None:
        pass

    def test_bulk_connections(self) -> None:
        """Test case for bulk_connections

        Bulk Connections
        """
        pass

    def test_create_default_connections(self) -> None:
        """Test case for create_default_connections

        Create Default Connections
        """
        pass

    def test_delete_connection(self) -> None:
        """Test case for delete_connection

        Delete Connection
        """
        pass

    def test_get_connection(self) -> None:
        """Test case for get_connection

        Get Connection
        """
        pass

    def test_get_connections(self) -> None:
        """Test case for get_connections

        Get Connections
        """
        pass

    def test_patch_connection(self) -> None:
        """Test case for patch_connection

        Patch Connection
        """
        pass

    def test_post_connection(self) -> None:
        """Test case for post_connection

        Post Connection
        """
        pass

    def test_test_connection(self) -> None:
        """Test case for test_connection

        Test Connection
        """
        pass


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