forked from loafle/openapi-generator-original
* I feel the issue is due to the creation of self._var_name_to_model_instances while doing the deserialization of the data. Earlier the Python SDK code was using get_var_name_to_model_instances function which was adding var name to model instances that contain it. So <class 'openapi_client.model.stream_options_all_of'> will not part of mapping in self._var_name_to_model_instances for variable name stream_options. Now with the latest Python SDK code following is the way through which var_name_to_model_instances is created: for prop_name in model_args: if prop_name not in discarded_args: var_name_to_model_instances[prop_name] = [self] + composed_instances Now as we can see that the var_name_to_model_instances is populated with self and composed_instance which will also contain stream_options_all_of as a composed instance and there will be no check that if stream_options is present in composed_instances or not. As there is no attribute_mapping found for stream_options in stream_options_all_of, the type for stream_options will be treated as dict for mapping stream_options_all_of as mentioned by @Chekov2k. So what I suggest is the following code: for prop_name in model_args: if prop_name not in discarded_args: var_name_to_model_instances[prop_name] = [self] + list( filter( lambda x: prop_name in x.openapi_types, composed_instances)) This way we can check if the property name is present in that composed instance or not. If it's okay for @spacether I can raise a PR for this. * [get_item_all_of_bug] Added samples, test cases to validate all_of schema. * [getiem_all_of_bug] Updated docs and samples. * [getiem_all_of_bug] Updated test cases, docs and samples.
155 lines
5.1 KiB
Python
155 lines
5.1 KiB
Python
# 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
|
|
"""
|
|
|
|
|
|
from __future__ import absolute_import
|
|
import sys
|
|
import unittest
|
|
|
|
import petstore_api
|
|
try:
|
|
from petstore_api.model import child_all_of
|
|
except ImportError:
|
|
child_all_of = sys.modules[
|
|
'petstore_api.model.child_all_of']
|
|
try:
|
|
from petstore_api.model import parent
|
|
except ImportError:
|
|
parent = sys.modules[
|
|
'petstore_api.model.parent']
|
|
from petstore_api.model.child import Child
|
|
|
|
|
|
class TestChild(unittest.TestCase):
|
|
"""Child unit test stubs"""
|
|
|
|
def setUp(self):
|
|
pass
|
|
|
|
def tearDown(self):
|
|
pass
|
|
|
|
def testChild(self):
|
|
"""Test Child"""
|
|
|
|
# make an instance of Child, a composed schema model
|
|
radio_waves = True
|
|
tele_vision = True
|
|
inter_net = True
|
|
child = Child(
|
|
radio_waves=radio_waves,
|
|
tele_vision=tele_vision,
|
|
inter_net=inter_net
|
|
)
|
|
|
|
# check its properties
|
|
self.assertEqual(child.radio_waves, radio_waves)
|
|
self.assertEqual(child.tele_vision, tele_vision)
|
|
self.assertEqual(child.inter_net, inter_net)
|
|
# access them with keys
|
|
self.assertEqual(child['radio_waves'], radio_waves)
|
|
self.assertEqual(child['tele_vision'], tele_vision)
|
|
self.assertEqual(child['inter_net'], inter_net)
|
|
# access them with getattr
|
|
self.assertEqual(getattr(child, 'radio_waves'), radio_waves)
|
|
self.assertEqual(getattr(child, 'tele_vision'), tele_vision)
|
|
self.assertEqual(getattr(child, 'inter_net'), inter_net)
|
|
|
|
# check the model's to_dict result
|
|
self.assertEqual(
|
|
child.to_dict(),
|
|
{
|
|
'radio_waves': radio_waves,
|
|
'tele_vision': tele_vision,
|
|
'inter_net': inter_net,
|
|
}
|
|
)
|
|
|
|
# with hasattr
|
|
self.assertFalse(hasattr(child, 'invalid_variable'))
|
|
|
|
# getting a value that doesn't exist raises an exception
|
|
# with a key
|
|
with self.assertRaises(petstore_api.ApiAttributeError):
|
|
invalid_variable = child['invalid_variable']
|
|
# with getattr
|
|
self.assertEqual(getattr(child, 'invalid_variable', 'some value'), 'some value')
|
|
|
|
with self.assertRaises(petstore_api.ApiAttributeError):
|
|
invalid_variable = getattr(child, 'invalid_variable')
|
|
|
|
# make sure that the ModelComposed class properties are correct
|
|
# model.composed_schemas() stores the anyOf/allOf/oneOf info
|
|
self.assertEqual(
|
|
child._composed_schemas,
|
|
{
|
|
'anyOf': [],
|
|
'allOf': [
|
|
child_all_of.ChildAllOf,
|
|
parent.Parent,
|
|
],
|
|
'oneOf': [],
|
|
}
|
|
)
|
|
# model._composed_instances is a list of the instances that were
|
|
# made from the anyOf/allOf/OneOf classes in model._composed_schemas()
|
|
for composed_instance in child._composed_instances:
|
|
if composed_instance.__class__ == parent.Parent:
|
|
parent_instance = composed_instance
|
|
elif composed_instance.__class__ == child_all_of.ChildAllOf:
|
|
child_allof_instance = composed_instance
|
|
self.assertEqual(
|
|
child._composed_instances,
|
|
[child_allof_instance, parent_instance]
|
|
)
|
|
# model._var_name_to_model_instances maps the variable name to the
|
|
# model instances which store that variable
|
|
self.assertEqual(
|
|
child._var_name_to_model_instances,
|
|
{
|
|
'radio_waves': [child, parent_instance],
|
|
'tele_vision': [child, parent_instance],
|
|
'inter_net': [child, child_allof_instance]
|
|
}
|
|
)
|
|
# model._additional_properties_model_instances stores a list of
|
|
# models which have the property additional_properties_type != None
|
|
self.assertEqual(
|
|
child._additional_properties_model_instances, [child]
|
|
)
|
|
|
|
# setting a value that doesn't exist works
|
|
# with a key
|
|
child['invalid_variable'] = 'a'
|
|
assert child.invalid_variable == 'a'
|
|
# with setattr
|
|
setattr(child, 'invalid_variable', 'b')
|
|
assert child.invalid_variable == 'b'
|
|
|
|
|
|
# if we modify one of the properties owned by multiple
|
|
# model_instances we get an exception when we try to access that
|
|
# property because the retrieved values are not all the same
|
|
child_allof_instance.inter_net = False
|
|
with self.assertRaises(petstore_api.ApiValueError):
|
|
inter_net = child.inter_net
|
|
|
|
# including extra parameters works
|
|
child = Child(
|
|
radio_waves=radio_waves,
|
|
tele_vision=tele_vision,
|
|
inter_net=inter_net,
|
|
unknown_property='some value')
|
|
assert child.unknown_property == 'some value'
|
|
|
|
if __name__ == '__main__':
|
|
unittest.main()
|