@@ -1049,3 +1049,46 @@ async fn collection_generic_bounds() {
10491049 . collection ( function_name ! ( ) ) ;
10501050 let _result = coll. insert_one ( Bar { } , None ) . await ;
10511051}
1052+
1053+ /// Verify that a cursor with multiple batches whose last batch isn't full
1054+ /// iterates without errors.
1055+ #[ cfg_attr( feature = "tokio-runtime" , tokio:: test) ]
1056+ #[ cfg_attr( feature = "async-std-runtime" , async_std:: test) ]
1057+ async fn cursor_batch_size ( ) {
1058+ let _guard: RwLockReadGuard < ( ) > = LOCK . run_concurrently ( ) . await ;
1059+
1060+ let client = TestClient :: new ( ) . await ;
1061+ let coll = client
1062+ . init_db_and_coll ( "cursor_batch_size" , "cursor_batch_size" )
1063+ . await ;
1064+
1065+ let doc = Document :: new ( ) ;
1066+ coll. insert_many ( vec ! [ & doc; 10 ] , None ) . await . unwrap ( ) ;
1067+
1068+ let opts = FindOptions :: builder ( ) . batch_size ( 3 ) . build ( ) ;
1069+ let cursor_no_session = coll. find ( doc ! { } , opts. clone ( ) ) . await . unwrap ( ) ;
1070+ let docs: Vec < _ > = cursor_no_session. try_collect ( ) . await . unwrap ( ) ;
1071+ assert_eq ! ( docs. len( ) , 10 ) ;
1072+
1073+ // test session cursors
1074+ if client. is_standalone ( ) {
1075+ return ;
1076+ }
1077+ let mut session = client. start_session ( None ) . await . unwrap ( ) ;
1078+ let mut cursor = coll
1079+ . find_with_session ( doc ! { } , opts. clone ( ) , & mut session)
1080+ . await
1081+ . unwrap ( ) ;
1082+ let mut docs = Vec :: new ( ) ;
1083+ while let Some ( doc) = cursor. next ( & mut session) . await {
1084+ docs. push ( doc. unwrap ( ) ) ;
1085+ }
1086+ assert_eq ! ( docs. len( ) , 10 ) ;
1087+
1088+ let mut cursor = coll
1089+ . find_with_session ( doc ! { } , opts, & mut session)
1090+ . await
1091+ . unwrap ( ) ;
1092+ let docs: Vec < _ > = cursor. stream ( & mut session) . try_collect ( ) . await . unwrap ( ) ;
1093+ assert_eq ! ( docs. len( ) , 10 ) ;
1094+ }
0 commit comments