@@ -620,6 +620,57 @@ public function testCommitWithMaxCommitDelay()
620620 $ this ->assertEquals (1 , $ transaction ->getCommitStats ()->getMutationCount ());
621621 }
622622
623+ public function testCommitSetsPrecommitTokenFromInlineBegin ()
624+ {
625+ $ precommitToken = new MultiplexedSessionPrecommitToken ([
626+ 'precommit_token ' => 'my-precommit-token ' ,
627+ ]);
628+
629+ $ operation = $ this ->prophesize (Operation::class);
630+
631+ // Create the transaction returned by Operation::transaction()
632+ $ returnedTransaction = new Transaction (
633+ $ operation ->reveal (),
634+ $ this ->session ->reveal (),
635+ self ::TRANSACTION ,
636+ []
637+ );
638+ $ returnedTransaction ->setPrecommitToken ($ precommitToken );
639+
640+ $ operation ->transaction ($ this ->session ->reveal (), Argument::any ())
641+ ->shouldBeCalled ()
642+ ->willReturn ($ returnedTransaction );
643+
644+ // Verify that commit() receives the precommit token in options
645+ $ operation ->commit (
646+ $ this ->session ->reveal (),
647+ Argument::any (),
648+ Argument::that (function ($ options ) use ($ precommitToken ) {
649+ $ this ->assertArrayHasKey ('precommitToken ' , $ options );
650+ $ this ->assertEquals ($ precommitToken , $ options ['precommitToken ' ]);
651+ return true ;
652+ })
653+ )
654+ ->shouldBeCalled ()
655+ ->willReturn ($ this ->commitResponseWithCommitStats ());
656+
657+ $ transaction = new Transaction (
658+ $ operation ->reveal (),
659+ $ this ->session ->reveal (),
660+ null , // Null transaction ID to trigger inline begin
661+ [
662+ 'begin ' => ['readWrite ' => []]
663+ ]
664+ );
665+
666+ $ transaction ->insert ('Posts ' , ['foo ' => 'bar ' ]);
667+ $ transaction ->commit ();
668+
669+ $ ref = new \ReflectionClass (Transaction::class);
670+ $ prop = $ ref ->getProperty ('precommitToken ' );
671+ $ this ->assertNull ($ prop ->getValue ($ transaction ));
672+ }
673+
623674 public function testCommitInvalidState ()
624675 {
625676 $ this ->expectException (\BadMethodCallException::class);
0 commit comments