ASSERT_EQUALS(expectedObj, request.toBSON());
    }

    TEST(FindAndModifyRequest, ParseWithUpdateOnlyRequiredFields) {
        BSONObj cmdObj(fromjson(R"json({
            query: { x: 1 },
            update: { y: 1 }
        })json"));

        auto parseStatus = FindAndModifyRequest::parseFromBSON(NamespaceString("a.b"), cmdObj);
        ASSERT_OK(parseStatus.getStatus());

        auto request = parseStatus.getValue();
        ASSERT_EQUALS(NamespaceString("a.b").toString(), request.getNamespaceString().toString());
        ASSERT_EQUALS(BSON("x" << 1), request.getQuery());
        ASSERT_EQUALS(BSON("y" << 1), request.getUpdateObj());
        ASSERT_EQUALS(false, request.isUpsert());
        ASSERT_EQUALS(false, request.isRemove());
        ASSERT_EQUALS(BSONObj(), request.getFields());
        ASSERT_EQUALS(BSONObj(), request.getSort());
        ASSERT_EQUALS(false, request.shouldReturnNew());
    }

    TEST(FindAndModifyRequest, ParseWithUpdateFullSpec) {
        BSONObj cmdObj(fromjson(R"json({
            query: { x: 1 },
            update: { y: 1 },
            upsert: true,
            fields: { x: 1, y: 1 },
            sort: { z: -1 },
            new: true
    ASSERT_BSONOBJ_EQ(expectedObj, request.toBSON());
}

TEST(FindAndModifyRequest, ParseWithUpdateOnlyRequiredFields) {
    BSONObj cmdObj(fromjson(R"json({
            query: { x: 1 },
            update: { y: 1 }
        })json"));

    auto parseStatus = FindAndModifyRequest::parseFromBSON(NamespaceString("a.b"), cmdObj);
    ASSERT_OK(parseStatus.getStatus());

    auto request = parseStatus.getValue();
    ASSERT_EQUALS(NamespaceString("a.b").toString(), request.getNamespaceString().toString());
    ASSERT_BSONOBJ_EQ(BSON("x" << 1), request.getQuery());
    ASSERT_BSONOBJ_EQ(BSON("y" << 1), request.getUpdateObj());
    ASSERT_EQUALS(false, request.isUpsert());
    ASSERT_EQUALS(false, request.isRemove());
    ASSERT_BSONOBJ_EQ(BSONObj(), request.getFields());
    ASSERT_BSONOBJ_EQ(BSONObj(), request.getSort());
    ASSERT_BSONOBJ_EQ(BSONObj(), request.getCollation());
    ASSERT_EQUALS(0u, request.getArrayFilters().size());
    ASSERT_EQUALS(false, request.shouldReturnNew());
}

TEST(FindAndModifyRequest, ParseWithUpdateFullSpec) {
    BSONObj cmdObj(fromjson(R"json({
            query: { x: 1 },
            update: { y: 1 },
            upsert: true,
            fields: { x: 1, y: 1 },