@@ -1286,6 +1286,73 @@ test_update (void)
1286
1286
mongoc_client_destroy (client );
1287
1287
}
1288
1288
1289
+ static void
1290
+ test_update_pipeline (void * ctx )
1291
+ {
1292
+ mongoc_collection_t * collection ;
1293
+ mongoc_database_t * database ;
1294
+ mongoc_client_t * client ;
1295
+ bson_error_t error ;
1296
+ bson_t * b ;
1297
+ bson_t * pipeline ;
1298
+ bson_t * replacement ;
1299
+ bool res ;
1300
+
1301
+ client = test_framework_client_new ();
1302
+ ASSERT (client );
1303
+
1304
+ database = get_test_database (client );
1305
+ ASSERT (database );
1306
+
1307
+ collection = get_test_collection (client , "test_update_pipeline" );
1308
+ ASSERT (collection );
1309
+
1310
+ b = tmp_bson ("{'nums': {'x': 1, 'y': 2}}" );
1311
+ res = mongoc_collection_insert_one (collection , b , NULL , NULL , & error );
1312
+ ASSERT_OR_PRINT (res , error );
1313
+
1314
+ /* format: array document with incrementing keys
1315
+ (i.e. {"0": value, "1": value, "2": value}) */
1316
+ pipeline = tmp_bson ("{'0': {'$replaceRoot': {'newRoot': '$nums'}},"
1317
+ " '1': {'$addFields': {'z': 3}}}" );
1318
+ res = mongoc_collection_update_one (
1319
+ collection , b , pipeline , NULL , NULL , & error );
1320
+ ASSERT_OR_PRINT (res , error );
1321
+
1322
+ res = mongoc_collection_insert_one (collection , b , NULL , NULL , & error );
1323
+ ASSERT_OR_PRINT (res , error );
1324
+
1325
+ /* ensure that arrays sent to mongoc_collection_replace_one are not
1326
+ treated as pipelines */
1327
+ replacement = tmp_bson ("{'0': 0, '1': 1}" );
1328
+ res = mongoc_collection_replace_one (
1329
+ collection , b , replacement , NULL , NULL , & error );
1330
+ ASSERT_OR_PRINT (res , error );
1331
+
1332
+ /* ensure that pipeline updates sent to mongoc_collection_replace_one
1333
+ receive a client-side error */
1334
+ res = mongoc_collection_replace_one (
1335
+ collection , b , pipeline , NULL , NULL , & error );
1336
+ ASSERT (!res );
1337
+ ASSERT_ERROR_CONTAINS (error ,
1338
+ MONGOC_ERROR_COMMAND ,
1339
+ MONGOC_ERROR_COMMAND_INVALID_ARG ,
1340
+ "invalid argument for replace" );
1341
+
1342
+ /* ensure that a pipeline with an empty document is considered invalid */
1343
+ pipeline = tmp_bson ("{ '0': {} }" );
1344
+ res = mongoc_collection_update_one (
1345
+ collection , b , pipeline , NULL , NULL , & error );
1346
+ ASSERT (!res );
1347
+ ASSERT_ERROR_CONTAINS (error ,
1348
+ MONGOC_ERROR_COMMAND ,
1349
+ MONGOC_ERROR_COMMAND_INVALID_ARG ,
1350
+ "Invalid key" );
1351
+
1352
+ mongoc_collection_destroy (collection );
1353
+ mongoc_database_destroy (database );
1354
+ mongoc_client_destroy (client );
1355
+ }
1289
1356
1290
1357
static void
1291
1358
test_update_oversize (void * ctx )
@@ -6175,6 +6242,12 @@ test_collection_install (TestSuite *suite)
6175
6242
NULL ,
6176
6243
skip_unless_server_has_decimal128 );
6177
6244
TestSuite_AddLive (suite , "/Collection/update" , test_update );
6245
+ TestSuite_AddFull (suite ,
6246
+ "/Collection/update_pipeline" ,
6247
+ test_update_pipeline ,
6248
+ NULL ,
6249
+ NULL ,
6250
+ test_framework_skip_if_max_wire_version_less_than_8 );
6178
6251
TestSuite_AddLive (suite , "/Collection/update/multi" , test_update_multi );
6179
6252
TestSuite_AddLive (suite , "/Collection/update/upsert" , test_update_upsert );
6180
6253
TestSuite_AddFull (suite ,
@@ -6346,4 +6419,4 @@ test_collection_install (TestSuite *suite)
6346
6419
NULL ,
6347
6420
NULL ,
6348
6421
test_framework_skip_if_not_replset );
6349
- }
6422
+ }
0 commit comments