#NEWLINE# def test_find_and_modify( self ) : #NEWLINE# #INDENT# c = self . db . test #NEWLINE# c . drop ( ) #NEWLINE# c . insert ( { #NEWLINE# #INDENT# '_id' : 1 , #NEWLINE# 'i' : 1 , #NEWLINE# #UNINDENT# } ) #NEWLINE# if client_context . version . at_least ( 2 , 2 ) : #NEWLINE# #INDENT# c . ensure_index ( 'i' , unique = True ) #NEWLINE# self . assertRaises ( DuplicateKeyError , c . find_and_modify , query = { #NEWLINE# #INDENT# 'i' : 1 , #NEWLINE# 'j' : 1 , #NEWLINE# #UNINDENT# } , update = { #NEWLINE# #INDENT# '$set' : { #NEWLINE# #INDENT# 'k' : 1 , #NEWLINE# #UNINDENT# } , #NEWLINE# #UNINDENT# } , upsert = True ) #NEWLINE# c . drop_indexes ( ) #NEWLINE# #UNINDENT# self . assertEqual ( { #NEWLINE# #INDENT# '_id' : 1 , #NEWLINE# 'i' : 1 , #NEWLINE# #UNINDENT# } , c . find_and_modify ( { #NEWLINE# #INDENT# '_id' : 1 , #NEWLINE# #UNINDENT# } , { #NEWLINE# #INDENT# '$inc' : { #NEWLINE# #INDENT# 'i' : 1 , #NEWLINE# #UNINDENT# } , #NEWLINE# #UNINDENT# } ) ) #NEWLINE# self . assertEqual ( { #NEWLINE# #INDENT# '_id' : 1 , #NEWLINE# 'i' : 3 , #NEWLINE# #UNINDENT# } , c . find_and_modify ( { #NEWLINE# #INDENT# '_id' : 1 , #NEWLINE# #UNINDENT# } , { #NEWLINE# #INDENT# '$inc' : { #NEWLINE# #INDENT# 'i' : 1 , #NEWLINE# #UNINDENT# } , #NEWLINE# #UNINDENT# } , new = True ) ) #NEWLINE# self . assertEqual ( { #NEWLINE# #INDENT# '_id' : 1 , #NEWLINE# 'i' : 3 , #NEWLINE# #UNINDENT# } , c . find_and_modify ( { #NEWLINE# #INDENT# '_id' : 1 , #NEWLINE# #UNINDENT# } , remove = True ) ) #NEWLINE# self . assertEqual ( None , c . find_one ( { #NEWLINE# #INDENT# '_id' : 1 , #NEWLINE# #UNINDENT# } ) ) #NEWLINE# self . assertEqual ( None , c . find_and_modify ( { #NEWLINE# #INDENT# '_id' : 1 , #NEWLINE# #UNINDENT# } , { #NEWLINE# #INDENT# '$inc' : { #NEWLINE# #INDENT# 'i' : 1 , #NEWLINE# #UNINDENT# } , #NEWLINE# #UNINDENT# } ) ) #NEWLINE# if client_context . version . at_least ( 2 , 1 , 2 ) : #NEWLINE# #INDENT# self . assertEqual ( None , c . find_and_modify ( { #NEWLINE# #INDENT# '_id' : 1 , #NEWLINE# #UNINDENT# } , { #NEWLINE# #INDENT# '$inc' : { #NEWLINE# #INDENT# 'i' : 1 , #NEWLINE# #UNINDENT# } , #NEWLINE# #UNINDENT# } , upsert = True ) ) #NEWLINE# #UNINDENT# else : #NEWLINE# #INDENT# self . assertEqual ( { #NEWLINE# #INDENT# #NEWLINE# #UNINDENT# } , c . find_and_modify ( { #NEWLINE# #INDENT# '_id' : 1 , #NEWLINE# #UNINDENT# } , { #NEWLINE# #INDENT# '$inc' : { #NEWLINE# #INDENT# 'i' : 1 , #NEWLINE# #UNINDENT# } , #NEWLINE# #UNINDENT# } , upsert = True ) ) #NEWLINE# #UNINDENT# self . assertEqual ( { #NEWLINE# #INDENT# '_id' : 1 , #NEWLINE# 'i' : 2 , #NEWLINE# #UNINDENT# } , c . find_and_modify ( { #NEWLINE# #INDENT# '_id' : 1 , #NEWLINE# #UNINDENT# } , { #NEWLINE# #INDENT# '$inc' : { #NEWLINE# #INDENT# 'i' : 1 , #NEWLINE# #UNINDENT# } , #NEWLINE# #UNINDENT# } , upsert = True , new = True ) ) #NEWLINE# self . assertEqual ( { #NEWLINE# #INDENT# '_id' : 1 , #NEWLINE# 'i' : 2 , #NEWLINE# #UNINDENT# } , c . find_and_modify ( { #NEWLINE# #INDENT# '_id' : 1 , #NEWLINE# #UNINDENT# } , { #NEWLINE# #INDENT# '$inc' : { #NEWLINE# #INDENT# 'i' : 1 , #NEWLINE# #UNINDENT# } , #NEWLINE# #UNINDENT# } , fields = [ 'i' ] ) ) #NEWLINE# self . assertEqual ( { #NEWLINE# #INDENT# '_id' : 1 , #NEWLINE# 'i' : 4 , #NEWLINE# #UNINDENT# } , c . find_and_modify ( { #NEWLINE# #INDENT# '_id' : 1 , #NEWLINE# #UNINDENT# } , { #NEWLINE# #INDENT# '$inc' : { #NEWLINE# #INDENT# 'i' : 1 , #NEWLINE# #UNINDENT# } , #NEWLINE# #UNINDENT# } , new = True , fields = { #NEWLINE# #INDENT# 'i' : 1 , #NEWLINE# #UNINDENT# } ) ) #NEWLINE# result = c . find_and_modify ( { #NEWLINE# #INDENT# '_id' : 1 , #NEWLINE# #UNINDENT# } , { #NEWLINE# #INDENT# '$inc' : { #NEWLINE# #INDENT# 'i' : 1 , #NEWLINE# #UNINDENT# } , #NEWLINE# #UNINDENT# } , new = True , upsert = True , full_response = True , fields = { #NEWLINE# #INDENT# 'i' : 1 , #NEWLINE# #UNINDENT# } ) #NEWLINE# self . assertEqual ( { #NEWLINE# #INDENT# '_id' : 1 , #NEWLINE# 'i' : 5 , #NEWLINE# #UNINDENT# } , result [ 'value' ] ) #NEWLINE# self . assertEqual ( True , self [ 'lastErrorObject' ] [ 'updatedExisting' ] ) #NEWLINE# result = c . find_and_modify ( { #NEWLINE# #INDENT# '_id' : 2 , #NEWLINE# #UNINDENT# } , { #NEWLINE# #INDENT# '$inc' : { #NEWLINE# #INDENT# 'i' : 1 , #NEWLINE# #UNINDENT# } , #NEWLINE# #UNINDENT# } , new = True , upsert = True , full_response = True , fields = { #NEWLINE# #INDENT# 'i' : 1 , #NEWLINE# #UNINDENT# } ) #NEWLINE# self . assertEqual ( { #NEWLINE# #INDENT# '_id' : 2 , #NEWLINE# 'i' : 1 , #NEWLINE# #UNINDENT# } , result [ 'value' ] ) #NEWLINE# self . assertEqual ( False , result [ 'lastErrorObject' ] [ 'updatedExisting' ] ) #NEWLINE# class ExtendedDict ( dict ) : #NEWLINE# #INDENT# pass #NEWLINE# #UNINDENT# result = c . find_and_modify ( { #NEWLINE# #INDENT# '_id' : 1 , #NEWLINE# #UNINDENT# } , { #NEWLINE# #INDENT# '$inc' : { #NEWLINE# #INDENT# 'i' : 1 , #NEWLINE# #UNINDENT# } , #NEWLINE# #UNINDENT# } , new = True , fields = { #NEWLINE# #INDENT# 'i' : 1 , #NEWLINE# #UNINDENT# } ) #NEWLINE# self . assertFalse ( isinstance ( result , ExtendedDict ) ) #NEWLINE# c = self . db . get_collection ( 'test' , codec_options = CodecOptions ( document_class = ExtendedDict ) ) #NEWLINE# result = c . find_and_modify ( { #NEWLINE# #INDENT# '_id' : 1 , #NEWLINE# #UNINDENT# } , { #NEWLINE# #INDENT# '$inc' : { #NEWLINE# #INDENT# 'i' : 1 , #NEWLINE# #UNINDENT# } , #NEWLINE# #UNINDENT# } , new = True , fields = { #NEWLINE# #INDENT# 'i' : 1 , #NEWLINE# #UNINDENT# } ) #NEWLINE# self . assertTrue ( isinstance ( result , ExtendedDict ) )