7
7
use MongoDB \Collection ;
8
8
use MongoDB \Database ;
9
9
use MongoDB \Driver \BulkWrite ;
10
+ use MongoDB \Driver \Exception \CommandException ;
10
11
use MongoDB \Driver \ReadConcern ;
11
12
use MongoDB \Driver \ReadPreference ;
12
13
use MongoDB \Driver \WriteConcern ;
21
22
use function call_user_func ;
22
23
use function is_scalar ;
23
24
use function json_encode ;
24
- use function strchr ;
25
+ use function str_contains ;
25
26
use function usort ;
26
27
use function version_compare ;
27
28
@@ -447,16 +448,28 @@ public function testMapReduce(): void
447
448
public function collectionMethodClosures ()
448
449
{
449
450
return [
450
- [
451
+ ' read-only aggregate ' => [
451
452
function ($ collection , $ session , $ options = []): void {
452
453
$ collection ->aggregate (
453
454
[['$match ' => ['_id ' => ['$lt ' => 3 ]]]],
454
455
['session ' => $ session ] + $ options
455
456
);
457
+ }, 'r ' ,
458
+ ],
459
+
460
+ 'read-write aggregate ' => [
461
+ function ($ collection , $ session , $ options = []): void {
462
+ $ collection ->aggregate (
463
+ [
464
+ ['$match ' => ['_id ' => ['$lt ' => 3 ]]],
465
+ ['$merge ' => $ collection . '_out ' ],
466
+ ],
467
+ ['session ' => $ session ] + $ options
468
+ );
456
469
}, 'rw ' ,
457
470
],
458
471
459
- [
472
+ ' bulkWrite insertOne ' => [
460
473
function ($ collection , $ session , $ options = []): void {
461
474
$ collection ->bulkWrite (
462
475
[['insertOne ' => [['test ' => 'foo ' ]]]],
@@ -466,7 +479,7 @@ function ($collection, $session, $options = []): void {
466
479
],
467
480
468
481
/* Disabled, as count command can't be used in transactions
469
- [
482
+ 'count' => [
470
483
function($collection, $session, $options = []) {
471
484
$collection->count(
472
485
[],
@@ -476,7 +489,7 @@ function($collection, $session, $options = []) {
476
489
],
477
490
*/
478
491
479
- [
492
+ ' countDocuments ' => [
480
493
function ($ collection , $ session , $ options = []): void {
481
494
$ collection ->countDocuments (
482
495
[],
@@ -486,7 +499,7 @@ function ($collection, $session, $options = []): void {
486
499
],
487
500
488
501
/* Disabled, as it's illegal to use createIndex command in transactions
489
- [
502
+ 'createIndex' => [
490
503
function($collection, $session, $options = []) {
491
504
$collection->createIndex(
492
505
['test' => 1],
@@ -496,7 +509,7 @@ function($collection, $session, $options = []) {
496
509
],
497
510
*/
498
511
499
- [
512
+ ' deleteMany ' => [
500
513
function ($ collection , $ session , $ options = []): void {
501
514
$ collection ->deleteMany (
502
515
['test ' => 'foo ' ],
@@ -505,7 +518,7 @@ function ($collection, $session, $options = []): void {
505
518
}, 'w ' ,
506
519
],
507
520
508
- [
521
+ ' deleteOne ' => [
509
522
function ($ collection , $ session , $ options = []): void {
510
523
$ collection ->deleteOne (
511
524
['test ' => 'foo ' ],
@@ -514,7 +527,7 @@ function ($collection, $session, $options = []): void {
514
527
}, 'w ' ,
515
528
],
516
529
517
- [
530
+ ' distinct ' => [
518
531
function ($ collection , $ session , $ options = []): void {
519
532
$ collection ->distinct (
520
533
'_id ' ,
@@ -525,7 +538,7 @@ function ($collection, $session, $options = []): void {
525
538
],
526
539
527
540
/* Disabled, as it's illegal to use drop command in transactions
528
- [
541
+ 'drop' => [
529
542
function($collection, $session, $options = []) {
530
543
$collection->drop(
531
544
['session' => $session] + $options
@@ -535,7 +548,7 @@ function($collection, $session, $options = []) {
535
548
*/
536
549
537
550
/* Disabled, as it's illegal to use dropIndexes command in transactions
538
- [
551
+ 'dropIndex' => [
539
552
function($collection, $session, $options = []) {
540
553
$collection->dropIndex(
541
554
'_id_1',
@@ -545,7 +558,7 @@ function($collection, $session, $options = []) {
545
558
], */
546
559
547
560
/* Disabled, as it's illegal to use dropIndexes command in transactions
548
- [
561
+ 'dropIndexes' => [
549
562
function($collection, $session, $options = []) {
550
563
$collection->dropIndexes(
551
564
['session' => $session] + $options
@@ -555,7 +568,7 @@ function($collection, $session, $options = []) {
555
568
*/
556
569
557
570
/* Disabled, as count command can't be used in transactions
558
- [
571
+ 'estimatedDocumentCount' => [
559
572
function($collection, $session, $options = []) {
560
573
$collection->estimatedDocumentCount(
561
574
['session' => $session] + $options
@@ -564,7 +577,7 @@ function($collection, $session, $options = []) {
564
577
],
565
578
*/
566
579
567
- [
580
+ ' find ' => [
568
581
function ($ collection , $ session , $ options = []): void {
569
582
$ collection ->find (
570
583
['test ' => 'foo ' ],
@@ -573,7 +586,7 @@ function ($collection, $session, $options = []): void {
573
586
}, 'r ' ,
574
587
],
575
588
576
- [
589
+ ' findOne ' => [
577
590
function ($ collection , $ session , $ options = []): void {
578
591
$ collection ->findOne (
579
592
['test ' => 'foo ' ],
@@ -582,7 +595,7 @@ function ($collection, $session, $options = []): void {
582
595
}, 'r ' ,
583
596
],
584
597
585
- [
598
+ ' findOneAndDelete ' => [
586
599
function ($ collection , $ session , $ options = []): void {
587
600
$ collection ->findOneAndDelete (
588
601
['test ' => 'foo ' ],
@@ -591,7 +604,7 @@ function ($collection, $session, $options = []): void {
591
604
}, 'w ' ,
592
605
],
593
606
594
- [
607
+ ' findOneAndReplace ' => [
595
608
function ($ collection , $ session , $ options = []): void {
596
609
$ collection ->findOneAndReplace (
597
610
['test ' => 'foo ' ],
@@ -601,7 +614,7 @@ function ($collection, $session, $options = []): void {
601
614
}, 'w ' ,
602
615
],
603
616
604
- [
617
+ ' findOneAndUpdate ' => [
605
618
function ($ collection , $ session , $ options = []): void {
606
619
$ collection ->findOneAndUpdate (
607
620
['test ' => 'foo ' ],
@@ -611,7 +624,7 @@ function ($collection, $session, $options = []): void {
611
624
}, 'w ' ,
612
625
],
613
626
614
- [
627
+ ' insertMany ' => [
615
628
function ($ collection , $ session , $ options = []): void {
616
629
$ collection ->insertMany (
617
630
[
@@ -623,7 +636,7 @@ function ($collection, $session, $options = []): void {
623
636
}, 'w ' ,
624
637
],
625
638
626
- [
639
+ ' insertOne ' => [
627
640
function ($ collection , $ session , $ options = []): void {
628
641
$ collection ->insertOne (
629
642
['test ' => 'foo ' ],
@@ -633,7 +646,7 @@ function ($collection, $session, $options = []): void {
633
646
],
634
647
635
648
/* Disabled, as it's illegal to use listIndexes command in transactions
636
- [
649
+ 'listIndexes' => [
637
650
function($collection, $session, $options = []) {
638
651
$collection->listIndexes(
639
652
['session' => $session] + $options
@@ -643,7 +656,7 @@ function($collection, $session, $options = []) {
643
656
*/
644
657
645
658
/* Disabled, as it's illegal to use mapReduce command in transactions
646
- [
659
+ 'mapReduce' => [
647
660
function($collection, $session, $options = []) {
648
661
$collection->mapReduce(
649
662
new \MongoDB\BSON\Javascript('function() { emit(this.state, this.pop); }'),
@@ -655,7 +668,7 @@ function($collection, $session, $options = []) {
655
668
],
656
669
*/
657
670
658
- [
671
+ ' replaceOne ' => [
659
672
function ($ collection , $ session , $ options = []): void {
660
673
$ collection ->replaceOne (
661
674
['test ' => 'foo ' ],
@@ -665,7 +678,7 @@ function ($collection, $session, $options = []): void {
665
678
}, 'w ' ,
666
679
],
667
680
668
- [
681
+ ' updateMany ' => [
669
682
function ($ collection , $ session , $ options = []): void {
670
683
$ collection ->updateMany (
671
684
['test ' => 'foo ' ],
@@ -675,7 +688,7 @@ function ($collection, $session, $options = []): void {
675
688
}, 'w ' ,
676
689
],
677
690
678
- [
691
+ ' updateOne ' => [
679
692
function ($ collection , $ session , $ options = []): void {
680
693
$ collection ->updateOne (
681
694
['test ' => 'foo ' ],
@@ -686,7 +699,7 @@ function ($collection, $session, $options = []): void {
686
699
],
687
700
688
701
/* Disabled, as it's illegal to use change streams in transactions
689
- [
702
+ 'watch' => [
690
703
function($collection, $session, $options = []) {
691
704
$collection->watch(
692
705
[],
@@ -698,32 +711,28 @@ function($collection, $session, $options = []) {
698
711
];
699
712
}
700
713
701
- public function collectionReadMethodClosures ()
714
+ public function collectionReadMethodClosures (): array
702
715
{
703
716
return array_filter (
704
717
$ this ->collectionMethodClosures (),
705
718
function ($ rw ) {
706
- if (strchr ($ rw [1 ], 'r ' ) !== false ) {
707
- return true ;
708
- }
719
+ return str_contains ($ rw [1 ], 'r ' );
709
720
}
710
721
);
711
722
}
712
723
713
- public function collectionWriteMethodClosures ()
724
+ public function collectionWriteMethodClosures (): array
714
725
{
715
726
return array_filter (
716
727
$ this ->collectionMethodClosures (),
717
728
function ($ rw ) {
718
- if (strchr ($ rw [1 ], 'w ' ) !== false ) {
719
- return true ;
720
- }
729
+ return str_contains ($ rw [1 ], 'w ' );
721
730
}
722
731
);
723
732
}
724
733
725
734
/** @dataProvider collectionMethodClosures */
726
- public function testMethodDoesNotInheritReadWriteConcernInTranasaction (Closure $ method ): void
735
+ public function testMethodDoesNotInheritReadWriteConcernInTransaction (Closure $ method ): void
727
736
{
728
737
$ this ->skipIfTransactionsAreNotSupported ();
729
738
@@ -739,7 +748,16 @@ public function testMethodDoesNotInheritReadWriteConcernInTranasaction(Closure $
739
748
740
749
(new CommandObserver ())->observe (
741
750
function () use ($ method , $ collection , $ session ): void {
742
- call_user_func ($ method , $ collection , $ session );
751
+ try {
752
+ call_user_func ($ method , $ collection , $ session );
753
+ } catch (CommandException $ exception ) {
754
+ // Write aggregates are not supported in transactions
755
+ if ($ exception ->getResultDocument ()->codeName === 'OperationNotSupportedInTransaction ' ) {
756
+ $ this ->markTestSkipped ('OperationNotSupportedInTransaction: ' . $ exception ->getMessage ());
757
+ }
758
+
759
+ throw $ exception ;
760
+ }
743
761
},
744
762
function (array $ event ): void {
745
763
$ this ->assertObjectNotHasAttribute ('writeConcern ' , $ event ['started ' ]->getCommand ());
0 commit comments