Skip to content

Commit ffbb2c9

Browse files
committed
This is Additional tests for the container_class parameter of DynamicField
This tests DynamicField dereference with ordering guarantee.
1 parent 9cd3dcd commit ffbb2c9

File tree

1 file changed

+45
-5
lines changed

1 file changed

+45
-5
lines changed

tests/fields/fields.py

Lines changed: 45 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import math
66
import itertools
77
import re
8+
import pymongo
89

910
from nose.plugins.skip import SkipTest
1011
from collections import OrderedDict
@@ -26,9 +27,12 @@
2627
from mongoengine import *
2728
from mongoengine.connection import get_db
2829
from mongoengine.base import (BaseDict, BaseField, EmbeddedDocumentList,
29-
_document_registry)
30+
_document_registry, TopLevelDocumentMetaclass)
3031

31-
from tests.utils import MongoDBTestCase
32+
from tests.utils import MongoDBTestCase, MONGO_TEST_DB
33+
from mongoengine.python_support import IS_PYMONGO_3
34+
if IS_PYMONGO_3:
35+
from bson import CodecOptions
3236

3337
__all__ = ("FieldTest", "EmbeddedDocumentListFieldTestCase")
3438

@@ -4513,18 +4517,54 @@ class Doc(Document):
45134517

45144518
Doc.drop_collection()
45154519

4516-
doc = Doc(ordered_data=OrderedDict(raw_data),
4517-
unordered_data=dict(raw_data)).save()
4520+
doc = Doc(ordered_data=OrderedDict(raw_data), unordered_data=dict(raw_data)).save()
45184521

4522+
# checks that the data is in order
45194523
self.assertEqual(type(doc.ordered_data), OrderedDict)
45204524
self.assertEqual(type(doc.unordered_data), dict)
4521-
self.assertEqual([k for k,_ in doc.ordered_data.items()], ['d', 'c', 'b', 'a'])
4525+
self.assertEqual(','.join(doc.ordered_data.keys()), 'd,c,b,a')
4526+
4527+
# checks that the data is stored to the database in order
4528+
pymongo_db = pymongo.MongoClient()[MONGO_TEST_DB]
4529+
if IS_PYMONGO_3:
4530+
codec_option = CodecOptions(document_class=OrderedDict)
4531+
db_doc = pymongo_db.doc.with_options(codec_options=codec_option).find_one()
4532+
else:
4533+
db_doc = pymongo_db.doc.find_one(as_class=OrderedDict)
4534+
4535+
self.assertEqual(','.join(doc.ordered_data.keys()), 'd,c,b,a')
45224536

45234537
def test_dynamicfield_with_wrong_container_class(self):
45244538
with self.assertRaises(ValidationError):
45254539
class DocWithInvalidField:
45264540
data = DynamicField(container_class=list)
45274541

4542+
def test_dynamicfield_with_wrong_container_class_and_reload_docuemnt(self):
4543+
# This is because 'codec_options' is supported on pymongo3 or later
4544+
if IS_PYMONGO_3:
4545+
class OrderedDocument(Document):
4546+
my_metaclass = TopLevelDocumentMetaclass
4547+
__metaclass__ = TopLevelDocumentMetaclass
4548+
4549+
@classmethod
4550+
def _get_collection(cls):
4551+
collection = super(OrderedDocument, cls)._get_collection()
4552+
opts = CodecOptions(document_class=OrderedDict)
4553+
4554+
return collection.with_options(codec_options=opts)
4555+
4556+
raw_data = [('d', 1), ('c', 2), ('b', 3), ('a', 4)]
4557+
4558+
class Doc(OrderedDocument):
4559+
data = DynamicField(container_class=OrderedDict)
4560+
4561+
Doc.drop_collection()
4562+
4563+
doc = Doc(data=OrderedDict(raw_data)).save()
4564+
doc.reload()
4565+
4566+
self.assertEqual(type(doc.data), OrderedDict)
4567+
self.assertEqual(','.join(doc.data.keys()), 'd,c,b,a')
45284568

45294569
if __name__ == '__main__':
45304570
unittest.main()

0 commit comments

Comments
 (0)