def test_walk_pattern_properties_with_primitive(primitive_type):
    test_schema = {"patternProperties": {"a": primitive_type}}
    flattener = JsonSchemaFlattener({})
    result = flattener._walk(test_schema, ())

    assert result == test_schema
    assert not flattener._schema_map
def test_walk_array_items_with_primitive(primitive_type):
    test_schema = {"type": "array", "items": primitive_type}
    flattener = JsonSchemaFlattener({})
    result = flattener._walk(test_schema, ())

    assert result == test_schema
    assert not flattener._schema_map
def test_walk_ref_to_ref_to_primitive(primitive_type):
    test_schema = {"b": {"$ref": "#/c"}, "c": primitive_type}
    flattener = JsonSchemaFlattener(test_schema)
    result = flattener._walk({"$ref": "#/b"}, ())

    assert result == primitive_type
    assert not flattener._schema_map
def test_walk_path_already_processed(path):
    flattener = JsonSchemaFlattener({})
    flattener._schema_map = {path: {}}
    result = flattener._walk({}, path)

    assert result == {"$ref": path}
    assert len(flattener._schema_map) == 1
def test_circular_reference_nested():
    test_schema = {
        "properties": {
            "a": {
                "properties": {
                    "b": {
                        "type": "string"
                    },
                    "c": {
                        "$ref": "#/properties/a"
                    }
                }
            }
        }
    }
    flattener = JsonSchemaFlattener(test_schema)
    flattened = flattener._walk({"$ref": "#/properties/a"}, ())

    assert flattened == {"$ref": ("properties", "a")}
    assert flattener._schema_map[("properties", "a")] == {
        "properties": {
            "b": {
                "type": "string"
            },
            "c": {
                "$ref": ("properties", "a")
            }
        }
    }
def test_walk_object(path):
    test_schema = {"properties": {"a": {}}}
    flattener = JsonSchemaFlattener({})
    result = flattener._walk(test_schema, path)

    assert result == {"$ref": path}
    assert len(flattener._schema_map) == 1
    assert flattener._schema_map[path] == test_schema
def test_walk_ref_to_ref_object():
    test_schema = {"b": {"$ref": "#/c"}, "c": {"properties": {"a": {}}}}
    flattener = JsonSchemaFlattener(test_schema)
    result = flattener._walk({"$ref": "#/b"}, ())

    assert result == {"$ref": ("c", )}
    assert len(flattener._schema_map) == 1
    assert flattener._schema_map[("c", )] == {"properties": {"a": {}}}
def test_walk_ref_to_object():
    test_schema = {"a": {"properties": {"b": {}}}}

    flattener = JsonSchemaFlattener(test_schema)
    flattened = flattener._walk({"$ref": "#/a"}, ())

    assert flattened == {"$ref": ("a", )}
    assert len(flattener._schema_map) == 1
    assert flattener._schema_map[("a", )] == {"properties": {"b": {}}}
def test_walk_pattern_properties_with_object(path):
    test_schema = {"patternProperties": {"a": {"properties": {"b": {}}}}}
    flattener = JsonSchemaFlattener({})
    result = flattener._walk(test_schema, path)

    ref_path = path + ("patternProperties", "a")

    assert result == {"patternProperties": {"a": {"$ref": ref_path}}}
    assert len(flattener._schema_map) == 1
    assert flattener._schema_map[ref_path] == {"properties": {"b": {}}}
def test_walk_array_items_with_object(path):
    test_schema = {"type": "array", "items": {"properties": {"b": {}}}}
    flattener = JsonSchemaFlattener({})
    result = flattener._walk(test_schema, path)

    ref_path = path + ("items", )

    expected_schema = {"type": "array", "items": {"$ref": ref_path}}

    assert result == expected_schema
    assert len(flattener._schema_map) == 1
    assert flattener._schema_map[ref_path] == {"properties": {"b": {}}}
def test_circular_reference_indirect():
    test_schema = {
        "properties": {
            "a": {
                "$ref": "#/properties/b"
            },
            "b": {
                "$ref": "#/properties/c"
            },
            "c": {
                "$ref": "#/properties/a"
            },
        }
    }
    flattener = JsonSchemaFlattener(test_schema)
    flattened_a = flattener._walk({"$ref": "#/properties/a"}, ())
    flattened_b = flattener._walk({"$ref": "#/properties/b"}, ())
    flattened_c = flattener._walk({"$ref": "#/properties/c"}, ())

    assert flattened_a == {"$ref": ("properties", "a")}
    assert flattened_b == {"$ref": ("properties", "b")}
    assert flattened_c == {"$ref": ("properties", "c")}
def test_walk_nested_properties(path):
    test_schema = {"properties": {"a": {"properties": {"b": {}}}}}
    flattener = JsonSchemaFlattener({})
    result = flattener._walk(test_schema, path)

    ref_path = path + ("properties", "a")

    assert result == {"$ref": path}
    assert len(flattener._schema_map) == 2
    assert flattener._schema_map[path] == {
        "properties": {
            "a": {
                "$ref": ref_path
            }
        }
    }
    assert flattener._schema_map[ref_path] == {"properties": {"b": {}}}
def test_circular_reference_self():
    test_schema = {"properties": {"a": {"$ref": "#/properties/a"}}}
    flattener = JsonSchemaFlattener(test_schema)
    flattened = flattener._walk({"$ref": "#/properties/a"}, ())
    assert flattened == {"$ref": ("properties", "a")}
def test_walk_ref_to_primitive(primitive_type):
    flattener = JsonSchemaFlattener({"a": primitive_type})
    result = flattener._walk({"$ref": "#/a"}, ())

    assert result == primitive_type
    assert not flattener._schema_map
def test_walk_primitive_type(primitive_type):
    flattener = JsonSchemaFlattener({})
    result = flattener._walk(primitive_type, ())

    assert result == primitive_type
    assert not flattener._schema_map