From cd2d9517a034d0534a87520cf84daacad5b07fd3 Mon Sep 17 00:00:00 2001 From: Axel Haustant Date: Mon, 13 Apr 2015 17:49:08 +0200 Subject: [PATCH] Added 'strict' meta parameter --- mongoengine/base/document.py | 2 +- tests/document/instance.py | 114 ++++++++++++++++++++++++++++++++++- tests/fields/fields.py | 2 +- 3 files changed, 115 insertions(+), 3 deletions(-) diff --git a/mongoengine/base/document.py b/mongoengine/base/document.py index 33a6d826..0ca3fcde 100644 --- a/mongoengine/base/document.py +++ b/mongoengine/base/document.py @@ -72,7 +72,7 @@ class BaseDocument(object): # Check if there are undefined fields supplied, if so raise an # Exception. - if not self._dynamic: + if not self._dynamic and self._meta.get('strict', True): for var in values.keys(): if var not in self._fields.keys() + ['id', 'pk', '_cls', '_text_score']: msg = ( diff --git a/tests/document/instance.py b/tests/document/instance.py index 10e38d49..6a34b749 100644 --- a/tests/document/instance.py +++ b/tests/document/instance.py @@ -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,117 @@ 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] + }) + + with 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] + } + }) + + with 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] + } + }) + + with 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): diff --git a/tests/fields/fields.py b/tests/fields/fields.py index 5e7f34b5..887291db 100644 --- a/tests/fields/fields.py +++ b/tests/fields/fields.py @@ -3160,7 +3160,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):