|
2 | 2 |
|
3 | 3 | import openapi_python_client.schema as oai |
4 | 4 | from openapi_python_client.parser.errors import PropertyError, ValidationError |
5 | | -from openapi_python_client.parser.properties import BooleanProperty, FloatProperty, IntProperty |
| 5 | +from openapi_python_client.parser.properties import ( |
| 6 | + BooleanProperty, |
| 7 | + DateTimeProperty, |
| 8 | + FloatProperty, |
| 9 | + IntProperty, |
| 10 | + ModelProperty, |
| 11 | + StringProperty, |
| 12 | +) |
| 13 | +from openapi_python_client.parser.reference import Reference |
6 | 14 |
|
7 | 15 | MODULE_NAME = "openapi_python_client.parser.properties" |
8 | 16 |
|
@@ -689,6 +697,25 @@ def test_property_from_data_array(self, mocker): |
689 | 697 | data=data, name=name, required=required, schemas=schemas, parent_name="parent" |
690 | 698 | ) |
691 | 699 |
|
| 700 | + def test_property_from_data_object(self, mocker): |
| 701 | + from openapi_python_client.parser.properties import Schemas, property_from_data |
| 702 | + |
| 703 | + name = mocker.MagicMock() |
| 704 | + required = mocker.MagicMock() |
| 705 | + data = oai.Schema( |
| 706 | + type="object", |
| 707 | + ) |
| 708 | + build_model_property = mocker.patch(f"{MODULE_NAME}.build_model_property") |
| 709 | + mocker.patch("openapi_python_client.utils.remove_string_escapes", return_value=name) |
| 710 | + schemas = Schemas() |
| 711 | + |
| 712 | + response = property_from_data(name=name, required=required, data=data, schemas=schemas, parent_name="parent") |
| 713 | + |
| 714 | + assert response == build_model_property.return_value |
| 715 | + build_model_property.assert_called_once_with( |
| 716 | + data=data, name=name, required=required, schemas=schemas, parent_name="parent" |
| 717 | + ) |
| 718 | + |
692 | 719 | def test_property_from_data_union(self, mocker): |
693 | 720 | from openapi_python_client.parser.properties import Schemas, property_from_data |
694 | 721 |
|
@@ -1010,3 +1037,108 @@ def test_build_enums(mocker): |
1010 | 1037 |
|
1011 | 1038 | build_enum_property.assert_called() |
1012 | 1039 | build_model_property.assert_not_called() |
| 1040 | + |
| 1041 | + |
| 1042 | +def test_build_model_property(): |
| 1043 | + from openapi_python_client.parser.properties import Schemas, build_model_property |
| 1044 | + |
| 1045 | + data = oai.Schema.construct( |
| 1046 | + required=["req"], |
| 1047 | + title="MyModel", |
| 1048 | + properties={ |
| 1049 | + "req": oai.Schema.construct(type="string"), |
| 1050 | + "opt": oai.Schema(type="string", format="date-time"), |
| 1051 | + }, |
| 1052 | + description="A class called MyModel", |
| 1053 | + nullable=False, |
| 1054 | + ) |
| 1055 | + schemas = Schemas(models={"OtherModel": None}) |
| 1056 | + |
| 1057 | + model, new_schemas = build_model_property( |
| 1058 | + data=data, |
| 1059 | + name="prop", |
| 1060 | + schemas=schemas, |
| 1061 | + required=True, |
| 1062 | + parent_name="parent", |
| 1063 | + ) |
| 1064 | + |
| 1065 | + assert new_schemas != schemas |
| 1066 | + assert new_schemas.models == { |
| 1067 | + "OtherModel": None, |
| 1068 | + "ParentMyModel": model, |
| 1069 | + } |
| 1070 | + assert model == ModelProperty( |
| 1071 | + name="prop", |
| 1072 | + required=True, |
| 1073 | + nullable=False, |
| 1074 | + default=None, |
| 1075 | + reference=Reference(class_name="ParentMyModel", module_name="parent_my_model"), |
| 1076 | + required_properties=[StringProperty(name="req", required=True, nullable=False, default=None)], |
| 1077 | + optional_properties=[DateTimeProperty(name="opt", required=True, nullable=False, default=None)], |
| 1078 | + description=data.description, |
| 1079 | + relative_imports={"from dateutil.parser import isoparse", "from typing import cast", "import datetime"}, |
| 1080 | + ) |
| 1081 | + |
| 1082 | + |
| 1083 | +def test_build_model_property_bad_prop(): |
| 1084 | + from openapi_python_client.parser.properties import Schemas, build_model_property |
| 1085 | + |
| 1086 | + data = oai.Schema( |
| 1087 | + properties={ |
| 1088 | + "bad": oai.Schema(type="not_real"), |
| 1089 | + }, |
| 1090 | + ) |
| 1091 | + schemas = Schemas(models={"OtherModel": None}) |
| 1092 | + |
| 1093 | + err, new_schemas = build_model_property( |
| 1094 | + data=data, |
| 1095 | + name="prop", |
| 1096 | + schemas=schemas, |
| 1097 | + required=True, |
| 1098 | + parent_name=None, |
| 1099 | + ) |
| 1100 | + |
| 1101 | + assert new_schemas == schemas |
| 1102 | + assert err == PropertyError(detail="unknown type not_real", data=oai.Schema(type="not_real")) |
| 1103 | + |
| 1104 | + |
| 1105 | +def test_build_enum_property_conflict(mocker): |
| 1106 | + from openapi_python_client.parser.properties import Schemas, build_enum_property |
| 1107 | + |
| 1108 | + data = oai.Schema() |
| 1109 | + schemas = Schemas(enums={"Existing": mocker.MagicMock()}) |
| 1110 | + |
| 1111 | + err, schemas = build_enum_property( |
| 1112 | + data=data, name="Existing", required=True, schemas=schemas, enum=[], parent_name=None |
| 1113 | + ) |
| 1114 | + |
| 1115 | + assert schemas == schemas |
| 1116 | + assert err == PropertyError(detail="Found conflicting enums named Existing with incompatible values.", data=data) |
| 1117 | + |
| 1118 | + |
| 1119 | +def test_build_enum_property_no_values(): |
| 1120 | + from openapi_python_client.parser.properties import Schemas, build_enum_property |
| 1121 | + |
| 1122 | + data = oai.Schema() |
| 1123 | + schemas = Schemas() |
| 1124 | + |
| 1125 | + err, schemas = build_enum_property( |
| 1126 | + data=data, name="Existing", required=True, schemas=schemas, enum=[], parent_name=None |
| 1127 | + ) |
| 1128 | + |
| 1129 | + assert schemas == schemas |
| 1130 | + assert err == PropertyError(detail="No values provided for Enum", data=data) |
| 1131 | + |
| 1132 | + |
| 1133 | +def test_build_enum_property_bad_default(): |
| 1134 | + from openapi_python_client.parser.properties import Schemas, build_enum_property |
| 1135 | + |
| 1136 | + data = oai.Schema(default="B") |
| 1137 | + schemas = Schemas() |
| 1138 | + |
| 1139 | + err, schemas = build_enum_property( |
| 1140 | + data=data, name="Existing", required=True, schemas=schemas, enum=["A"], parent_name=None |
| 1141 | + ) |
| 1142 | + |
| 1143 | + assert schemas == schemas |
| 1144 | + assert err == PropertyError(detail="B is an invalid default for enum Existing", data=data) |
0 commit comments