# 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.models.bulk_response import BulkResponse

class TestBulkResponse(unittest.TestCase):
    """BulkResponse unit test stubs"""

    def setUp(self):
        pass

    def tearDown(self):
        pass

    def make_instance(self, include_optional) -> BulkResponse:
        """Test BulkResponse
            include_optional is a boolean, when False only required
            params are included, when True both required and
            optional params are included """
        # uncomment below to create an instance of `BulkResponse`
        """
        model = BulkResponse()
        if include_optional:
            return BulkResponse(
                create = airflow_client.client.models.bulk_action_response.BulkActionResponse(
                    errors = [
                        None
                        ], 
                    success = [
                        ''
                        ], ),
                delete = airflow_client.client.models.bulk_action_response.BulkActionResponse(
                    errors = [
                        None
                        ], 
                    success = [
                        ''
                        ], ),
                update = airflow_client.client.models.bulk_action_response.BulkActionResponse(
                    errors = [
                        None
                        ], 
                    success = [
                        ''
                        ], )
            )
        else:
            return BulkResponse(
        )
        """

    def testBulkResponse(self):
        """Test BulkResponse"""
        # inst_req_only = self.make_instance(include_optional=False)
        # inst_req_and_optional = self.make_instance(include_optional=True)

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