@@ -267,7 +267,7 @@ async def test_batch_size_is_honored(self):
267267
268268 # $changeStream.startAtOperationTime was added in 4.0.0.
269269 @no_type_check
270- @async_client_context .require_version_min (4 , 0 , 0 )
270+ @async_client_context .require_version_min (4 , 2 , 0 )
271271 async def test_start_at_operation_time (self ):
272272 optime = await self .get_start_at_operation_time ()
273273
@@ -436,7 +436,7 @@ async def test_change_operations(self):
436436 await self ._test_get_invalidate_event (change_stream )
437437
438438 @no_type_check
439- @async_client_context .require_version_min (4 , 1 , 1 )
439+ @async_client_context .require_version_min (4 , 2 , 0 )
440440 async def test_start_after (self ):
441441 resume_token = await self .get_resume_token (invalidate = True )
442442
@@ -452,7 +452,7 @@ async def test_start_after(self):
452452 self .assertEqual (change ["fullDocument" ], {"_id" : 2 })
453453
454454 @no_type_check
455- @async_client_context .require_version_min (4 , 1 , 1 )
455+ @async_client_context .require_version_min (4 , 2 , 0 )
456456 async def test_start_after_resume_process_with_changes (self ):
457457 resume_token = await self .get_resume_token (invalidate = True )
458458
@@ -563,27 +563,16 @@ async def _test_update_resume_token(self, expected_rt_getter):
563563 )
564564
565565 # Prose test no. 1
566- @async_client_context .require_version_min (4 , 0 , 7 )
566+ @async_client_context .require_version_min (4 , 2 , 0 )
567567 async def test_update_resume_token (self ):
568568 await self ._test_update_resume_token (self ._get_expected_resume_token )
569569
570- # Prose test no. 1
571- @async_client_context .require_version_max (4 , 0 , 7 )
572- async def test_update_resume_token_legacy (self ):
573- await self ._test_update_resume_token (self ._get_expected_resume_token_legacy )
574-
575570 # Prose test no. 2
576- @async_client_context .require_version_min (4 , 1 , 8 )
571+ @async_client_context .require_version_min (4 , 2 , 0 )
577572 async def test_raises_error_on_missing_id_418plus (self ):
578573 # Server returns an error on 4.1.8+
579574 await self ._test_raises_error_on_missing_id (OperationFailure )
580575
581- # Prose test no. 2
582- @async_client_context .require_version_max (4 , 1 , 8 )
583- async def test_raises_error_on_missing_id_418minus (self ):
584- # PyMongo raises an error
585- await self ._test_raises_error_on_missing_id (InvalidOperation )
586-
587576 # Prose test no. 3
588577 @no_type_check
589578 async def test_resume_on_error (self ):
@@ -642,40 +631,12 @@ def raise_error():
642631 cursor .close = raise_error
643632 await self .insert_one_and_check (change_stream , {"_id" : 2 })
644633
645- # Prose test no. 9
646- @no_type_check
647- @async_client_context .require_version_min (4 , 0 , 0 )
648- @async_client_context .require_version_max (4 , 0 , 7 )
649- async def test_start_at_operation_time_caching (self ):
650- # Case 1: change stream not started with startAtOperationTime
651- client , listener = self .client_with_listener ("aggregate" )
652- async with await self .change_stream_with_client (client ) as cs :
653- await self .kill_change_stream_cursor (cs )
654- await cs .try_next ()
655- cmd = listener .started_events [- 1 ].command
656- self .assertIsNotNone (cmd ["pipeline" ][0 ]["$changeStream" ].get ("startAtOperationTime" ))
657-
658- # Case 2: change stream started with startAtOperationTime
659- listener .reset ()
660- optime = await self .get_start_at_operation_time ()
661- async with await self .change_stream_with_client (
662- client , start_at_operation_time = optime
663- ) as cs :
664- await self .kill_change_stream_cursor (cs )
665- await cs .try_next ()
666- cmd = listener .started_events [- 1 ].command
667- self .assertEqual (
668- cmd ["pipeline" ][0 ]["$changeStream" ].get ("startAtOperationTime" ),
669- optime ,
670- str ([k .command for k in listener .started_events ]),
671- )
672-
673634 # Prose test no. 10 - SKIPPED
674635 # This test is identical to prose test no. 3.
675636
676637 # Prose test no. 11
677638 @no_type_check
678- @async_client_context .require_version_min (4 , 0 , 7 )
639+ @async_client_context .require_version_min (4 , 2 , 0 )
679640 async def test_resumetoken_empty_batch (self ):
680641 client , listener = await self ._client_with_listener ("getMore" )
681642 async with await self .change_stream_with_client (client ) as change_stream :
@@ -687,7 +648,7 @@ async def test_resumetoken_empty_batch(self):
687648
688649 # Prose test no. 11
689650 @no_type_check
690- @async_client_context .require_version_min (4 , 0 , 7 )
651+ @async_client_context .require_version_min (4 , 2 , 0 )
691652 async def test_resumetoken_exhausted_batch (self ):
692653 client , listener = await self ._client_with_listener ("getMore" )
693654 async with await self .change_stream_with_client (client ) as change_stream :
@@ -697,38 +658,6 @@ async def test_resumetoken_exhausted_batch(self):
697658 response = listener .succeeded_events [- 1 ].reply
698659 self .assertEqual (resume_token , response ["cursor" ]["postBatchResumeToken" ])
699660
700- # Prose test no. 12
701- @no_type_check
702- @async_client_context .require_version_max (4 , 0 , 7 )
703- async def test_resumetoken_empty_batch_legacy (self ):
704- resume_point = await self .get_resume_token ()
705-
706- # Empty resume token when neither resumeAfter or startAfter specified.
707- async with await self .change_stream () as change_stream :
708- await change_stream .try_next ()
709- self .assertIsNone (change_stream .resume_token )
710-
711- # Resume token value is same as resumeAfter.
712- async with await self .change_stream (resume_after = resume_point ) as change_stream :
713- await change_stream .try_next ()
714- resume_token = change_stream .resume_token
715- self .assertEqual (resume_token , resume_point )
716-
717- # Prose test no. 12
718- @no_type_check
719- @async_client_context .require_version_max (4 , 0 , 7 )
720- async def test_resumetoken_exhausted_batch_legacy (self ):
721- # Resume token is _id of last change.
722- async with await self .change_stream () as change_stream :
723- change = await self ._populate_and_exhaust_change_stream (change_stream )
724- self .assertEqual (change_stream .resume_token , change ["_id" ])
725- resume_point = change ["_id" ]
726-
727- # Resume token is _id of last change even if resumeAfter is specified.
728- async with await self .change_stream (resume_after = resume_point ) as change_stream :
729- change = await self ._populate_and_exhaust_change_stream (change_stream )
730- self .assertEqual (change_stream .resume_token , change ["_id" ])
731-
732661 # Prose test no. 13
733662 @no_type_check
734663 async def test_resumetoken_partially_iterated_batch (self ):
@@ -770,13 +699,13 @@ async def test_resumetoken_uniterated_nonempty_batch_resumeafter(self):
770699 # Prose test no. 14
771700 @no_type_check
772701 @async_client_context .require_no_mongos
773- @async_client_context .require_version_min (4 , 1 , 1 )
702+ @async_client_context .require_version_min (4 , 2 , 0 )
774703 async def test_resumetoken_uniterated_nonempty_batch_startafter (self ):
775704 await self ._test_resumetoken_uniterated_nonempty_batch ("start_after" )
776705
777706 # Prose test no. 17
778707 @no_type_check
779- @async_client_context .require_version_min (4 , 1 , 1 )
708+ @async_client_context .require_version_min (4 , 2 , 0 )
780709 async def test_startafter_resume_uses_startafter_after_empty_getMore (self ):
781710 # Resume should use startAfter after no changes have been returned.
782711 resume_point = await self .get_resume_token ()
@@ -796,7 +725,7 @@ async def test_startafter_resume_uses_startafter_after_empty_getMore(self):
796725
797726 # Prose test no. 18
798727 @no_type_check
799- @async_client_context .require_version_min (4 , 1 , 1 )
728+ @async_client_context .require_version_min (4 , 2 , 0 )
800729 async def test_startafter_resume_uses_resumeafter_after_nonempty_getMore (self ):
801730 # Resume should use resumeAfter after some changes have been returned.
802731 resume_point = await self .get_resume_token ()
@@ -843,7 +772,7 @@ async def test_split_large_change(self):
843772class TestClusterAsyncChangeStream (TestAsyncChangeStreamBase , APITestsMixin ):
844773 dbs : list
845774
846- @async_client_context .require_version_min (4 , 0 , 0 , - 1 )
775+ @async_client_context .require_version_min (4 , 2 , 0 )
847776 @async_client_context .require_change_streams
848777 async def asyncSetUp (self ) -> None :
849778 await super ().asyncSetUp ()
@@ -903,7 +832,7 @@ async def test_full_pipeline(self):
903832
904833
905834class TestAsyncDatabaseAsyncChangeStream (TestAsyncChangeStreamBase , APITestsMixin ):
906- @async_client_context .require_version_min (4 , 0 , 0 , - 1 )
835+ @async_client_context .require_version_min (4 , 2 , 0 )
907836 @async_client_context .require_change_streams
908837 async def asyncSetUp (self ) -> None :
909838 await super ().asyncSetUp ()
0 commit comments