@@ -580,5 +580,261 @@ describe('Model - version Complete Test Suite (100% Coverage)', function() {
580580 assert . strictEqual ( post . version , 1 ) ;
581581 } ) ;
582582 } ) ;
583+
584+ // ========== 15. 连续更新验证(Critical)==========
585+ describe ( '15. Sequential Updates Verification (Critical)' , ( ) => {
586+ it ( '15.1 should maintain version consistency in sequential updates' , async ( ) => {
587+ const result = await User . insertOne ( {
588+ username : 'john' ,
589+ email : 'john@example.com'
590+ } ) ;
591+ const userId = result . insertedId ;
592+
593+ // 验证初始版本
594+ let user = await User . findOne ( { _id : userId } ) ;
595+ assert . strictEqual ( user . version , 0 , 'Initial version should be 0' ) ;
596+
597+ // 第一次更新
598+ await User . updateOne ( { _id : userId } , { $set : { status : 'pending' } } ) ;
599+ user = await User . findOne ( { _id : userId } ) ;
600+ assert . strictEqual ( user . version , 1 , 'After first update should be 1' ) ;
601+ assert . strictEqual ( user . status , 'pending' ) ;
602+
603+ // 第二次更新
604+ await User . updateOne ( { _id : userId } , { $set : { status : 'active' } } ) ;
605+ user = await User . findOne ( { _id : userId } ) ;
606+ assert . strictEqual ( user . version , 2 , 'After second update should be 2' ) ;
607+ assert . strictEqual ( user . status , 'active' ) ;
608+
609+ // 第三次更新
610+ await User . updateOne ( { _id : userId } , { $set : { status : 'verified' } } ) ;
611+ user = await User . findOne ( { _id : userId } ) ;
612+ assert . strictEqual ( user . version , 3 , 'After third update should be 3' ) ;
613+ assert . strictEqual ( user . status , 'verified' ) ;
614+
615+ // 验证版本号连续性(没有跳跃)
616+ assert . strictEqual ( user . version , 3 , 'Version should be continuous without gaps' ) ;
617+ } ) ;
618+ } ) ;
619+
620+ // ========== 16. 冲突后重试成功(High)==========
621+ describe ( '16. Retry After Conflict (High)' , ( ) => {
622+ it ( '16.1 should succeed after conflict retry' , async ( ) => {
623+ const result = await User . insertOne ( {
624+ username : 'john' ,
625+ email : 'john@example.com'
626+ } ) ;
627+ const userId = result . insertedId ;
628+
629+ // 用户 A 读取
630+ const userA = await User . findOne ( { _id : userId } ) ;
631+ assert . strictEqual ( userA . version , 0 ) ;
632+
633+ // 用户 B 读取
634+ const userB = await User . findOne ( { _id : userId } ) ;
635+ assert . strictEqual ( userB . version , 0 ) ;
636+
637+ // 用户 A 先更新成功
638+ const resultA = await User . updateOne (
639+ { _id : userId , version : userA . version } ,
640+ { $set : { status : 'active' } }
641+ ) ;
642+ assert . strictEqual ( resultA . modifiedCount , 1 , 'User A should succeed' ) ;
643+
644+ // 用户 B 更新失败(版本号冲突)
645+ const resultB = await User . updateOne (
646+ { _id : userId , version : userB . version } ,
647+ { $set : { status : 'inactive' } }
648+ ) ;
649+ assert . strictEqual ( resultB . modifiedCount , 0 , 'User B should fail due to version conflict' ) ;
650+
651+ // 用户 B 重新读取最新数据
652+ const latestUser = await User . findOne ( { _id : userId } ) ;
653+ assert . strictEqual ( latestUser . version , 1 , 'Latest version should be 1' ) ;
654+ assert . strictEqual ( latestUser . status , 'active' , 'Status should be from User A' ) ;
655+
656+ // 用户 B 使用最新版本号重试成功
657+ const retryResult = await User . updateOne (
658+ { _id : userId , version : latestUser . version } ,
659+ { $set : { status : 'inactive' } }
660+ ) ;
661+ assert . strictEqual ( retryResult . modifiedCount , 1 , 'User B retry should succeed' ) ;
662+
663+ // 验证最终状态
664+ const finalUser = await User . findOne ( { _id : userId } ) ;
665+ assert . strictEqual ( finalUser . version , 2 , 'Final version should be 2' ) ;
666+ assert . strictEqual ( finalUser . status , 'inactive' , 'Final status should be from User B' ) ;
667+ } ) ;
668+ } ) ;
669+
670+ // ========== 17. 批量操作返回值验证(High)==========
671+ describe ( '17. Batch Operation Return Values (High)' , ( ) => {
672+ it ( '17.1 should return correct modifiedCount in updateMany' , async ( ) => {
673+ // 插入测试数据
674+ await User . insertMany ( [
675+ { username : 'user1' , email : 'user1@example.com' , status : 'pending' } ,
676+ { username : 'user2' , email : 'user2@example.com' , status : 'pending' } ,
677+ { username : 'user3' , email : 'user3@example.com' , status : 'pending' }
678+ ] ) ;
679+
680+ // 批量更新
681+ const result = await User . updateMany (
682+ { status : 'pending' } ,
683+ { $set : { status : 'active' } }
684+ ) ;
685+
686+ // 验证返回值
687+ assert . strictEqual ( result . matchedCount , 3 , 'Should match 3 documents' ) ;
688+ assert . strictEqual ( result . modifiedCount , 3 , 'Should modify 3 documents' ) ;
689+
690+ // 验证所有文档的版本号都递增
691+ const users = await User . find ( { } ) ;
692+ assert . strictEqual ( users . length , 3 ) ;
693+ users . forEach ( user => {
694+ assert . strictEqual ( user . version , 1 , 'Each user version should be 1' ) ;
695+ assert . strictEqual ( user . status , 'active' , 'Each user status should be active' ) ;
696+ } ) ;
697+ } ) ;
698+
699+ it ( '17.2 should handle partial matches in updateMany' , async ( ) => {
700+ // 插入测试数据
701+ await User . insertMany ( [
702+ { username : 'user1' , email : 'user1@example.com' , status : 'pending' } ,
703+ { username : 'user2' , email : 'user2@example.com' , status : 'active' } ,
704+ { username : 'user3' , email : 'user3@example.com' , status : 'pending' }
705+ ] ) ;
706+
707+ // 只更新 pending 状态的文档
708+ const result = await User . updateMany (
709+ { status : 'pending' } ,
710+ { $set : { status : 'verified' } }
711+ ) ;
712+
713+ // 验证返回值
714+ assert . strictEqual ( result . matchedCount , 2 , 'Should match 2 documents' ) ;
715+ assert . strictEqual ( result . modifiedCount , 2 , 'Should modify 2 documents' ) ;
716+
717+ // 验证部分文档被更新
718+ const pending = await User . find ( { status : 'verified' } ) ;
719+ assert . strictEqual ( pending . length , 2 ) ;
720+ pending . forEach ( u => assert . strictEqual ( u . version , 1 ) ) ;
721+
722+ const active = await User . find ( { status : 'active' } ) ;
723+ assert . strictEqual ( active . length , 1 ) ;
724+ assert . strictEqual ( active [ 0 ] . version , 0 , 'Unchanged document should still be version 0' ) ;
725+ } ) ;
726+ } ) ;
727+
728+ // ========== 18. 自定义字段名完整流程(Medium)==========
729+ describe ( '18. Custom Field Name Complete Flow (Medium)' , ( ) => {
730+ it ( '18.1 should work end-to-end with custom field name' , async ( ) => {
731+ // 定义使用自定义字段名的 Model
732+ Model . define ( 'custom_version_test' , {
733+ schema : ( dsl ) => dsl ( {
734+ name : 'string!' ,
735+ status : 'string'
736+ } ) ,
737+ options : {
738+ version : {
739+ enabled : true ,
740+ field : '__v' // 自定义字段名
741+ }
742+ }
743+ } ) ;
744+
745+ const CustomModel = msq . model ( 'custom_version_test' ) ;
746+
747+ // 插入测试
748+ const result = await CustomModel . insertOne ( { name : 'test' } ) ;
749+ let doc = await CustomModel . findOne ( { _id : result . insertedId } ) ;
750+ assert . strictEqual ( doc . __v , 0 , 'Custom field __v should be initialized to 0' ) ;
751+
752+ // 更新测试
753+ await CustomModel . updateOne ( { _id : doc . _id } , { $set : { name : 'updated' } } ) ;
754+ doc = await CustomModel . findOne ( { _id : doc . _id } ) ;
755+ assert . strictEqual ( doc . __v , 1 , 'Custom field __v should increment to 1' ) ;
756+
757+ // 并发冲突测试(使用自定义字段名)
758+ const conflict = await CustomModel . updateOne (
759+ { _id : doc . _id , __v : 0 } , // 使用过期的版本号
760+ { $set : { name : 'conflict' } }
761+ ) ;
762+ assert . strictEqual ( conflict . modifiedCount , 0 , 'Should fail with outdated __v' ) ;
763+
764+ // 使用正确的版本号
765+ const success = await CustomModel . updateOne (
766+ { _id : doc . _id , __v : 1 } , // 使用正确的版本号
767+ { $set : { status : 'active' } }
768+ ) ;
769+ assert . strictEqual ( success . modifiedCount , 1 , 'Should succeed with correct __v' ) ;
770+
771+ doc = await CustomModel . findOne ( { _id : doc . _id } ) ;
772+ assert . strictEqual ( doc . __v , 2 , 'Custom field __v should be 2' ) ;
773+ assert . strictEqual ( doc . status , 'active' ) ;
774+
775+ // 清理
776+ Model . _clear ( ) ;
777+ } ) ;
778+ } ) ;
779+
780+ // ========== 19. 批量导入场景(Medium)==========
781+ describe ( '19. Batch Import Scenario (Medium)' , ( ) => {
782+ it ( '19.1 should work correctly in batch import scenario' , async ( ) => {
783+ // 模拟批量导入场景:插入 → 立即更新
784+
785+ // 第一步:批量插入(使用10个而不是50个)
786+ const docs = [ ] ;
787+ for ( let i = 0 ; i < 10 ; i ++ ) {
788+ docs . push ( {
789+ username : `user${ i } ` ,
790+ email : `user${ i } @example.com` ,
791+ status : 'imported'
792+ } ) ;
793+ }
794+
795+ const insertResult = await User . insertMany ( docs ) ;
796+ assert . strictEqual ( Object . keys ( insertResult . insertedIds ) . length , 10 ) ;
797+
798+ // 验证所有文档版本号为0
799+ let users = await User . find ( { status : 'imported' } ) ;
800+ assert . strictEqual ( users . length , 10 ) ;
801+ users . forEach ( u => assert . strictEqual ( u . version , 0 ) ) ;
802+
803+ // 第二步:立即批量更新(数据清洗/标准化)
804+ const updateResult = await User . updateMany (
805+ { status : 'imported' } ,
806+ { $set : { status : 'active' , verified : true } }
807+ ) ;
808+
809+ assert . strictEqual ( updateResult . matchedCount , 10 ) ;
810+ assert . strictEqual ( updateResult . modifiedCount , 10 ) ;
811+
812+ // 验证所有文档版本号递增到1
813+ users = await User . find ( { status : 'active' } ) ;
814+ assert . strictEqual ( users . length , 10 ) ;
815+ users . forEach ( u => {
816+ assert . strictEqual ( u . version , 1 , 'Version should be 1 after batch update' ) ;
817+ assert . strictEqual ( u . verified , true ) ;
818+ } ) ;
819+
820+ // 第三步:选择性更新
821+ const selectiveResult = await User . updateMany (
822+ { username : { $regex : '^user[0-4]$' } } , // 只更新 user0-user4
823+ { $set : { premium : true } }
824+ ) ;
825+
826+ assert . strictEqual ( selectiveResult . matchedCount , 5 ) ;
827+ assert . strictEqual ( selectiveResult . modifiedCount , 5 ) ;
828+
829+ // 验证部分文档版本号递增到2
830+ const premiumUsers = await User . find ( { premium : true } ) ;
831+ assert . strictEqual ( premiumUsers . length , 5 ) ;
832+ premiumUsers . forEach ( u => assert . strictEqual ( u . version , 2 ) ) ;
833+
834+ const regularUsers = await User . find ( { premium : { $ne : true } } ) ;
835+ assert . strictEqual ( regularUsers . length , 5 ) ;
836+ regularUsers . forEach ( u => assert . strictEqual ( u . version , 1 ) ) ;
837+ } ) ;
838+ } ) ;
583839} ) ;
584840
0 commit comments