diff --git a/modules/openapi-generator/src/main/resources/python/model_utils.mustache b/modules/openapi-generator/src/main/resources/python/model_utils.mustache index 4a99eab52a..6be57468da 100644 --- a/modules/openapi-generator/src/main/resources/python/model_utils.mustache +++ b/modules/openapi-generator/src/main/resources/python/model_utils.mustache @@ -1182,6 +1182,9 @@ def is_valid_type(input_class_simple, valid_classes): Returns: bool """ + if issubclass(input_class_simple, OpenApiModel) and \ + valid_classes == (bool, date, datetime, dict, float, int, list, str, none_type,): + return True valid_type = input_class_simple in valid_classes if not valid_type and ( issubclass(input_class_simple, OpenApiModel) or diff --git a/modules/openapi-generator/src/test/resources/3_0/python/petstore-with-fake-endpoints-models-for-testing-with-http-signature.yaml b/modules/openapi-generator/src/test/resources/3_0/python/petstore-with-fake-endpoints-models-for-testing-with-http-signature.yaml index c78f428360..9e347d3d33 100644 --- a/modules/openapi-generator/src/test/resources/3_0/python/petstore-with-fake-endpoints-models-for-testing-with-http-signature.yaml +++ b/modules/openapi-generator/src/test/resources/3_0/python/petstore-with-fake-endpoints-models-for-testing-with-http-signature.yaml @@ -1643,6 +1643,8 @@ components: properties: breed: type: string + legs: + $ref: '#/components/schemas/Legs' Cat: allOf: - $ref: '#/components/schemas/Animal' @@ -1650,6 +1652,19 @@ components: properties: declawed: type: boolean + Legs: + type: object + required: + - legs + properties: + legs: + enum: + - '2' + - '4' + default: '4' + x-enum-as-string: true + name: + type: string Address: type: object additionalProperties: diff --git a/samples/client/petstore/python/petstore_api/model_utils.py b/samples/client/petstore/python/petstore_api/model_utils.py index e7ef88f64f..955ad1cba4 100644 --- a/samples/client/petstore/python/petstore_api/model_utils.py +++ b/samples/client/petstore/python/petstore_api/model_utils.py @@ -1479,6 +1479,9 @@ def is_valid_type(input_class_simple, valid_classes): Returns: bool """ + if issubclass(input_class_simple, OpenApiModel) and \ + valid_classes == (bool, date, datetime, dict, float, int, list, str, none_type,): + return True valid_type = input_class_simple in valid_classes if not valid_type and ( issubclass(input_class_simple, OpenApiModel) or diff --git a/samples/client/petstore/python_disallowAdditionalPropertiesIfNotPresent/petstore_api/model_utils.py b/samples/client/petstore/python_disallowAdditionalPropertiesIfNotPresent/petstore_api/model_utils.py index e7ef88f64f..955ad1cba4 100644 --- a/samples/client/petstore/python_disallowAdditionalPropertiesIfNotPresent/petstore_api/model_utils.py +++ b/samples/client/petstore/python_disallowAdditionalPropertiesIfNotPresent/petstore_api/model_utils.py @@ -1479,6 +1479,9 @@ def is_valid_type(input_class_simple, valid_classes): Returns: bool """ + if issubclass(input_class_simple, OpenApiModel) and \ + valid_classes == (bool, date, datetime, dict, float, int, list, str, none_type,): + return True valid_type = input_class_simple in valid_classes if not valid_type and ( issubclass(input_class_simple, OpenApiModel) or diff --git a/samples/openapi3/client/extensions/x-auth-id-alias/python/x_auth_id_alias/model_utils.py b/samples/openapi3/client/extensions/x-auth-id-alias/python/x_auth_id_alias/model_utils.py index cef4b6c237..5331409b63 100644 --- a/samples/openapi3/client/extensions/x-auth-id-alias/python/x_auth_id_alias/model_utils.py +++ b/samples/openapi3/client/extensions/x-auth-id-alias/python/x_auth_id_alias/model_utils.py @@ -1479,6 +1479,9 @@ def is_valid_type(input_class_simple, valid_classes): Returns: bool """ + if issubclass(input_class_simple, OpenApiModel) and \ + valid_classes == (bool, date, datetime, dict, float, int, list, str, none_type,): + return True valid_type = input_class_simple in valid_classes if not valid_type and ( issubclass(input_class_simple, OpenApiModel) or diff --git a/samples/openapi3/client/features/dynamic-servers/python/dynamic_servers/model_utils.py b/samples/openapi3/client/features/dynamic-servers/python/dynamic_servers/model_utils.py index 2ad3e5bdea..7b10ed60cf 100644 --- a/samples/openapi3/client/features/dynamic-servers/python/dynamic_servers/model_utils.py +++ b/samples/openapi3/client/features/dynamic-servers/python/dynamic_servers/model_utils.py @@ -1479,6 +1479,9 @@ def is_valid_type(input_class_simple, valid_classes): Returns: bool """ + if issubclass(input_class_simple, OpenApiModel) and \ + valid_classes == (bool, date, datetime, dict, float, int, list, str, none_type,): + return True valid_type = input_class_simple in valid_classes if not valid_type and ( issubclass(input_class_simple, OpenApiModel) or diff --git a/samples/openapi3/client/petstore/python/.openapi-generator/FILES b/samples/openapi3/client/petstore/python/.openapi-generator/FILES index 03f7002184..e4ad25ef9d 100644 --- a/samples/openapi3/client/petstore/python/.openapi-generator/FILES +++ b/samples/openapi3/client/petstore/python/.openapi-generator/FILES @@ -59,6 +59,7 @@ docs/IntegerEnum.md docs/IntegerEnumOneValue.md docs/IntegerEnumWithDefaultValue.md docs/IsoscelesTriangle.md +docs/Legs.md docs/List.md docs/Mammal.md docs/MapTest.md @@ -170,6 +171,7 @@ petstore_api/model/integer_enum.py petstore_api/model/integer_enum_one_value.py petstore_api/model/integer_enum_with_default_value.py petstore_api/model/isosceles_triangle.py +petstore_api/model/legs.py petstore_api/model/list.py petstore_api/model/mammal.py petstore_api/model/map_test.py diff --git a/samples/openapi3/client/petstore/python/README.md b/samples/openapi3/client/petstore/python/README.md index e1d6b5e3e3..2316a973ac 100644 --- a/samples/openapi3/client/petstore/python/README.md +++ b/samples/openapi3/client/petstore/python/README.md @@ -187,6 +187,7 @@ Class | Method | HTTP request | Description - [IntegerEnumOneValue](docs/IntegerEnumOneValue.md) - [IntegerEnumWithDefaultValue](docs/IntegerEnumWithDefaultValue.md) - [IsoscelesTriangle](docs/IsoscelesTriangle.md) + - [Legs](docs/Legs.md) - [List](docs/List.md) - [Mammal](docs/Mammal.md) - [MapTest](docs/MapTest.md) diff --git a/samples/openapi3/client/petstore/python/docs/Dog.md b/samples/openapi3/client/petstore/python/docs/Dog.md index a3564c227f..7717736c38 100644 --- a/samples/openapi3/client/petstore/python/docs/Dog.md +++ b/samples/openapi3/client/petstore/python/docs/Dog.md @@ -6,6 +6,7 @@ Name | Type | Description | Notes ------------ | ------------- | ------------- | ------------- **class_name** | **str** | | **breed** | **str** | | [optional] +**legs** | [**Legs**](Legs.md) | | [optional] **color** | **str** | | [optional] if omitted the server will use the default value of "red" **tail** | **bool** | | [optional] [readonly] if omitted the server will use the default value of True **any string name** | **bool, date, datetime, dict, float, int, list, str, none_type** | any string name can be used but the value must be the correct type | [optional] diff --git a/samples/openapi3/client/petstore/python/docs/DogAllOf.md b/samples/openapi3/client/petstore/python/docs/DogAllOf.md index 2907a9fd5c..a12db829f7 100644 --- a/samples/openapi3/client/petstore/python/docs/DogAllOf.md +++ b/samples/openapi3/client/petstore/python/docs/DogAllOf.md @@ -5,6 +5,7 @@ Name | Type | Description | Notes ------------ | ------------- | ------------- | ------------- **breed** | **str** | | [optional] +**legs** | [**Legs**](Legs.md) | | [optional] **any string name** | **bool, date, datetime, dict, float, int, list, str, none_type** | any string name can be used but the value must be the correct type | [optional] [[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) diff --git a/samples/openapi3/client/petstore/python/docs/Legs.md b/samples/openapi3/client/petstore/python/docs/Legs.md new file mode 100644 index 0000000000..e9faeb08ad --- /dev/null +++ b/samples/openapi3/client/petstore/python/docs/Legs.md @@ -0,0 +1,13 @@ +# Legs + + +## Properties +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**legs** | **str** | | defaults to "4" +**name** | **str** | | [optional] +**any string name** | **bool, date, datetime, dict, float, int, list, str, none_type** | any string name can be used but the value must be the correct type | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/samples/openapi3/client/petstore/python/petstore_api/model/dog.py b/samples/openapi3/client/petstore/python/petstore_api/model/dog.py index 671fbe3dae..4e075a3723 100644 --- a/samples/openapi3/client/petstore/python/petstore_api/model/dog.py +++ b/samples/openapi3/client/petstore/python/petstore_api/model/dog.py @@ -32,8 +32,10 @@ from petstore_api.exceptions import ApiAttributeError def lazy_import(): from petstore_api.model.animal import Animal from petstore_api.model.dog_all_of import DogAllOf + from petstore_api.model.legs import Legs globals()['Animal'] = Animal globals()['DogAllOf'] = DogAllOf + globals()['Legs'] = Legs class Dog(ModelComposed): @@ -91,6 +93,7 @@ class Dog(ModelComposed): return { 'class_name': (str,), # noqa: E501 'breed': (str,), # noqa: E501 + 'legs': (Legs,), # noqa: E501 'color': (str,), # noqa: E501 'tail': (bool,), # noqa: E501 } @@ -106,6 +109,7 @@ class Dog(ModelComposed): attribute_map = { 'class_name': 'className', # noqa: E501 'breed': 'breed', # noqa: E501 + 'legs': 'legs', # noqa: E501 'color': 'color', # noqa: E501 'tail': 'tail', # noqa: E501 } @@ -152,6 +156,7 @@ class Dog(ModelComposed): through its discriminator because we passed in _visited_composed_classes = (Animal,) breed (str): [optional] # noqa: E501 + legs (Legs): [optional] # noqa: E501 color (str): [optional] if omitted the server will use the default value of "red" # noqa: E501 tail (bool): [optional] if omitted the server will use the default value of True # noqa: E501 """ @@ -255,6 +260,7 @@ class Dog(ModelComposed): through its discriminator because we passed in _visited_composed_classes = (Animal,) breed (str): [optional] # noqa: E501 + legs (Legs): [optional] # noqa: E501 color (str): [optional] if omitted the server will use the default value of "red" # noqa: E501 tail (bool): [optional] if omitted the server will use the default value of True # noqa: E501 """ diff --git a/samples/openapi3/client/petstore/python/petstore_api/model/dog_all_of.py b/samples/openapi3/client/petstore/python/petstore_api/model/dog_all_of.py index dbc36cb2c8..8e7c1d8f27 100644 --- a/samples/openapi3/client/petstore/python/petstore_api/model/dog_all_of.py +++ b/samples/openapi3/client/petstore/python/petstore_api/model/dog_all_of.py @@ -29,6 +29,10 @@ from ..model_utils import OpenApiModel from petstore_api.exceptions import ApiAttributeError +def lazy_import(): + from petstore_api.model.legs import Legs + globals()['Legs'] = Legs + class DogAllOf(ModelNormal): """NOTE: This class is auto generated by OpenAPI Generator. @@ -66,6 +70,7 @@ class DogAllOf(ModelNormal): This must be a method because a model may have properties that are of type self, this must run after the class is loaded """ + lazy_import() return (bool, date, datetime, dict, float, int, list, str, none_type,) # noqa: E501 _nullable = False @@ -80,8 +85,10 @@ class DogAllOf(ModelNormal): openapi_types (dict): The key is attribute name and the value is attribute type. """ + lazy_import() return { 'breed': (str,), # noqa: E501 + 'legs': (Legs,), # noqa: E501 } @cached_property @@ -91,6 +98,7 @@ class DogAllOf(ModelNormal): attribute_map = { 'breed': 'breed', # noqa: E501 + 'legs': 'legs', # noqa: E501 } read_only_vars = { @@ -135,6 +143,7 @@ class DogAllOf(ModelNormal): through its discriminator because we passed in _visited_composed_classes = (Animal,) breed (str): [optional] # noqa: E501 + legs (Legs): [optional] # noqa: E501 """ _check_type = kwargs.pop('_check_type', True) @@ -217,6 +226,7 @@ class DogAllOf(ModelNormal): through its discriminator because we passed in _visited_composed_classes = (Animal,) breed (str): [optional] # noqa: E501 + legs (Legs): [optional] # noqa: E501 """ _check_type = kwargs.pop('_check_type', True) diff --git a/samples/openapi3/client/petstore/python/petstore_api/model/legs.py b/samples/openapi3/client/petstore/python/petstore_api/model/legs.py new file mode 100644 index 0000000000..57e01527a8 --- /dev/null +++ b/samples/openapi3/client/petstore/python/petstore_api/model/legs.py @@ -0,0 +1,271 @@ +""" + OpenAPI Petstore + + This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\ # noqa: E501 + + The version of the OpenAPI document: 1.0.0 + Generated by: https://openapi-generator.tech +""" + + +import re # noqa: F401 +import sys # noqa: F401 + +from petstore_api.model_utils import ( # noqa: F401 + ApiTypeError, + ModelComposed, + ModelNormal, + ModelSimple, + cached_property, + change_keys_js_to_python, + convert_js_args_to_python_args, + date, + datetime, + file_type, + none_type, + validate_get_composed_info, +) +from ..model_utils import OpenApiModel +from petstore_api.exceptions import ApiAttributeError + + + +class Legs(ModelNormal): + """NOTE: This class is auto generated by OpenAPI Generator. + Ref: https://openapi-generator.tech + + Do not edit the class manually. + + Attributes: + allowed_values (dict): The key is the tuple path to the attribute + and the for var_name this is (var_name,). The value is a dict + with a capitalized key describing the allowed value and an allowed + value. These dicts store the allowed enum values. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + discriminator_value_class_map (dict): A dict to go from the discriminator + variable value to the discriminator class name. + validations (dict): The key is the tuple path to the attribute + and the for var_name this is (var_name,). The value is a dict + that stores validations for max_length, min_length, max_items, + min_items, exclusive_maximum, inclusive_maximum, exclusive_minimum, + inclusive_minimum, and regex. + additional_properties_type (tuple): A tuple of classes accepted + as additional properties values. + """ + + allowed_values = { + ('legs',): { + '2': "2", + '4': "4", + }, + } + + validations = { + } + + @cached_property + def additional_properties_type(): + """ + This must be a method because a model may have properties that are + of type self, this must run after the class is loaded + """ + return (bool, date, datetime, dict, float, int, list, str, none_type,) # noqa: E501 + + _nullable = False + + @cached_property + def openapi_types(): + """ + This must be a method because a model may have properties that are + of type self, this must run after the class is loaded + + Returns + openapi_types (dict): The key is attribute name + and the value is attribute type. + """ + return { + 'legs': (str,), # noqa: E501 + 'name': (str,), # noqa: E501 + } + + @cached_property + def discriminator(): + return None + + + attribute_map = { + 'legs': 'legs', # noqa: E501 + 'name': 'name', # noqa: E501 + } + + read_only_vars = { + } + + _composed_schemas = {} + + @classmethod + @convert_js_args_to_python_args + def _from_openapi_data(cls, *args, **kwargs): # noqa: E501 + """Legs - a model defined in OpenAPI + + Args: + + Keyword Args: + legs (str): defaults to "4", must be one of ["2", "4", ] # noqa: E501 + _check_type (bool): if True, values for parameters in openapi_types + will be type checked and a TypeError will be + raised if the wrong type is input. + Defaults to True + _path_to_item (tuple/list): This is a list of keys or values to + drill down to the model in received_data + when deserializing a response + _spec_property_naming (bool): True if the variable names in the input data + are serialized names, as specified in the OpenAPI document. + False if the variable names in the input data + are pythonic names, e.g. snake case (default) + _configuration (Configuration): the instance to use when + deserializing a file_type parameter. + If passed, type conversion is attempted + If omitted no type conversion is done. + _visited_composed_classes (tuple): This stores a tuple of + classes that we have traveled through so that + if we see that class again we will not use its + discriminator again. + When traveling through a discriminator, the + composed schema that is + is traveled through is added to this set. + For example if Animal has a discriminator + petType and we pass in "Dog", and the class Dog + allOf includes Animal, we move through Animal + once using the discriminator, and pick Dog. + Then in Dog, we will make an instance of the + Animal class but this time we won't travel + through its discriminator because we passed in + _visited_composed_classes = (Animal,) + name (str): [optional] # noqa: E501 + """ + + legs = kwargs.get('legs', "4") + _check_type = kwargs.pop('_check_type', True) + _spec_property_naming = kwargs.pop('_spec_property_naming', False) + _path_to_item = kwargs.pop('_path_to_item', ()) + _configuration = kwargs.pop('_configuration', None) + _visited_composed_classes = kwargs.pop('_visited_composed_classes', ()) + + self = super(OpenApiModel, cls).__new__(cls) + + if args: + raise ApiTypeError( + "Invalid positional arguments=%s passed to %s. Remove those invalid positional arguments." % ( + args, + self.__class__.__name__, + ), + path_to_item=_path_to_item, + valid_classes=(self.__class__,), + ) + + self._data_store = {} + self._check_type = _check_type + self._spec_property_naming = _spec_property_naming + self._path_to_item = _path_to_item + self._configuration = _configuration + self._visited_composed_classes = _visited_composed_classes + (self.__class__,) + + self.legs = legs + for var_name, var_value in kwargs.items(): + if var_name not in self.attribute_map and \ + self._configuration is not None and \ + self._configuration.discard_unknown_keys and \ + self.additional_properties_type is None: + # discard variable. + continue + setattr(self, var_name, var_value) + return self + + required_properties = set([ + '_data_store', + '_check_type', + '_spec_property_naming', + '_path_to_item', + '_configuration', + '_visited_composed_classes', + ]) + + @convert_js_args_to_python_args + def __init__(self, *args, **kwargs): # noqa: E501 + """Legs - a model defined in OpenAPI + + Args: + + Keyword Args: + legs (str): defaults to "4", must be one of ["2", "4", ] # noqa: E501 + _check_type (bool): if True, values for parameters in openapi_types + will be type checked and a TypeError will be + raised if the wrong type is input. + Defaults to True + _path_to_item (tuple/list): This is a list of keys or values to + drill down to the model in received_data + when deserializing a response + _spec_property_naming (bool): True if the variable names in the input data + are serialized names, as specified in the OpenAPI document. + False if the variable names in the input data + are pythonic names, e.g. snake case (default) + _configuration (Configuration): the instance to use when + deserializing a file_type parameter. + If passed, type conversion is attempted + If omitted no type conversion is done. + _visited_composed_classes (tuple): This stores a tuple of + classes that we have traveled through so that + if we see that class again we will not use its + discriminator again. + When traveling through a discriminator, the + composed schema that is + is traveled through is added to this set. + For example if Animal has a discriminator + petType and we pass in "Dog", and the class Dog + allOf includes Animal, we move through Animal + once using the discriminator, and pick Dog. + Then in Dog, we will make an instance of the + Animal class but this time we won't travel + through its discriminator because we passed in + _visited_composed_classes = (Animal,) + name (str): [optional] # noqa: E501 + """ + + legs = kwargs.get('legs', "4") + _check_type = kwargs.pop('_check_type', True) + _spec_property_naming = kwargs.pop('_spec_property_naming', False) + _path_to_item = kwargs.pop('_path_to_item', ()) + _configuration = kwargs.pop('_configuration', None) + _visited_composed_classes = kwargs.pop('_visited_composed_classes', ()) + + if args: + raise ApiTypeError( + "Invalid positional arguments=%s passed to %s. Remove those invalid positional arguments." % ( + args, + self.__class__.__name__, + ), + path_to_item=_path_to_item, + valid_classes=(self.__class__,), + ) + + self._data_store = {} + self._check_type = _check_type + self._spec_property_naming = _spec_property_naming + self._path_to_item = _path_to_item + self._configuration = _configuration + self._visited_composed_classes = _visited_composed_classes + (self.__class__,) + + self.legs = legs + for var_name, var_value in kwargs.items(): + if var_name not in self.attribute_map and \ + self._configuration is not None and \ + self._configuration.discard_unknown_keys and \ + self.additional_properties_type is None: + # discard variable. + continue + setattr(self, var_name, var_value) + if var_name in self.read_only_vars: + raise ApiAttributeError(f"`{var_name}` is a read-only attribute. Use `from_openapi_data` to instantiate " + f"class with read only attributes.") diff --git a/samples/openapi3/client/petstore/python/petstore_api/model_utils.py b/samples/openapi3/client/petstore/python/petstore_api/model_utils.py index e7ef88f64f..955ad1cba4 100644 --- a/samples/openapi3/client/petstore/python/petstore_api/model_utils.py +++ b/samples/openapi3/client/petstore/python/petstore_api/model_utils.py @@ -1479,6 +1479,9 @@ def is_valid_type(input_class_simple, valid_classes): Returns: bool """ + if issubclass(input_class_simple, OpenApiModel) and \ + valid_classes == (bool, date, datetime, dict, float, int, list, str, none_type,): + return True valid_type = input_class_simple in valid_classes if not valid_type and ( issubclass(input_class_simple, OpenApiModel) or diff --git a/samples/openapi3/client/petstore/python/petstore_api/models/__init__.py b/samples/openapi3/client/petstore/python/petstore_api/models/__init__.py index 73209cbd06..b1bc33c518 100644 --- a/samples/openapi3/client/petstore/python/petstore_api/models/__init__.py +++ b/samples/openapi3/client/petstore/python/petstore_api/models/__init__.py @@ -62,6 +62,7 @@ from petstore_api.model.integer_enum import IntegerEnum from petstore_api.model.integer_enum_one_value import IntegerEnumOneValue from petstore_api.model.integer_enum_with_default_value import IntegerEnumWithDefaultValue from petstore_api.model.isosceles_triangle import IsoscelesTriangle +from petstore_api.model.legs import Legs from petstore_api.model.list import List from petstore_api.model.mammal import Mammal from petstore_api.model.map_test import MapTest diff --git a/samples/openapi3/client/petstore/python/test/test_legs.py b/samples/openapi3/client/petstore/python/test/test_legs.py new file mode 100644 index 0000000000..3244bdb749 --- /dev/null +++ b/samples/openapi3/client/petstore/python/test/test_legs.py @@ -0,0 +1,35 @@ +""" + OpenAPI Petstore + + This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\ # noqa: E501 + + The version of the OpenAPI document: 1.0.0 + Generated by: https://openapi-generator.tech +""" + + +import sys +import unittest + +import petstore_api +from petstore_api.model.legs import Legs + + +class TestLegs(unittest.TestCase): + """Legs unit test stubs""" + + def setUp(self): + pass + + def tearDown(self): + pass + + def testLegs(self): + """Test Legs""" + # FIXME: construct object with mandatory attributes with example values + # model = Legs() # noqa: E501 + pass + + +if __name__ == '__main__': + unittest.main() diff --git a/samples/openapi3/client/petstore/python/tests_manual/test_issue10083.py b/samples/openapi3/client/petstore/python/tests_manual/test_issue10083.py new file mode 100755 index 0000000000..b945f178fe --- /dev/null +++ b/samples/openapi3/client/petstore/python/tests_manual/test_issue10083.py @@ -0,0 +1,41 @@ +# coding: utf-8 + +""" + OpenAPI Petstore + + This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\ # noqa: E501 + + The version of the OpenAPI document: 1.0.0 + Generated by: https://openapi-generator.tech +""" + + +import sys +import unittest + +import petstore_api +from petstore_api.model.dog import Dog +from petstore_api.model.legs import Legs + + +class TestSetAttrForComposedSchema(unittest.TestCase): + """TestSetAttrForComposedSchema unit test""" + + def setUp(self): + pass + + def tearDown(self): + pass + + def testSetAttrForComposedSchema(self): + """Test SetAttrForComposedSchema""" + try: + dog_instance = Dog(class_name="Dog", color="Black") + dog_instance.breed = "bulldog" + dog_instance.legs = Legs(legs="4") + except petstore_api.exceptions.ApiTypeError: + self.assertTrue(False) + + +if __name__ == '__main__': + unittest.main()