@@ -683,6 +683,46 @@ func (s *S) TestUpdate(c *C) {
683
683
c .Assert (err , Equals , mgo .ErrNotFound )
684
684
}
685
685
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
+
686
726
func (s * S ) TestUpdateId (c * C ) {
687
727
session , err := mgo .Dial ("localhost:40001" )
688
728
c .Assert (err , IsNil )
@@ -986,6 +1026,39 @@ func (s *S) TestRemove(c *C) {
986
1026
c .Assert (result .N , Equals , 44 )
987
1027
}
988
1028
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
+
989
1062
func (s * S ) TestRemoveId (c * C ) {
990
1063
session , err := mgo .Dial ("localhost:40001" )
991
1064
c .Assert (err , IsNil )
0 commit comments