diff --git a/tests/document/indexes.py b/tests/document/indexes.py index 6256cde3..b1ea3707 100644 --- a/tests/document/indexes.py +++ b/tests/document/indexes.py @@ -432,6 +432,7 @@ class IndexesTest(unittest.TestCase): class Test(Document): a = IntField() + b = IntField() meta = { 'indexes': ['a'], @@ -446,13 +447,30 @@ class IndexesTest(unittest.TestCase): # Need to be explicit about covered indexes as mongoDB doesn't know if # the documents returned might have more keys in that here. query_plan = Test.objects(id=obj.id).exclude('a').explain() - self.assertFalse(query_plan['indexOnly']) + if pymongo.version_tuple[0] < 3: + self.assertFalse(query_plan['indexOnly']) + else: + self.assertEqual(query_plan.get('queryPlanner').get('winningPlan').get('inputStage').get('stage'), 'IDHACK') query_plan = Test.objects(id=obj.id).only('id').explain() - self.assertTrue(query_plan['indexOnly']) + if pymongo.version_tuple[0] < 3: + self.assertTrue(query_plan['indexOnly']) + else: + self.assertEqual(query_plan.get('queryPlanner').get('winningPlan').get('inputStage').get('stage'), 'IDHACK') query_plan = Test.objects(a=1).only('a').exclude('id').explain() - self.assertTrue(query_plan['indexOnly']) + if pymongo.version_tuple[0] < 3: + self.assertTrue(query_plan['indexOnly']) + else: + self.assertEqual(query_plan.get('queryPlanner').get('winningPlan').get('inputStage').get('stage'), 'IXSCAN') + self.assertEqual(query_plan.get('queryPlanner').get('winningPlan').get('stage'), 'PROJECTION') + + query_plan = Test.objects(a=1).explain() + if pymongo.version_tuple[0] < 3: + self.assertFalse(query_plan['indexOnly']) + else: + self.assertEqual(query_plan.get('queryPlanner').get('winningPlan').get('inputStage').get('stage'), 'IXSCAN') + self.assertEqual(query_plan.get('queryPlanner').get('winningPlan').get('stage'), 'FETCH') def test_index_on_id(self): @@ -491,6 +509,9 @@ class IndexesTest(unittest.TestCase): self.assertEqual(BlogPost.objects.count(), 10) self.assertEqual(BlogPost.objects.hint().count(), 10) + # here we seem to have find a bug in PyMongo 3. + # The cursor first makes a SON out of the list of tuples + # Then later reuses it and wonders why is it not a list of tuples self.assertEqual(BlogPost.objects.hint([('tags', 1)]).count(), 10) self.assertEqual(BlogPost.objects.hint([('ZZ', 1)]).count(), 10)