def test_retries_failing_properties_while_making_progress(self, mocker):
        from openapi_python_client.parser.properties import Schemas, build_schemas
        from openapi_python_client.schema import Schema

        components = {
            "first": Schema.construct(),
            "second": Schema.construct()
        }
        update_schemas_with_data = mocker.patch(
            f"{MODULE_NAME}.update_schemas_with_data",
            side_effect=[PropertyError(),
                         Schemas(),
                         PropertyError()])
        parse_reference_path = mocker.patch(
            f"{MODULE_NAME}.parse_reference_path")
        config = Config()

        result = build_schemas(components=components,
                               schemas=Schemas(),
                               config=config)
        parse_reference_path.assert_has_calls([
            call("#/components/schemas/first"),
            call("#/components/schemas/second"),
            call("#/components/schemas/first"),
        ])
        assert update_schemas_with_data.call_count == 3
        assert result.errors == [PropertyError()]
    def test_records_bad_uris_and_keeps_going(self, mocker):
        from openapi_python_client.parser.properties import Schemas, build_schemas
        from openapi_python_client.schema import Schema

        components = {
            "first": Schema.construct(),
            "second": Schema.construct()
        }
        update_schemas_with_data = mocker.patch(
            f"{MODULE_NAME}.update_schemas_with_data")
        parse_reference_path = mocker.patch(
            f"{MODULE_NAME}.parse_reference_path",
            side_effect=[PropertyError(detail="some details"), "a_path"])
        config = Config()

        result = build_schemas(components=components,
                               schemas=Schemas(),
                               config=config)
        parse_reference_path.assert_has_calls([
            call("#/components/schemas/first"),
            call("#/components/schemas/second"),
        ])
        update_schemas_with_data.assert_called_once_with(
            ref_path="a_path",
            config=config,
            data=components["second"],
            schemas=Schemas(errors=[
                PropertyError(detail="some details", data=components["first"])
            ]),
        )
        assert result == update_schemas_with_data.return_value
    def test_skips_references_and_keeps_going(self, mocker):
        from openapi_python_client.parser.properties import Schemas, build_schemas
        from openapi_python_client.schema import Reference, Schema

        components = {
            "a_ref": Reference.construct(),
            "a_schema": Schema.construct()
        }
        update_schemas_with_data = mocker.patch(
            f"{MODULE_NAME}.update_schemas_with_data")
        parse_reference_path = mocker.patch(
            f"{MODULE_NAME}.parse_reference_path")
        config = Config()

        result = build_schemas(components=components,
                               schemas=Schemas(),
                               config=config)
        # Should not even try to parse a path for the Reference
        parse_reference_path.assert_called_once_with(
            "#/components/schemas/a_schema")
        update_schemas_with_data.assert_called_once_with(
            ref_path=parse_reference_path.return_value,
            config=config,
            data=components["a_schema"],
            schemas=Schemas(errors=[
                PropertyError(detail="Reference schemas are not supported.",
                              data=components["a_ref"])
            ]),
        )
        assert result == update_schemas_with_data.return_value
    def test_property_from_data_int_enum(self, enum_property_factory):
        from openapi_python_client.parser.properties import Class, Schemas, property_from_data
        from openapi_python_client.schema import Schema

        name = "my_enum"
        required = True
        nullable = False
        data = Schema.construct(title="anEnum", enum=[1, 2, 3], nullable=nullable, default=3)

        existing = enum_property_factory()
        schemas = Schemas(classes_by_name={"AnEnum": existing})

        prop, new_schemas = property_from_data(
            name=name, required=required, data=data, schemas=schemas, parent_name="parent", config=Config()
        )

        assert prop == enum_property_factory(
            name=name,
            required=required,
            nullable=nullable,
            values={"VALUE_1": 1, "VALUE_2": 2, "VALUE_3": 3},
            class_info=Class(name="ParentAnEnum", module_name="parent_an_enum"),
            value_type=int,
            default="ParentAnEnum.VALUE_3",
        )
        assert schemas != new_schemas, "Provided Schemas was mutated"
        assert new_schemas.classes_by_name == {
            "AnEnum": existing,
            "ParentAnEnum": prop,
        }
    def test_property_from_data_str_enum_with_null(self, enum_property_factory):
        from openapi_python_client.parser.properties import Class, Schemas, property_from_data
        from openapi_python_client.schema import Schema

        existing = enum_property_factory()
        data = Schema(title="AnEnum", enum=["A", "B", "C", None], nullable=False, default="B")
        name = "my_enum"
        required = True

        schemas = Schemas(classes_by_name={"AnEnum": existing})

        prop, new_schemas = property_from_data(
            name=name, required=required, data=data, schemas=schemas, parent_name="parent", config=Config()
        )

        # None / null is removed from enum, and property is now nullable
        assert prop == enum_property_factory(
            name=name,
            required=required,
            nullable=True,
            values={"A": "A", "B": "B", "C": "C"},
            class_info=Class(name="ParentAnEnum", module_name="parent_an_enum"),
            value_type=str,
            default="ParentAnEnum.B",
        )
        assert prop.nullable is True
        assert schemas != new_schemas, "Provided Schemas was mutated"
        assert new_schemas.classes_by_name == {
            "AnEnum": existing,
            "ParentAnEnum": prop,
        }
    def test_property_from_data_str_enum(self, mocker):
        from openapi_python_client.parser.properties import Class, EnumProperty
        from openapi_python_client.schema import Schema

        data = Schema(title="AnEnum", enum=["A", "B", "C"], nullable=False, default="B")
        name = "my_enum"
        required = True

        from openapi_python_client.parser.properties import Schemas, property_from_data

        schemas = Schemas(classes_by_name={"AnEnum": mocker.MagicMock()})

        prop, new_schemas = property_from_data(
            name=name, required=required, data=data, schemas=schemas, parent_name="parent", config=Config()
        )

        assert prop == EnumProperty(
            name="my_enum",
            required=True,
            nullable=False,
            values={"A": "A", "B": "B", "C": "C"},
            class_info=Class(name="ParentAnEnum", module_name="parent_an_enum"),
            value_type=str,
            default="ParentAnEnum.B",
        )
        assert schemas != new_schemas, "Provided Schemas was mutated"
        assert new_schemas.classes_by_name == {
            "AnEnum": schemas.classes_by_name["AnEnum"],
            "ParentAnEnum": prop,
        }
Esempio n. 7
0
    def test_property_from_data_int_enum(self, mocker):
        from openapi_python_client.parser.properties import EnumProperty, Reference
        from openapi_python_client.schema import Schema

        data = Schema.construct(title="anEnum", enum=[1, 2, 3], nullable=False, default=3)
        name = "my_enum"
        required = True

        from openapi_python_client.parser.properties import Schemas, property_from_data

        schemas = Schemas(enums={"AnEnum": mocker.MagicMock()})

        prop, new_schemas = property_from_data(
            name=name, required=required, data=data, schemas=schemas, parent_name="parent"
        )

        assert prop == EnumProperty(
            name="my_enum",
            required=True,
            nullable=False,
            values={"VALUE_1": 1, "VALUE_2": 2, "VALUE_3": 3},
            reference=Reference(class_name="ParentAnEnum", module_name="parent_an_enum"),
            value_type=int,
            default="ParentAnEnum.VALUE_3",
        )
        assert schemas != new_schemas, "Provided Schemas was mutated"
        assert new_schemas.enums == {
            "AnEnum": schemas.enums["AnEnum"],
            "ParentAnEnum": prop,
        }
    def test_property_from_data_null_enum(self, enum_property_factory, none_property_factory):
        from openapi_python_client.parser.properties import Class, Schemas, property_from_data
        from openapi_python_client.schema import Schema

        data = Schema(title="AnEnumWithOnlyNull", enum=[None], nullable=False, default=None)
        name = "my_enum"
        required = True

        schemas = Schemas()

        prop, new_schemas = property_from_data(
            name=name, required=required, data=data, schemas=schemas, parent_name="parent", config=Config()
        )

        assert prop == none_property_factory(name="my_enum", required=required, nullable=False, default="None")