Skip to content

Commit 51fe9b5

Browse files
committed
Add missing tests for aggregation pipeline in bulk write updates
JAVA-3454
1 parent 5dca6d9 commit 51fe9b5

File tree

6 files changed

+267
-21
lines changed

6 files changed

+267
-21
lines changed

driver-async/src/test/functional/com/mongodb/async/client/CrudTest.java

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -159,10 +159,11 @@ private void runOperation(final BsonDocument expectedOutcome, final BsonDocument
159159
expectedResult.asDocument().append("upsertedCount", actualResult.asDocument().get("upsertedCount"));
160160
}
161161
// Hack to workaround the lack of insertedIds
162-
if (expectedResult.isDocument()
163-
&& !expectedResult.asDocument().containsKey("insertedIds")) {
164-
actualResult.asDocument().remove("insertedIds");
165-
}
162+
removeIdList("insertedIds", expectedResult, actualResult);
163+
removeIdList("upsertedIds", expectedResult, actualResult);
164+
165+
removeZeroCountField("deletedCount", expectedResult, actualResult);
166+
removeZeroCountField("insertedCount", expectedResult, actualResult);
166167

167168
assertEquals(description, expectedResult, actualResult);
168169
}
@@ -178,6 +179,21 @@ private void runOperation(final BsonDocument expectedOutcome, final BsonDocument
178179
}
179180
}
180181

182+
private void removeZeroCountField(final String key, final BsonValue expectedResult, final BsonValue actualResult) {
183+
if (actualResult.isDocument()
184+
&& actualResult.asDocument().containsKey(key)
185+
&& actualResult.asDocument().getNumber(key).intValue() == 0
186+
&& !expectedResult.asDocument().containsKey(key)) {
187+
actualResult.asDocument().remove(key);
188+
}
189+
}
190+
191+
private void removeIdList(final String key, final BsonValue expectedResult, final BsonValue actualResult) {
192+
if (expectedResult.isDocument() && !expectedResult.asDocument().containsKey(key)) {
193+
actualResult.asDocument().remove(key);
194+
}
195+
}
196+
181197
@Parameterized.Parameters(name = "{1}")
182198
public static Collection<Object[]> data() throws URISyntaxException, IOException {
183199
List<Object[]> data = new ArrayList<Object[]>();

driver-async/src/test/functional/com/mongodb/async/client/JsonPoweredCrudTestHelper.java

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -832,13 +832,25 @@ BsonDocument getBulkWriteResult(final BsonDocument collectionOptions, final Bson
832832
if (name.equals("insertOne")) {
833833
writeModels.add(new InsertOneModel<BsonDocument>(requestArguments.getDocument("document")));
834834
} else if (name.equals("updateOne")) {
835-
writeModels.add(new UpdateOneModel<BsonDocument>(requestArguments.getDocument("filter"),
836-
requestArguments.getDocument("update"),
837-
getUpdateOptions(requestArguments)));
835+
if (requestArguments.isDocument("update")) {
836+
writeModels.add(new UpdateOneModel<BsonDocument>(requestArguments.getDocument("filter"),
837+
requestArguments.getDocument("update"),
838+
getUpdateOptions(requestArguments)));
839+
} else { // update is a pipeline
840+
writeModels.add(new UpdateOneModel<BsonDocument>(requestArguments.getDocument("filter"),
841+
getListOfDocuments(requestArguments.getArray("update")),
842+
getUpdateOptions(requestArguments)));
843+
}
838844
} else if (name.equals("updateMany")) {
839-
writeModels.add(new UpdateManyModel<BsonDocument>(requestArguments.getDocument("filter"),
840-
requestArguments.getDocument("update"),
841-
getUpdateOptions(requestArguments)));
845+
if (requestArguments.isDocument("update")) {
846+
writeModels.add(new UpdateManyModel<BsonDocument>(requestArguments.getDocument("filter"),
847+
requestArguments.getDocument("update"),
848+
getUpdateOptions(requestArguments)));
849+
} else { // update is a pipeline
850+
writeModels.add(new UpdateManyModel<BsonDocument>(requestArguments.getDocument("filter"),
851+
getListOfDocuments(requestArguments.getArray("update")),
852+
getUpdateOptions(requestArguments)));
853+
}
842854
} else if (name.equals("deleteOne")) {
843855
writeModels.add(new DeleteOneModel<BsonDocument>(requestArguments.getDocument("filter"),
844856
getDeleteOptions(requestArguments)));

driver-core/src/test/resources/crud/v2/updateWithPipelines.json

Lines changed: 170 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,9 @@
11
{
2+
"runOn": [
3+
{
4+
"minServerVersion": "4.1.11"
5+
}
6+
],
27
"data": [
38
{
49
"_id": 1,
@@ -16,7 +21,6 @@
1621
"y": 1
1722
}
1823
],
19-
"minServerVersion": "4.1.11",
2024
"collection_name": "test",
2125
"database_name": "crud-tests",
2226
"tests": [
@@ -234,6 +238,171 @@
234238
]
235239
}
236240
}
241+
},
242+
{
243+
"description": "UpdateOne in bulk write using pipelines",
244+
"operations": [
245+
{
246+
"name": "bulkWrite",
247+
"arguments": {
248+
"requests": [
249+
{
250+
"name": "updateOne",
251+
"arguments": {
252+
"filter": {
253+
"_id": 1
254+
},
255+
"update": [
256+
{
257+
"$replaceRoot": {
258+
"newRoot": "$t"
259+
}
260+
},
261+
{
262+
"$addFields": {
263+
"foo": 1
264+
}
265+
}
266+
]
267+
}
268+
}
269+
]
270+
},
271+
"result": {
272+
"matchedCount": 1,
273+
"modifiedCount": 1,
274+
"upsertedCount": 0
275+
}
276+
}
277+
],
278+
"expectations": [
279+
{
280+
"command_started_event": {
281+
"command": {
282+
"update": "test",
283+
"updates": [
284+
{
285+
"q": {
286+
"_id": 1
287+
},
288+
"u": [
289+
{
290+
"$replaceRoot": {
291+
"newRoot": "$t"
292+
}
293+
},
294+
{
295+
"$addFields": {
296+
"foo": 1
297+
}
298+
}
299+
]
300+
}
301+
]
302+
},
303+
"command_name": "update",
304+
"database_name": "crud-tests"
305+
}
306+
}
307+
],
308+
"outcome": {
309+
"collection": {
310+
"data": [
311+
{
312+
"_id": 1,
313+
"u": {
314+
"v": 1
315+
},
316+
"foo": 1
317+
},
318+
{
319+
"_id": 2,
320+
"x": 2,
321+
"y": 1
322+
}
323+
]
324+
}
325+
}
326+
},
327+
{
328+
"description": "UpdateMany in bulk write using pipelines",
329+
"operations": [
330+
{
331+
"name": "bulkWrite",
332+
"arguments": {
333+
"requests": [
334+
{
335+
"name": "updateMany",
336+
"arguments": {
337+
"filter": {},
338+
"update": [
339+
{
340+
"$project": {
341+
"x": 1
342+
}
343+
},
344+
{
345+
"$addFields": {
346+
"foo": 1
347+
}
348+
}
349+
]
350+
}
351+
}
352+
]
353+
},
354+
"result": {
355+
"matchedCount": 2,
356+
"modifiedCount": 2,
357+
"upsertedCount": 0
358+
}
359+
}
360+
],
361+
"expectations": [
362+
{
363+
"command_started_event": {
364+
"command": {
365+
"update": "test",
366+
"updates": [
367+
{
368+
"q": {},
369+
"u": [
370+
{
371+
"$project": {
372+
"x": 1
373+
}
374+
},
375+
{
376+
"$addFields": {
377+
"foo": 1
378+
}
379+
}
380+
],
381+
"multi": true
382+
}
383+
]
384+
},
385+
"command_name": "update",
386+
"database_name": "crud-tests"
387+
}
388+
}
389+
],
390+
"outcome": {
391+
"collection": {
392+
"data": [
393+
{
394+
"_id": 1,
395+
"x": 1,
396+
"foo": 1
397+
},
398+
{
399+
"_id": 2,
400+
"x": 2,
401+
"foo": 1
402+
}
403+
]
404+
}
405+
}
237406
}
238407
]
239408
}

driver-legacy/src/test/functional/com/mongodb/client/LegacyCrudTest.java

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -162,10 +162,11 @@ private void runOperation(final BsonDocument expectedOutcome, final BsonDocument
162162
expectedResult.asDocument().append("upsertedCount", actualResult.asDocument().get("upsertedCount"));
163163
}
164164
// Hack to workaround the lack of insertedIds
165-
if (expectedResult.isDocument()
166-
&& !expectedResult.asDocument().containsKey("insertedIds")) {
167-
actualResult.asDocument().remove("insertedIds");
168-
}
165+
removeIdList("insertedIds", expectedResult, actualResult);
166+
removeIdList("upsertedIds", expectedResult, actualResult);
167+
168+
removeZeroCountField("deletedCount", expectedResult, actualResult);
169+
removeZeroCountField("insertedCount", expectedResult, actualResult);
169170

170171
assertEquals(description, expectedResult, actualResult);
171172
}
@@ -181,6 +182,21 @@ private void runOperation(final BsonDocument expectedOutcome, final BsonDocument
181182
}
182183
}
183184

185+
private void removeZeroCountField(final String key, final BsonValue expectedResult, final BsonValue actualResult) {
186+
if (actualResult.isDocument()
187+
&& actualResult.asDocument().containsKey(key)
188+
&& actualResult.asDocument().getNumber(key).intValue() == 0
189+
&& !expectedResult.asDocument().containsKey(key)) {
190+
actualResult.asDocument().remove(key);
191+
}
192+
}
193+
194+
private void removeIdList(final String key, final BsonValue expectedResult, final BsonValue actualResult) {
195+
if (expectedResult.isDocument() && !expectedResult.asDocument().containsKey(key)) {
196+
actualResult.asDocument().remove(key);
197+
}
198+
}
199+
184200
@Parameterized.Parameters(name = "{1}")
185201
public static Collection<Object[]> data() throws URISyntaxException, IOException {
186202
List<Object[]> data = new ArrayList<Object[]>();

driver-sync/src/test/functional/com/mongodb/client/CrudTest.java

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -161,6 +161,12 @@ private void runOperation(final BsonDocument expectedOutcome, final BsonDocument
161161
expectedResult.asDocument().append("upsertedCount", actualResult.asDocument().get("upsertedCount"));
162162
}
163163
// Hack to workaround the lack of insertedIds
164+
removeIdList("insertedIds", expectedResult, actualResult);
165+
removeIdList("upsertedIds", expectedResult, actualResult);
166+
167+
removeZeroCountField("deletedCount", expectedResult, actualResult);
168+
removeZeroCountField("insertedCount", expectedResult, actualResult);
169+
164170
if (expectedResult.isDocument()
165171
&& !expectedResult.asDocument().containsKey("insertedIds")) {
166172
actualResult.asDocument().remove("insertedIds");
@@ -180,6 +186,21 @@ private void runOperation(final BsonDocument expectedOutcome, final BsonDocument
180186
}
181187
}
182188

189+
private void removeZeroCountField(final String key, final BsonValue expectedResult, final BsonValue actualResult) {
190+
if (actualResult.isDocument()
191+
&& actualResult.asDocument().containsKey(key)
192+
&& actualResult.asDocument().getNumber(key).intValue() == 0
193+
&& !expectedResult.asDocument().containsKey(key)) {
194+
actualResult.asDocument().remove(key);
195+
}
196+
}
197+
198+
private void removeIdList(final String key, final BsonValue expectedResult, final BsonValue actualResult) {
199+
if (expectedResult.isDocument() && !expectedResult.asDocument().containsKey(key)) {
200+
actualResult.asDocument().remove(key);
201+
}
202+
}
203+
183204
@Parameterized.Parameters(name = "{1}")
184205
public static Collection<Object[]> data() throws URISyntaxException, IOException {
185206
List<Object[]> data = new ArrayList<Object[]>();

driver-sync/src/test/functional/com/mongodb/client/JsonPoweredCrudTestHelper.java

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -816,13 +816,25 @@ BsonDocument getBulkWriteResult(final BsonDocument collectionOptions, final Bson
816816
if (name.equals("insertOne")) {
817817
writeModels.add(new InsertOneModel<BsonDocument>(requestArguments.getDocument("document")));
818818
} else if (name.equals("updateOne")) {
819-
writeModels.add(new UpdateOneModel<BsonDocument>(requestArguments.getDocument("filter"),
820-
requestArguments.getDocument("update"),
821-
getUpdateOptions(requestArguments)));
819+
if (requestArguments.isDocument("update")) {
820+
writeModels.add(new UpdateOneModel<BsonDocument>(requestArguments.getDocument("filter"),
821+
requestArguments.getDocument("update"),
822+
getUpdateOptions(requestArguments)));
823+
} else { // update is a pipeline
824+
writeModels.add(new UpdateOneModel<BsonDocument>(requestArguments.getDocument("filter"),
825+
getListOfDocuments(requestArguments.getArray("update")),
826+
getUpdateOptions(requestArguments)));
827+
}
822828
} else if (name.equals("updateMany")) {
823-
writeModels.add(new UpdateManyModel<BsonDocument>(requestArguments.getDocument("filter"),
824-
requestArguments.getDocument("update"),
825-
getUpdateOptions(requestArguments)));
829+
if (requestArguments.isDocument("update")) {
830+
writeModels.add(new UpdateManyModel<BsonDocument>(requestArguments.getDocument("filter"),
831+
requestArguments.getDocument("update"),
832+
getUpdateOptions(requestArguments)));
833+
} else { // update is a pipeline
834+
writeModels.add(new UpdateManyModel<BsonDocument>(requestArguments.getDocument("filter"),
835+
getListOfDocuments(requestArguments.getArray("update")),
836+
getUpdateOptions(requestArguments)));
837+
}
826838
} else if (name.equals("deleteOne")) {
827839
writeModels.add(new DeleteOneModel<BsonDocument>(requestArguments.getDocument("filter"),
828840
getDeleteOptions(requestArguments)));

0 commit comments

Comments
 (0)