Merge pull request #957 from noirbizarre/metastrict
Allow to loads undeclared field with meta attribute (fix #934)
This commit is contained in:
@@ -16,7 +16,8 @@ from tests.fixtures import (PickleEmbedded, PickleTest, PickleSignalsTest,
|
||||
|
||||
from mongoengine import *
|
||||
from mongoengine.errors import (NotRegistered, InvalidDocumentError,
|
||||
InvalidQueryError, NotUniqueError)
|
||||
InvalidQueryError, NotUniqueError,
|
||||
FieldDoesNotExist)
|
||||
from mongoengine.queryset import NULLIFY, Q
|
||||
from mongoengine.connection import get_db
|
||||
from mongoengine.base import get_document
|
||||
@@ -2467,6 +2468,114 @@ class InstanceTest(unittest.TestCase):
|
||||
group = Group.objects.first()
|
||||
self.assertEqual("hello - default", group.name)
|
||||
|
||||
def test_load_undefined_fields(self):
|
||||
class User(Document):
|
||||
name = StringField()
|
||||
|
||||
User.drop_collection()
|
||||
|
||||
User._get_collection().save({
|
||||
'name': 'John',
|
||||
'foo': 'Bar',
|
||||
'data': [1, 2, 3]
|
||||
})
|
||||
|
||||
self.assertRaises(FieldDoesNotExist, User.objects.first)
|
||||
|
||||
def test_load_undefined_fields_with_strict_false(self):
|
||||
class User(Document):
|
||||
name = StringField()
|
||||
|
||||
meta = {'strict': False}
|
||||
|
||||
User.drop_collection()
|
||||
|
||||
User._get_collection().save({
|
||||
'name': 'John',
|
||||
'foo': 'Bar',
|
||||
'data': [1, 2, 3]
|
||||
})
|
||||
|
||||
user = User.objects.first()
|
||||
self.assertEqual(user.name, 'John')
|
||||
self.assertFalse(hasattr(user, 'foo'))
|
||||
self.assertEqual(user._data['foo'], 'Bar')
|
||||
self.assertFalse(hasattr(user, 'data'))
|
||||
self.assertEqual(user._data['data'], [1, 2, 3])
|
||||
|
||||
def test_load_undefined_fields_on_embedded_document(self):
|
||||
class Thing(EmbeddedDocument):
|
||||
name = StringField()
|
||||
|
||||
class User(Document):
|
||||
name = StringField()
|
||||
thing = EmbeddedDocumentField(Thing)
|
||||
|
||||
User.drop_collection()
|
||||
|
||||
User._get_collection().save({
|
||||
'name': 'John',
|
||||
'thing': {
|
||||
'name': 'My thing',
|
||||
'foo': 'Bar',
|
||||
'data': [1, 2, 3]
|
||||
}
|
||||
})
|
||||
|
||||
self.assertRaises(FieldDoesNotExist, User.objects.first)
|
||||
|
||||
def test_load_undefined_fields_on_embedded_document_with_strict_false_on_doc(self):
|
||||
class Thing(EmbeddedDocument):
|
||||
name = StringField()
|
||||
|
||||
class User(Document):
|
||||
name = StringField()
|
||||
thing = EmbeddedDocumentField(Thing)
|
||||
|
||||
meta = {'strict': False}
|
||||
|
||||
User.drop_collection()
|
||||
|
||||
User._get_collection().save({
|
||||
'name': 'John',
|
||||
'thing': {
|
||||
'name': 'My thing',
|
||||
'foo': 'Bar',
|
||||
'data': [1, 2, 3]
|
||||
}
|
||||
})
|
||||
|
||||
self.assertRaises(FieldDoesNotExist, User.objects.first)
|
||||
|
||||
def test_load_undefined_fields_on_embedded_document_with_strict_false(self):
|
||||
class Thing(EmbeddedDocument):
|
||||
name = StringField()
|
||||
|
||||
meta = {'strict': False}
|
||||
|
||||
class User(Document):
|
||||
name = StringField()
|
||||
thing = EmbeddedDocumentField(Thing)
|
||||
|
||||
User.drop_collection()
|
||||
|
||||
User._get_collection().save({
|
||||
'name': 'John',
|
||||
'thing': {
|
||||
'name': 'My thing',
|
||||
'foo': 'Bar',
|
||||
'data': [1, 2, 3]
|
||||
}
|
||||
})
|
||||
|
||||
user = User.objects.first()
|
||||
self.assertEqual(user.name, 'John')
|
||||
self.assertEqual(user.thing.name, 'My thing')
|
||||
self.assertFalse(hasattr(user.thing, 'foo'))
|
||||
self.assertEqual(user.thing._data['foo'], 'Bar')
|
||||
self.assertFalse(hasattr(user.thing, 'data'))
|
||||
self.assertEqual(user.thing._data['data'], [1, 2, 3])
|
||||
|
||||
def test_spaces_in_keys(self):
|
||||
|
||||
class Embedded(DynamicEmbeddedDocument):
|
||||
|
||||
@@ -3195,7 +3195,7 @@ class FieldTest(unittest.TestCase):
|
||||
|
||||
def test_undefined_field_exception(self):
|
||||
"""Tests if a `FieldDoesNotExist` exception is raised when trying to
|
||||
set a value to a field that's not defined.
|
||||
instanciate a document with a field that's not defined.
|
||||
"""
|
||||
|
||||
class Doc(Document):
|
||||
@@ -3206,6 +3206,21 @@ class FieldTest(unittest.TestCase):
|
||||
|
||||
self.assertRaises(FieldDoesNotExist, test)
|
||||
|
||||
def test_undefined_field_exception_with_strict(self):
|
||||
"""Tests if a `FieldDoesNotExist` exception is raised when trying to
|
||||
instanciate a document with a field that's not defined,
|
||||
even when strict is set to False.
|
||||
"""
|
||||
|
||||
class Doc(Document):
|
||||
foo = StringField(db_field='f')
|
||||
meta = {'strict': False}
|
||||
|
||||
def test():
|
||||
Doc(bar='test')
|
||||
|
||||
self.assertRaises(FieldDoesNotExist, test)
|
||||
|
||||
|
||||
class EmbeddedDocumentListFieldTestCase(unittest.TestCase):
|
||||
|
||||
|
||||
Reference in New Issue
Block a user