|
5 | 5 | import math |
6 | 6 | import itertools |
7 | 7 | import re |
| 8 | +import pymongo |
8 | 9 |
|
9 | 10 | from nose.plugins.skip import SkipTest |
10 | 11 | from collections import OrderedDict |
|
26 | 27 | from mongoengine import * |
27 | 28 | from mongoengine.connection import get_db |
28 | 29 | from mongoengine.base import (BaseDict, BaseField, EmbeddedDocumentList, |
29 | | - _document_registry) |
| 30 | + _document_registry, TopLevelDocumentMetaclass) |
30 | 31 |
|
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 |
32 | 36 |
|
33 | 37 | __all__ = ("FieldTest", "EmbeddedDocumentListFieldTestCase") |
34 | 38 |
|
@@ -4513,18 +4517,54 @@ class Doc(Document): |
4513 | 4517 |
|
4514 | 4518 | Doc.drop_collection() |
4515 | 4519 |
|
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() |
4518 | 4521 |
|
| 4522 | + # checks that the data is in order |
4519 | 4523 | self.assertEqual(type(doc.ordered_data), OrderedDict) |
4520 | 4524 | 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') |
4522 | 4536 |
|
4523 | 4537 | def test_dynamicfield_with_wrong_container_class(self): |
4524 | 4538 | with self.assertRaises(ValidationError): |
4525 | 4539 | class DocWithInvalidField: |
4526 | 4540 | data = DynamicField(container_class=list) |
4527 | 4541 |
|
| 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') |
4528 | 4568 |
|
4529 | 4569 | if __name__ == '__main__': |
4530 | 4570 | unittest.main() |
0 commit comments