# 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.pool_api import PoolApi


class TestPoolApi(unittest.TestCase):
    """PoolApi unit test stubs"""

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

    def tearDown(self) -> None:
        pass

    def test_bulk_pools(self) -> None:
        """Test case for bulk_pools

        Bulk Pools
        """
        pass

    def test_delete_pool(self) -> None:
        """Test case for delete_pool

        Delete Pool
        """
        pass

    def test_get_pool(self) -> None:
        """Test case for get_pool

        Get Pool
        """
        pass

    def test_get_pools(self) -> None:
        """Test case for get_pools

        Get Pools
        """
        pass

    def test_patch_pool(self) -> None:
        """Test case for patch_pool

        Patch Pool
        """
        pass

    def test_post_pool(self) -> None:
        """Test case for post_pool

        Post Pool
        """
        pass


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