# 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.asset_api import AssetApi


class TestAssetApi(unittest.TestCase):
    """AssetApi unit test stubs"""

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

    def tearDown(self) -> None:
        pass

    def test_create_asset_event(self) -> None:
        """Test case for create_asset_event

        Create Asset Event
        """
        pass

    def test_delete_asset_queued_events(self) -> None:
        """Test case for delete_asset_queued_events

        Delete Asset Queued Events
        """
        pass

    def test_delete_dag_asset_queued_event(self) -> None:
        """Test case for delete_dag_asset_queued_event

        Delete Dag Asset Queued Event
        """
        pass

    def test_delete_dag_asset_queued_events(self) -> None:
        """Test case for delete_dag_asset_queued_events

        Delete Dag Asset Queued Events
        """
        pass

    def test_get_asset(self) -> None:
        """Test case for get_asset

        Get Asset
        """
        pass

    def test_get_asset_alias(self) -> None:
        """Test case for get_asset_alias

        Get Asset Alias
        """
        pass

    def test_get_asset_aliases(self) -> None:
        """Test case for get_asset_aliases

        Get Asset Aliases
        """
        pass

    def test_get_asset_events(self) -> None:
        """Test case for get_asset_events

        Get Asset Events
        """
        pass

    def test_get_asset_queued_events(self) -> None:
        """Test case for get_asset_queued_events

        Get Asset Queued Events
        """
        pass

    def test_get_assets(self) -> None:
        """Test case for get_assets

        Get Assets
        """
        pass

    def test_get_dag_asset_queued_event(self) -> None:
        """Test case for get_dag_asset_queued_event

        Get Dag Asset Queued Event
        """
        pass

    def test_get_dag_asset_queued_events(self) -> None:
        """Test case for get_dag_asset_queued_events

        Get Dag Asset Queued Events
        """
        pass

    def test_materialize_asset(self) -> None:
        """Test case for materialize_asset

        Materialize Asset
        """
        pass


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