From 73f08670612d89f728fd79e6c92bc0d3122fb5d8 Mon Sep 17 00:00:00 2001 From: Eli Boyarski Date: Fri, 10 Apr 2015 15:49:29 +0200 Subject: [PATCH] Unit Test - Unique Multikey Index Adds a unit test to exhibit the behavior of MongoDB when using a unique multikey index. MongoDB treats any missing unique multikey index value as NULL, thus throwing a Duplicate Key Error when saving multiple missing values. See #930 for more information. - Closes #930 - Closes #952 --- tests/fields/fields.py | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/tests/fields/fields.py b/tests/fields/fields.py index 7a99bd78..e9532a5a 100644 --- a/tests/fields/fields.py +++ b/tests/fields/fields.py @@ -3675,6 +3675,31 @@ class EmbeddedDocumentListFieldTestCase(unittest.TestCase): # deleted from the database self.assertEqual(number, 2) + def test_empty_list_embedded_documents_with_unique_field(self): + """ + Tests that only one document with an empty list of embedded documents + that have a unique field can be saved, but if the unique field is + also sparse than multiple documents with an empty list can be saved. + """ + class EmbeddedWithUnique(EmbeddedDocument): + number = IntField(unique=True) + + class A(Document): + my_list = ListField(EmbeddedDocumentField(EmbeddedWithUnique)) + + a1 = A(my_list=[]).save() + self.assertRaises(NotUniqueError, lambda: A(my_list=[]).save()) + + class EmbeddedWithSparseUnique(EmbeddedDocument): + number = IntField(unique=True, sparse=True) + + class B(Document): + my_list = ListField(EmbeddedDocumentField(EmbeddedWithSparseUnique)) + + b1 = B(my_list=[]).save() + b2 = B(my_list=[]).save() + + def test_filtered_delete(self): """ Tests the delete method of a List of Embedded Documents