@@ -659,6 +659,48 @@ async fn split_large_event() -> Result<()> {
659
659
Ok ( ( ) )
660
660
}
661
661
662
+ /// Test that transaction fields are parsed correctly
663
+ #[ tokio:: test]
664
+ async fn transaction_fields ( ) -> Result < ( ) > {
665
+ let ( client, coll, mut stream) =
666
+ match init_stream ( "chang_stream_transaction_fields" , true ) . await ? {
667
+ Some ( t) => t,
668
+ None => return Ok ( ( ) ) ,
669
+ } ;
670
+ if client. is_sharded ( ) {
671
+ log_uncaptured ( "skipping change stream test on unsupported topology" ) ;
672
+ return Ok ( ( ) ) ;
673
+ }
674
+ if !client. supports_transactions ( ) {
675
+ log_uncaptured (
676
+ "skipping change stream transaction_fields test due to lack of transaction support" ,
677
+ ) ;
678
+ return Ok ( ( ) ) ;
679
+ }
680
+
681
+ let mut session = client. start_session ( ) . await . unwrap ( ) ;
682
+ let session_id = session. id ( ) . get ( "id" ) . cloned ( ) ;
683
+ assert ! ( session_id. is_some( ) ) ;
684
+ session. start_transaction ( ) . await . unwrap ( ) ;
685
+ coll. insert_one ( doc ! { "_id" : 1 } )
686
+ . session ( & mut session)
687
+ . await ?;
688
+ session. commit_transaction ( ) . await . unwrap ( ) ;
689
+
690
+ let next_event = stream. next ( ) . await . transpose ( ) ?;
691
+ assert ! ( matches!( next_event,
692
+ Some ( ChangeStreamEvent {
693
+ operation_type: OperationType :: Insert ,
694
+ document_key: Some ( key) ,
695
+ lsid: Some ( lsid) ,
696
+ txn_number: Some ( 1 ) ,
697
+ ..
698
+ } ) if key == doc! { "_id" : 1 } && lsid. get( "id" ) == session_id. as_ref( )
699
+ ) ) ;
700
+
701
+ Ok ( ( ) )
702
+ }
703
+
662
704
// Regression test: `Collection::watch` uses the type parameter. This is not flagged as a test to
663
705
// run because it's just asserting that this compiles.
664
706
#[ allow( unreachable_code, unused_variables, clippy:: diverging_sub_expression) ]
0 commit comments