18
18
import static org .hamcrest .Matchers .*;
19
19
import static org .junit .Assert .*;
20
20
import static org .mockito .Mockito .*;
21
+ import static org .springframework .data .mongodb .test .util .IsBsonObject .*;
21
22
22
23
import java .math .BigInteger ;
23
24
import java .util .Collections ;
26
27
import java .util .regex .Pattern ;
27
28
28
29
import org .bson .Document ;
30
+ import org .bson .conversions .Bson ;
29
31
import org .bson .types .ObjectId ;
30
32
import org .hamcrest .collection .IsIterableContainingInOrder ;
31
33
import org .hamcrest .core .Is ;
@@ -337,7 +339,7 @@ public void processDocument(Document document) throws MongoException, DataAccess
337
339
public void aggregateShouldHonorReadPreferenceWhenSet () {
338
340
339
341
when (db .runCommand (Mockito .any (org .bson .Document .class ), Mockito .any (ReadPreference .class ), eq (Document .class )))
340
- .thenReturn (mock (Document .class ));
342
+ .thenReturn (mock (Document .class ));
341
343
template .setReadPreference (ReadPreference .secondary ());
342
344
343
345
template .aggregate (Aggregation .newAggregation (Aggregation .unwind ("foo" )), "collection-1" , Wrapper .class );
@@ -361,7 +363,7 @@ public void aggregateShouldIgnoreReadPreferenceWhenNotSet() {
361
363
public void geoNearShouldHonorReadPreferenceWhenSet () {
362
364
363
365
when (db .runCommand (Mockito .any (org .bson .Document .class ), Mockito .any (ReadPreference .class ), eq (Document .class )))
364
- .thenReturn (mock (Document .class ));
366
+ .thenReturn (mock (Document .class ));
365
367
template .setReadPreference (ReadPreference .secondary ());
366
368
367
369
NearQuery query = NearQuery .near (new Point (1 , 1 ));
@@ -374,7 +376,8 @@ public void geoNearShouldHonorReadPreferenceWhenSet() {
374
376
@ Test // DATAMONGO-1166
375
377
public void geoNearShouldIgnoreReadPreferenceWhenNotSet () {
376
378
377
- when (db .runCommand (Mockito .any (Document .class ), eq (Document .class ))).thenReturn (mock (Document .class ));
379
+ when (db .runCommand (Mockito .any (Document .class ), eq (Document .class ))).thenReturn (
380
+ mock (Document .class ));
378
381
379
382
NearQuery query = NearQuery .near (new Point (1 , 1 ));
380
383
template .geoNear (query , Wrapper .class );
@@ -514,6 +517,102 @@ public void onBeforeConvert(BeforeConvertEvent<VersionedEntity> event) {
514
517
spy .save (entity );
515
518
}
516
519
520
+ @ Test // DATAMONGO-1447
521
+ public void shouldNotAppend$isolatedToNonMulitUpdate () {
522
+
523
+ template .updateFirst (new Query (), new Update ().isolated ().set ("jon" , "snow" ), Wrapper .class );
524
+
525
+ ArgumentCaptor <Bson > queryCaptor = ArgumentCaptor .forClass (Bson .class );
526
+ ArgumentCaptor <Bson > updateCaptor = ArgumentCaptor .forClass (Bson .class );
527
+
528
+ verify (collection ).updateOne (queryCaptor .capture (), updateCaptor .capture (), any ());
529
+
530
+ assertThat (queryCaptor .getValue (), isBsonObject ().notContaining ("$isolated" ));
531
+ assertThat (updateCaptor .getValue (), isBsonObject ().containing ("$set.jon" , "snow" ).notContaining ("$isolated" ));
532
+ }
533
+
534
+ @ Test // DATAMONGO-1447
535
+ public void shouldAppend$isolatedToUpdateMultiEmptyQuery () {
536
+
537
+ template .updateMulti (new Query (), new Update ().isolated ().set ("jon" , "snow" ), Wrapper .class );
538
+
539
+ ArgumentCaptor <Bson > queryCaptor = ArgumentCaptor .forClass (Bson .class );
540
+ ArgumentCaptor <Bson > updateCaptor = ArgumentCaptor .forClass (Bson .class );
541
+
542
+ verify (collection ).updateMany (queryCaptor .capture (), updateCaptor .capture (), any ());
543
+
544
+ assertThat (queryCaptor .getValue (), isBsonObject ().withSize (1 ).containing ("$isolated" , 1 ));
545
+ assertThat (updateCaptor .getValue (), isBsonObject ().containing ("$set.jon" , "snow" ).notContaining ("$isolated" ));
546
+ }
547
+
548
+ @ Test // DATAMONGO-1447
549
+ public void shouldAppend$isolatedToUpdateMultiQueryIfNotPresentAndUpdateSetsValue () {
550
+
551
+ Update update = new Update ().isolated ().set ("jon" , "snow" );
552
+ Query query = new BasicQuery ("{'eddard':'stark'}" );
553
+
554
+ template .updateMulti (query , update , Wrapper .class );
555
+
556
+ ArgumentCaptor <Bson > queryCaptor = ArgumentCaptor .forClass (Bson .class );
557
+ ArgumentCaptor <Bson > updateCaptor = ArgumentCaptor .forClass (Bson .class );
558
+
559
+ verify (collection ).updateMany (queryCaptor .capture (), updateCaptor .capture (), any ());
560
+
561
+ assertThat (queryCaptor .getValue (), isBsonObject ().containing ("$isolated" , 1 ).containing ("eddard" , "stark" ));
562
+ assertThat (updateCaptor .getValue (), isBsonObject ().containing ("$set.jon" , "snow" ).notContaining ("$isolated" ));
563
+ }
564
+
565
+ @ Test // DATAMONGO-1447
566
+ public void shouldNotAppend$isolatedToUpdateMultiQueryIfNotPresentAndUpdateDoesNotSetValue () {
567
+
568
+ Update update = new Update ().set ("jon" , "snow" );
569
+ Query query = new BasicQuery ("{'eddard':'stark'}" );
570
+
571
+ template .updateMulti (query , update , Wrapper .class );
572
+
573
+ ArgumentCaptor <Bson > queryCaptor = ArgumentCaptor .forClass (Bson .class );
574
+ ArgumentCaptor <Bson > updateCaptor = ArgumentCaptor .forClass (Bson .class );
575
+
576
+ verify (collection ).updateMany (queryCaptor .capture (), updateCaptor .capture (), any ());
577
+
578
+ assertThat (queryCaptor .getValue (), isBsonObject ().notContaining ("$isolated" ).containing ("eddard" , "stark" ));
579
+ assertThat (updateCaptor .getValue (), isBsonObject ().containing ("$set.jon" , "snow" ).notContaining ("$isolated" ));
580
+ }
581
+
582
+ @ Test // DATAMONGO-1447
583
+ public void shouldNotOverwrite$isolatedToUpdateMultiQueryIfPresentAndUpdateDoesNotSetValue () {
584
+
585
+ Update update = new Update ().set ("jon" , "snow" );
586
+ Query query = new BasicQuery ("{'eddard':'stark', '$isolated' : 1}" );
587
+
588
+ template .updateMulti (query , update , Wrapper .class );
589
+
590
+ ArgumentCaptor <Bson > queryCaptor = ArgumentCaptor .forClass (Bson .class );
591
+ ArgumentCaptor <Bson > updateCaptor = ArgumentCaptor .forClass (Bson .class );
592
+
593
+ verify (collection ).updateMany (queryCaptor .capture (), updateCaptor .capture (), any ());
594
+
595
+ assertThat (queryCaptor .getValue (), isBsonObject ().containing ("$isolated" , 1 ).containing ("eddard" , "stark" ));
596
+ assertThat (updateCaptor .getValue (), isBsonObject ().containing ("$set.jon" , "snow" ).notContaining ("$isolated" ));
597
+ }
598
+
599
+ @ Test // DATAMONGO-1447
600
+ public void shouldNotOverwrite$isolatedToUpdateMultiQueryIfPresentAndUpdateSetsValue () {
601
+
602
+ Update update = new Update ().isolated ().set ("jon" , "snow" );
603
+ Query query = new BasicQuery ("{'eddard':'stark', '$isolated' : 0}" );
604
+
605
+ template .updateMulti (query , update , Wrapper .class );
606
+
607
+ ArgumentCaptor <Bson > queryCaptor = ArgumentCaptor .forClass (Bson .class );
608
+ ArgumentCaptor <Bson > updateCaptor = ArgumentCaptor .forClass (Bson .class );
609
+
610
+ verify (collection ).updateMany (queryCaptor .capture (), updateCaptor .capture (), any ());
611
+
612
+ assertThat (queryCaptor .getValue (), isBsonObject ().containing ("$isolated" , 0 ).containing ("eddard" , "stark" ));
613
+ assertThat (updateCaptor .getValue (), isBsonObject ().containing ("$set.jon" , "snow" ).notContaining ("$isolated" ));
614
+ }
615
+
517
616
class AutogenerateableId {
518
617
519
618
@ Id BigInteger id ;
0 commit comments