Exemple #1
0
    def test_get_type_string(self):
        from openapi_python_client.parser.properties import StringProperty

        p = StringProperty(name="test", required=True, default=None)

        assert p.get_type_string() == "str"
        p.required = False
        assert p.get_type_string() == "Optional[str]"
Exemple #2
0
    def test__validate_default(self):
        from openapi_python_client.parser.properties import StringProperty

        p = StringProperty(name="a name",
                           required=True,
                           default="the default value")
        assert p.default == '"the default value"'
Exemple #3
0
def test_response_from_data_property(mocker):
    from openapi_python_client.parser import responses

    prop = StringProperty(name="prop",
                          required=True,
                          nullable=False,
                          default=None)
    property_from_data = mocker.patch.object(responses,
                                             "property_from_data",
                                             return_value=(prop, Schemas()))
    data = oai.Response.construct(
        description="",
        content={
            "application/json":
            oai.MediaType.construct(media_type_schema="something")
        })
    response, schemas = responses.response_from_data(status_code=400,
                                                     data=data,
                                                     schemas=Schemas(),
                                                     parent_name="parent")

    assert response == responses.Response(
        status_code=400,
        prop=prop,
        source="response.json()",
    )
    property_from_data.assert_called_once_with(name="response_400",
                                               required=True,
                                               data="something",
                                               schemas=Schemas(),
                                               parent_name="parent")
Exemple #4
0
def string_property(**kwargs) -> StringProperty:
    kwargs = {
        "name": "",
        "required": True,
        "nullable": True,
        "default": None,
        **kwargs,
    }
    return StringProperty(**kwargs)
    def test__string_based_property_unsupported_format(self, mocker):
        from openapi_python_client.parser.properties import StringProperty, _string_based_property

        name = "unknown"
        required = True
        data = oai.Schema.construct(type="string", schema_format="blah", nullable=True)

        p = _string_based_property(name=name, required=required, data=data)

        assert p == StringProperty(name=name, required=required, nullable=True, default=None)
Exemple #6
0
    def test__string_based_property_no_format(self, mocker):
        name = mocker.MagicMock()
        required = mocker.MagicMock()
        data = oai.Schema.construct(type="string")
        StringProperty = mocker.patch(f"{MODULE_NAME}.StringProperty")

        from openapi_python_client.parser.properties import _string_based_property

        p = _string_based_property(name=name, required=required, data=data)

        StringProperty.assert_called_once_with(name=name,
                                               required=required,
                                               pattern=None,
                                               default=None)
        assert p == StringProperty.return_value

        # Test optional values
        StringProperty.reset_mock()
        data.default = mocker.MagicMock()
        data.pattern = mocker.MagicMock()

        _string_based_property(
            name=name,
            required=required,
            data=data,
        )
        StringProperty.assert_called_once_with(name=name,
                                               required=required,
                                               pattern=data.pattern,
                                               default=data.default)
    def test__string_based_property_no_format(self):
        from openapi_python_client.parser.properties import StringProperty

        name = "some_prop"
        required = True
        data = oai.Schema.construct(type="string", nullable=True, default='"hello world"')

        from openapi_python_client.parser.properties import _string_based_property

        p = _string_based_property(name=name, required=required, data=data)

        assert p == StringProperty(name=name, required=required, nullable=True, default="'\\\\\"hello world\\\\\"'")

        data.pattern = "abcdef"
        data.nullable = False

        p = _string_based_property(
            name=name,
            required=required,
            data=data,
        )
        assert p == StringProperty(
            name=name, required=required, nullable=False, default="'\\\\\"hello world\\\\\"'", pattern="abcdef"
        )
def test_build_model_property(additional_properties_schema, expected_additional_properties):
    from openapi_python_client.parser.properties import Schemas, build_model_property

    data = oai.Schema.construct(
        required=["req"],
        title="MyModel",
        properties={
            "req": oai.Schema.construct(type="string"),
            "opt": oai.Schema(type="string", format="date-time"),
        },
        description="A class called MyModel",
        nullable=False,
        additionalProperties=additional_properties_schema,
    )
    schemas = Schemas(models={"OtherModel": None})

    model, new_schemas = build_model_property(
        data=data,
        name="prop",
        schemas=schemas,
        required=True,
        parent_name="parent",
    )

    assert new_schemas != schemas
    assert new_schemas.models == {
        "OtherModel": None,
        "ParentMyModel": model,
    }
    assert model == ModelProperty(
        name="prop",
        required=True,
        nullable=False,
        default=None,
        reference=Reference(class_name="ParentMyModel", module_name="parent_my_model"),
        required_properties=[StringProperty(name="req", required=True, nullable=False, default=None)],
        optional_properties=[DateTimeProperty(name="opt", required=False, nullable=False, default=None)],
        description=data.description,
        relative_imports={
            "from dateutil.parser import isoparse",
            "from typing import cast",
            "import datetime",
            "from ..types import UNSET, Unset",
            "from typing import Union",
        },
        additional_properties=expected_additional_properties,
    )
Exemple #9
0
    def test_conflicting_properties_different_types(self, model_property_factory):
        from openapi_python_client.parser.properties import Schemas
        from openapi_python_client.parser.properties.model_property import _process_properties

        data = oai.Schema.construct(
            allOf=[oai.Reference.construct(ref="#/First"), oai.Reference.construct(ref="#/Second")]
        )
        schemas = Schemas(
            classes_by_reference={
                "/First": model_property_factory(
                    optional_properties=[StringProperty(name="prop", required=True, nullable=True, default=None)]
                ),
                "/Second": model_property_factory(
                    optional_properties=[DateTimeProperty(name="prop", required=True, nullable=True, default=None)]
                ),
            }
        )

        result = _process_properties(data=data, schemas=schemas, class_name="", config=Config())

        assert isinstance(result, PropertyError)
class TestBuildModelProperty:
    @pytest.mark.parametrize(
        "additional_properties_schema, expected_additional_properties",
        [
            (True, True),
            (oai.Schema.construct(), True),
            (None, True),
            (False, False),
            (
                oai.Schema.construct(type="string"),
                StringProperty(
                    name="AdditionalProperty",
                    required=True,
                    nullable=False,
                    default=None,
                    python_name="additional_property",
                ),
            ),
        ],
    )
    def test_additional_schemas(self, additional_properties_schema,
                                expected_additional_properties):
        from openapi_python_client.parser.properties import Schemas, build_model_property

        data = oai.Schema.construct(
            additionalProperties=additional_properties_schema, )

        model, _ = build_model_property(data=data,
                                        name="prop",
                                        schemas=Schemas(),
                                        required=True,
                                        parent_name="parent",
                                        config=MagicMock())

        assert model.additional_properties == expected_additional_properties

    def test_happy_path(self, model_property_factory, string_property_factory,
                        date_time_property_factory):
        from openapi_python_client.parser.properties import Class, Schemas, build_model_property

        name = "prop"
        nullable = False
        required = True

        data = oai.Schema.construct(
            required=["req"],
            title="MyModel",
            properties={
                "req": oai.Schema.construct(type="string"),
                "opt": oai.Schema(type="string", format="date-time"),
            },
            description="A class called MyModel",
            nullable=nullable,
        )
        schemas = Schemas(classes_by_reference={"OtherModel": None},
                          classes_by_name={"OtherModel": None})

        model, new_schemas = build_model_property(data=data,
                                                  name=name,
                                                  schemas=schemas,
                                                  required=required,
                                                  parent_name="parent",
                                                  config=Config())

        assert new_schemas != schemas
        assert new_schemas.classes_by_name == {
            "OtherModel": None,
            "ParentMyModel": model,
        }
        assert new_schemas.classes_by_reference == {
            "OtherModel": None,
        }
        assert model == model_property_factory(
            name=name,
            required=required,
            nullable=nullable,
            class_info=Class(name="ParentMyModel",
                             module_name="parent_my_model"),
            required_properties=[
                string_property_factory(name="req", required=True)
            ],
            optional_properties=[
                date_time_property_factory(name="opt", required=False)
            ],
            description=data.description,
            relative_imports={
                "from dateutil.parser import isoparse",
                "from typing import cast",
                "import datetime",
                "from ..types import UNSET, Unset",
                "from typing import Union",
            },
            additional_properties=True,
        )

    def test_model_name_conflict(self):
        from openapi_python_client.parser.properties import Schemas, build_model_property

        data = oai.Schema.construct()
        schemas = Schemas(classes_by_name={"OtherModel": None})

        err, new_schemas = build_model_property(data=data,
                                                name="OtherModel",
                                                schemas=schemas,
                                                required=True,
                                                parent_name=None,
                                                config=Config())

        assert new_schemas == schemas
        assert err == PropertyError(
            detail=
            'Attempted to generate duplicate models with name "OtherModel"',
            data=data)

    def test_bad_props_return_error(self):
        from openapi_python_client.parser.properties import Schemas, build_model_property

        data = oai.Schema(properties={
            "bad": oai.Schema(type="not_real"),
        }, )
        schemas = Schemas()

        err, new_schemas = build_model_property(data=data,
                                                name="prop",
                                                schemas=schemas,
                                                required=True,
                                                parent_name=None,
                                                config=MagicMock())

        assert new_schemas == schemas
        assert err == PropertyError(detail="unknown type not_real",
                                    data=oai.Schema(type="not_real"))

    def test_bad_additional_props_return_error(self):
        from openapi_python_client.parser.properties import Config, Schemas, build_model_property

        additional_properties = oai.Schema(
            type="object",
            properties={
                "bad": oai.Schema(type="not_real"),
            },
        )
        data = oai.Schema(additionalProperties=additional_properties)
        schemas = Schemas()

        err, new_schemas = build_model_property(data=data,
                                                name="prop",
                                                schemas=schemas,
                                                required=True,
                                                parent_name=None,
                                                config=Config())

        assert new_schemas == schemas
        assert err == PropertyError(detail="unknown type not_real",
                                    data=oai.Schema(type="not_real"))
    def test_get_type_string(self):
        from openapi_python_client.parser.properties import StringProperty

        p = StringProperty(name="test", required=True, default=None, nullable=False)

        base_type_string = f"str"

        assert p.get_type_string() == base_type_string
        assert p.get_type_string(json=True) == base_type_string

        p = StringProperty(name="test", required=True, default=None, nullable=True)
        assert p.get_type_string() == f"Optional[{base_type_string}]"

        p = StringProperty(name="test", required=False, default=None, nullable=True)
        assert p.get_type_string() == f"Union[Unset, None, {base_type_string}]"

        p = StringProperty(name="test", required=False, default=None, nullable=False)
        assert p.get_type_string() == f"Union[Unset, {base_type_string}]"
    build_schemas(components=in_data)

    build_enum_property.assert_called()
    build_model_property.assert_not_called()


@pytest.mark.parametrize(
    "additional_properties_schema, expected_additional_properties",
    [
        (True, True),
        (oai.Schema.construct(), True),
        (None, True),
        (False, False),
        (
            oai.Schema.construct(type="string"),
            StringProperty(name="AdditionalProperty", required=True, nullable=False, default=None),
        ),
    ],
)
def test_build_model_property(additional_properties_schema, expected_additional_properties):
    from openapi_python_client.parser.properties import Schemas, build_model_property

    data = oai.Schema.construct(
        required=["req"],
        title="MyModel",
        properties={
            "req": oai.Schema.construct(type="string"),
            "opt": oai.Schema(type="string", format="date-time"),
        },
        description="A class called MyModel",
        nullable=False,
 def _factory(**kwargs):
     kwargs = _common_kwargs(kwargs)
     return StringProperty(**kwargs)