def test_complexe_field_clear_modified(self): @self.instance.register class MyEmbedded(EmbeddedDocument): aa = fields.IntField() class MySchema(EmbeddedSchema): # EmbeddedField need instance to retrieve implementation a = fields.EmbeddedField(MyEmbedded, instance=self.instance) b = fields.ListField(fields.IntField) d = DataProxy(MySchema()) d.load({'a': {'aa': 1}, 'b': [2, 3]}) assert d.to_mongo() == {'a': {'aa': 1}, 'b': [2, 3]} d.get('a').aa = 4 d.get('b').append(5) assert d.to_mongo(update=True) == { '$set': { 'a': { 'aa': 4 }, 'b': [2, 3, 5] } } d.clear_modified() assert d.to_mongo(update=True) is None assert not d.get('a').is_modified() assert not d.get('b').is_modified()
def test_modify(self): class MySchema(EmbeddedSchema): a = fields.IntField() b = fields.IntField(attribute='in_mongo_b') d = DataProxy(MySchema()) d.load({'a': 1, 'b': 2}) assert d.to_mongo() == {'a': 1, 'in_mongo_b': 2} assert d.to_mongo(update=True) is None d.set('a', 3) d.delete('b') assert d.to_mongo(update=True) == {'$set': {'a': 3}, '$unset': ['in_mongo_b']} d.clear_modified() assert d.to_mongo(update=True) is None assert d.to_mongo() == {'a': 3}
def test_complexe_field_clear_modified(self): class MyEmbedded(EmbeddedDocument): aa = fields.IntField() class MySchema(EmbeddedSchema): a = fields.EmbeddedField(MyEmbedded) b = fields.ListField(fields.IntField) d = DataProxy(MySchema()) d.load({'a': {'aa': 1}, 'b': [2, 3]}) assert d.to_mongo() == {'a': {'aa': 1}, 'b': [2, 3]} d.get('a').aa = 4 d.get('b').append(5) assert d.to_mongo(update=True) == {'$set': {'a': {'aa': 4}, 'b': [2, 3, 5]}} d.clear_modified() assert d.to_mongo(update=True) is None assert not d.get('a').is_modified() assert not d.get('b').is_modified()
def test_list(self): class MySchema(Schema): list = fields.ListField(fields.IntField(), attribute='in_mongo_list') d = DataProxy(MySchema()) assert d.to_mongo() == {} d.load({'list': [1, 2, 3]}) assert d.dump() == {'list': [1, 2, 3]} assert d.to_mongo() == {'in_mongo_list': [1, 2, 3]} assert d.get('list') == [1, 2, 3] d.get('list').append(4) assert d.to_mongo(update=True) == {'$set': {'in_mongo_list': [1, 2, 3, 4]}} d.clear_modified() d.set('list', [5, 6, 7]) assert d.dump() == {'list': [5, 6, 7]} assert d.to_mongo(update=True) == {'$set': {'in_mongo_list': [5, 6, 7]}} d.clear_modified() d.get('list').pop() assert d.dump() == {'list': [5, 6]} assert d.to_mongo(update=True) == {'$set': {'in_mongo_list': [5, 6]}} d.clear_modified() d.get('list').clear() assert d.dump() == {'list': []} assert d.to_mongo(update=True) == {'$unset': ['in_mongo_list']} d.set('list', [1, 2, 3]) d.clear_modified() d.get('list').remove(1) assert d.dump() == {'list': [2, 3]} assert d.to_mongo(update=True) == {'$set': {'in_mongo_list': [2, 3]}} d.clear_modified() d.get('list').reverse() assert d.dump() == {'list': [3, 2]} assert d.to_mongo(update=True) == {'$set': {'in_mongo_list': [3, 2]}} d.clear_modified() d.get('list').sort() assert d.dump() == {'list': [2, 3]} assert d.to_mongo(update=True) == {'$set': {'in_mongo_list': [2, 3]}} d.clear_modified() d.get('list').extend([4, 5]) assert d.dump() == {'list': [2, 3, 4, 5]} assert d.to_mongo(update=True) == {'$set': {'in_mongo_list': [2, 3, 4, 5]}} d2 = DataProxy(MySchema()) d2.from_mongo({}) assert isinstance(d2.get('list'), List) assert d2.to_mongo() == {} d2.get('list').append(1) assert d2.to_mongo() == {'in_mongo_list': [1]} assert d2.to_mongo(update=True) == {'$set': {'in_mongo_list': [1]}} # Test repr readability repr_d = repr(d.get('list')) assert repr_d == "<object umongo.data_objects.List([2, 3, 4, 5])>"
def test_list(self): class MySchema(Schema): list = fields.ListField(fields.IntField(), attribute='in_mongo_list') d = DataProxy(MySchema()) assert d.to_mongo() == {} d.load({'list': [1, 2, 3]}) assert d.dump() == {'list': [1, 2, 3]} assert d.to_mongo() == {'in_mongo_list': [1, 2, 3]} assert d.get('list') == [1, 2, 3] d.get('list').append(4) assert d.to_mongo(update=True) == { '$set': { 'in_mongo_list': [1, 2, 3, 4] } } d.clear_modified() d.set('list', [5, 6, 7]) assert d.dump() == {'list': [5, 6, 7]} assert d.to_mongo(update=True) == { '$set': { 'in_mongo_list': [5, 6, 7] } } d.clear_modified() d.get('list').pop() assert d.dump() == {'list': [5, 6]} assert d.to_mongo(update=True) == {'$set': {'in_mongo_list': [5, 6]}} d.clear_modified() d.get('list').clear() assert d.dump() == {'list': []} assert d.to_mongo(update=True) == {'$unset': ['in_mongo_list']} d.set('list', [1, 2, 3]) d.clear_modified() d.get('list').remove(1) assert d.dump() == {'list': [2, 3]} assert d.to_mongo(update=True) == {'$set': {'in_mongo_list': [2, 3]}} d.clear_modified() d.get('list').reverse() assert d.dump() == {'list': [3, 2]} assert d.to_mongo(update=True) == {'$set': {'in_mongo_list': [3, 2]}} d.clear_modified() d.get('list').sort() assert d.dump() == {'list': [2, 3]} assert d.to_mongo(update=True) == {'$set': {'in_mongo_list': [2, 3]}} d.clear_modified() d.get('list').extend([4, 5]) assert d.dump() == {'list': [2, 3, 4, 5]} assert d.to_mongo(update=True) == { '$set': { 'in_mongo_list': [2, 3, 4, 5] } } d2 = DataProxy(MySchema()) d2.from_mongo({}) assert isinstance(d2.get('list'), List) assert d2.to_mongo() == {} d2.get('list').append(1) assert d2.to_mongo() == {'in_mongo_list': [1]} assert d2.to_mongo(update=True) == {'$set': {'in_mongo_list': [1]}} # Test repr readability repr_d = repr(d.get('list')) assert repr_d == "<object umongo.data_objects.List([2, 3, 4, 5])>"
def test_complexe_list(self): @self.instance.register class MyEmbeddedDocument(EmbeddedDocument): field = fields.IntField() @self.instance.register class ToRefDoc(Document): pass @self.instance.register class MyDoc(Document): embeds = fields.ListField(fields.EmbeddedField(MyEmbeddedDocument)) refs = fields.ListField(fields.ReferenceField(ToRefDoc)) MySchema = MyDoc.Schema obj_id1 = ObjectId() obj_id2 = ObjectId() to_ref_doc1 = ToRefDoc.build_from_mongo(data={'_id': obj_id1}) d = DataProxy(MySchema()) d.load({ 'embeds': [MyEmbeddedDocument(field=1), { 'field': 2 }], 'refs': [to_ref_doc1, Reference(ToRefDoc, obj_id2)] }) assert d.to_mongo() == { 'embeds': [{ 'field': 1 }, { 'field': 2 }], 'refs': [obj_id1, obj_id2] } assert isinstance(d.get('embeds'), List) assert isinstance(d.get('refs'), List) for e in d.get('refs'): assert isinstance(e, Reference) for e in d.get('embeds'): assert isinstance(e, MyEmbeddedDocument) # Test list modification as well refs_list = d.get('refs') refs_list.append(to_ref_doc1) refs_list.extend([to_ref_doc1, Reference(ToRefDoc, obj_id2)]) for e in refs_list: assert isinstance(e, Reference) embeds_list = d.get('embeds') embeds_list.append(MyEmbeddedDocument(field=3)) embeds_list.extend([{'field': 4}, {'field': 5}]) for e in embeds_list: assert isinstance(e, MyEmbeddedDocument) # Modifying an EmbeddedDocument inside a list should count a list modification d.clear_modified() d.get('refs')[0] = obj_id2 assert d.to_mongo(update=True) == { '$set': { 'refs': [obj_id2, obj_id2, obj_id1, obj_id1, obj_id2] } } d.clear_modified() d.get('embeds')[1].field = 42 assert d.to_mongo(update=True) == { '$set': { 'embeds': [{ 'field': 1 }, { 'field': 42 }, { 'field': 3 }, { 'field': 4 }, { 'field': 5 }] } }