@@ -683,6 +683,46 @@ func (s *S) TestUpdate(c *C) {
683683 c .Assert (err , Equals , mgo .ErrNotFound )
684684}
685685
686+ func (s * S ) TestUpdateWithChangeInfo (c * C ) {
687+ session , err := mgo .Dial ("localhost:40001" )
688+ c .Assert (err , IsNil )
689+ defer session .Close ()
690+
691+ coll := session .DB ("mydb" ).C ("mycoll" )
692+
693+ ns := []int {40 , 41 , 42 , 43 , 44 , 45 , 46 }
694+ for _ , n := range ns {
695+ err := coll .Insert (M {"k" : n , "n" : n })
696+ c .Assert (err , IsNil )
697+ }
698+
699+ // No changes is a no-op and shouldn't return an error.
700+ info , err := coll .UpdateWithChangeInfo (M {"k" : 42 }, M {"$set" : M {"n" : 42 }})
701+ c .Assert (err , IsNil )
702+ c .Assert (info .Matched , Equals , 1 )
703+ c .Assert (info .Updated , Equals , 0 )
704+ c .Assert (info .Removed , Equals , 0 )
705+ c .Assert (info .UpsertedId , IsNil )
706+
707+ info , err = coll .UpdateWithChangeInfo (M {"k" : 42 }, M {"$inc" : M {"n" : 1 }})
708+ c .Assert (err , IsNil )
709+ c .Assert (info .Matched , Equals , 1 )
710+ c .Assert (info .Updated , Equals , 1 )
711+ c .Assert (info .Removed , Equals , 0 )
712+ c .Assert (info .UpsertedId , IsNil )
713+
714+ result := make (M )
715+ err = coll .Find (M {"k" : 42 }).One (result )
716+ c .Assert (err , IsNil )
717+ c .Assert (result ["n" ], Equals , 43 )
718+
719+ info , err = coll .UpdateWithChangeInfo (M {"k" : 47 }, M {"k" : 47 , "n" : 47 })
720+ c .Assert (err , Equals , mgo .ErrNotFound )
721+
722+ err = coll .Find (M {"k" : 47 }).One (result )
723+ c .Assert (err , Equals , mgo .ErrNotFound )
724+ }
725+
686726func (s * S ) TestUpdateId (c * C ) {
687727 session , err := mgo .Dial ("localhost:40001" )
688728 c .Assert (err , IsNil )
@@ -986,6 +1026,39 @@ func (s *S) TestRemove(c *C) {
9861026 c .Assert (result .N , Equals , 44 )
9871027}
9881028
1029+ func (s * S ) TestRemoveWithChangeInfo (c * C ) {
1030+ session , err := mgo .Dial ("localhost:40001" )
1031+ c .Assert (err , IsNil )
1032+ defer session .Close ()
1033+
1034+ coll := session .DB ("mydb" ).C ("mycoll" )
1035+
1036+ ns := []int {40 , 41 , 42 , 43 , 44 , 45 , 46 }
1037+ for _ , n := range ns {
1038+ err := coll .Insert (M {"n" : n })
1039+ c .Assert (err , IsNil )
1040+ }
1041+
1042+ info , err := coll .RemoveWithChangeInfo (M {"n" : M {"$gt" : 42 }})
1043+ c .Assert (err , IsNil )
1044+ c .Assert (info .Removed , Equals , 1 )
1045+ c .Assert (info .Matched , Equals , 1 )
1046+ c .Assert (info .Updated , Equals , 0 )
1047+ c .Assert (info .UpsertedId , IsNil )
1048+
1049+ result := & struct { N int }{}
1050+ err = coll .Find (M {"n" : 42 }).One (result )
1051+ c .Assert (err , IsNil )
1052+ c .Assert (result .N , Equals , 42 )
1053+
1054+ err = coll .Find (M {"n" : 43 }).One (result )
1055+ c .Assert (err , Equals , mgo .ErrNotFound )
1056+
1057+ err = coll .Find (M {"n" : 44 }).One (result )
1058+ c .Assert (err , IsNil )
1059+ c .Assert (result .N , Equals , 44 )
1060+ }
1061+
9891062func (s * S ) TestRemoveId (c * C ) {
9901063 session , err := mgo .Dial ("localhost:40001" )
9911064 c .Assert (err , IsNil )
0 commit comments