# 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.  **Filtering with pattern parameters.** Many list endpoints accept ``*_pattern`` and ``*_prefix_pattern`` query parameters. Unless a parameter's own description says otherwise, ``*_pattern`` is a case-insensitive substring match (SQL ``ILIKE '%term%'``) where ``%`` matches any sequence and ``_`` matches any single character (e.g. ``%customer_%``) — convenient, but it cannot use B-tree indexes, so it is slow on large tables. ``*_prefix_pattern`` matches the start of the value, is case-sensitive and index-friendly (prefer it at scale); there ``%`` and ``_`` are literal and trailing non-alphanumeric characters are stripped so the range scan stays index-compatible under locale-aware collations (e.g. ``test_`` matches values starting with ``test``, and ``s3://`` matches ``s3``). In both, ``|`` means OR (e.g. ``dag1|dag2``) and ``~`` matches everything. Regular expressions are not supported by these parameters; regex-capable endpoints expose a separate parameter.

    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.task_instance_response import TaskInstanceResponse

class TestTaskInstanceResponse(unittest.TestCase):
    """TaskInstanceResponse unit test stubs"""

    def setUp(self):
        pass

    def tearDown(self):
        pass

    def make_instance(self, include_optional) -> TaskInstanceResponse:
        """Test TaskInstanceResponse
            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 `TaskInstanceResponse`
        """
        model = TaskInstanceResponse()
        if include_optional:
            return TaskInstanceResponse(
                dag_display_name = '',
                dag_id = '',
                dag_run_id = '',
                dag_version = airflow_client.client.models.dag_version_response.DagVersionResponse(
                    bundle_name = '', 
                    bundle_url = '', 
                    bundle_version = '', 
                    created_at = datetime.datetime.strptime('2013-10-20 19:20:30.00', '%Y-%m-%d %H:%M:%S.%f'), 
                    dag_display_name = '', 
                    dag_id = '', 
                    id = '', 
                    version_number = 56, ),
                duration = 1.337,
                end_date = datetime.datetime.strptime('2013-10-20 19:20:30.00', '%Y-%m-%d %H:%M:%S.%f'),
                executor = '',
                executor_config = '',
                hostname = '',
                id = '',
                logical_date = datetime.datetime.strptime('2013-10-20 19:20:30.00', '%Y-%m-%d %H:%M:%S.%f'),
                map_index = 56,
                max_tries = 56,
                note = '',
                operator = '',
                operator_name = '',
                pid = 56,
                pool = '',
                pool_slots = 56,
                priority_weight = 56,
                queue = '',
                queued_when = datetime.datetime.strptime('2013-10-20 19:20:30.00', '%Y-%m-%d %H:%M:%S.%f'),
                rendered_fields = { },
                rendered_map_index = '',
                run_after = datetime.datetime.strptime('2013-10-20 19:20:30.00', '%Y-%m-%d %H:%M:%S.%f'),
                scheduled_when = datetime.datetime.strptime('2013-10-20 19:20:30.00', '%Y-%m-%d %H:%M:%S.%f'),
                start_date = datetime.datetime.strptime('2013-10-20 19:20:30.00', '%Y-%m-%d %H:%M:%S.%f'),
                state = 'removed',
                task_display_name = '',
                task_id = '',
                trigger = airflow_client.client.models.trigger_response.TriggerResponse(
                    classpath = '', 
                    created_date = datetime.datetime.strptime('2013-10-20 19:20:30.00', '%Y-%m-%d %H:%M:%S.%f'), 
                    id = 56, 
                    kwargs = '', 
                    queue = '', 
                    triggerer_id = 56, ),
                triggerer_job = airflow_client.client.models.job_response.JobResponse(
                    dag_display_name = '', 
                    dag_id = '', 
                    end_date = datetime.datetime.strptime('2013-10-20 19:20:30.00', '%Y-%m-%d %H:%M:%S.%f'), 
                    executor_class = '', 
                    hostname = '', 
                    id = 56, 
                    job_type = '', 
                    latest_heartbeat = datetime.datetime.strptime('2013-10-20 19:20:30.00', '%Y-%m-%d %H:%M:%S.%f'), 
                    start_date = datetime.datetime.strptime('2013-10-20 19:20:30.00', '%Y-%m-%d %H:%M:%S.%f'), 
                    state = '', 
                    unixname = '', ),
                try_number = 56,
                unixname = ''
            )
        else:
            return TaskInstanceResponse(
                dag_display_name = '',
                dag_id = '',
                dag_run_id = '',
                executor_config = '',
                id = '',
                map_index = 56,
                max_tries = 56,
                pool = '',
                pool_slots = 56,
                run_after = datetime.datetime.strptime('2013-10-20 19:20:30.00', '%Y-%m-%d %H:%M:%S.%f'),
                task_display_name = '',
                task_id = '',
                try_number = 56,
        )
        """

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

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