# 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.variable_api import VariableApi


class TestVariableApi(unittest.TestCase):
    """VariableApi unit test stubs"""

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

    def tearDown(self) -> None:
        pass

    def test_bulk_variables(self) -> None:
        """Test case for bulk_variables

        Bulk Variables
        """
        pass

    def test_delete_variable(self) -> None:
        """Test case for delete_variable

        Delete Variable
        """
        pass

    def test_get_variable(self) -> None:
        """Test case for get_variable

        Get Variable
        """
        pass

    def test_get_variables(self) -> None:
        """Test case for get_variables

        Get Variables
        """
        pass

    def test_patch_variable(self) -> None:
        """Test case for patch_variable

        Patch Variable
        """
        pass

    def test_post_variable(self) -> None:
        """Test case for post_variable

        Post Variable
        """
        pass


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