Documentation
#[test]
fn merge_same_path_diff_methods() {
    let mut api_1 = OpenApiBuilder::new()
        .info(Info::new("Api", "v1"))
        .paths(
            crate::openapi::PathsBuilder::new()
                .path(
                    "/api/v1/user",
                    PathItem::new(
                        HttpMethod::Get,
                        OperationBuilder::new()
                            .response("200", Response::new("Get user success 1")),
                    ),
                )
                .extensions(Some(Extensions::from_iter([("x-v1-api", true)])))
                .build(),
        )
        .build();

    let api_2 = OpenApiBuilder::new()
        .info(Info::new("Api", "v2"))
        .paths(
            crate::openapi::PathsBuilder::new()
                .path(
                    "/api/v1/user",
                    PathItem::new(
                        HttpMethod::Get,
                        OperationBuilder::new()
                            .response("200", Response::new("This will not get added")),
                    ),
                )
                .path(
                    "/api/v1/user",
                    PathItem::new(
                        HttpMethod::Post,
                        OperationBuilder::new()
                            .response("200", Response::new("Post user success 1")),
                    ),
                )
                .path(
                    "/api/v2/user",
                    PathItem::new(
                        HttpMethod::Get,
                        OperationBuilder::new()
                            .response("200", Response::new("Get user success 2")),
                    ),
                )
                .path(
                    "/api/v2/user",
                    PathItem::new(
                        HttpMethod::Post,
                        OperationBuilder::new()
                            .response("200", Response::new("Post user success 2")),
                    ),
                )
                .extensions(Some(Extensions::from_iter([("x-random", "Value")])))
                .build(),
        )
        .components(Some(
            ComponentsBuilder::new()
                .schema(
                    "User2",
                    ObjectBuilder::new().schema_type(Type::Object).property(
                        "name",
                        ObjectBuilder::new().schema_type(Type::String).build(),
                    ),
                )
                .build(),
        ))
        .build();

    api_1.merge(api_2);

    assert_json_snapshot!(api_1, {
        ".paths" => insta::sorted_redaction()
    });
}

#[test]
fn test_nest_open_apis() {
    let api = OpenApiBuilder::new()
        .paths(crate::openapi::PathsBuilder::new().path(
            "/api/v1/status",
            PathItem::new(
                HttpMethod::Get,
                OperationBuilder::new().description(Some("Get status")).build(),
            ),
        ))
        .build();

    let user_api = OpenApiBuilder::new()
        .paths(
            crate::openapi::PathsBuilder::new()
                .path(
                    "/",
                    PathItem::new(
                        HttpMethod::Get,
                        OperationBuilder::new()
                            .description(Some("Get user details"))
                            .build(),
                    ),
                )
                .path(
                    "/foo",
                    PathItem::new(HttpMethod::Post, OperationBuilder::new().build()),
                ),
        )
        .build();

    let nest_merged = api.nest("/api/v1/user", user_api);
    let value = serde_json::to_value(nest_merged).expect("should serialize as json");
    let paths = value.pointer("/paths").expect("paths should exits in openapi");

    assert_json_snapshot!(paths);
}

#[test]
fn openapi_custom_extension() {
    let mut api = OpenApiBuilder::new().build();
    let extensions = api.extensions.get_or_insert(Default::default());
    extensions.insert(
        String::from("x-tagGroup"),
        String::from("anything that serializes to Json").into(),
    );

    assert_json_snapshot!(api);
}