From 4acd7a5b752014a7d43f88f82dc569c65c8e58cc Mon Sep 17 00:00:00 2001 From: Stefan Wojcik Date: Sun, 26 Feb 2017 02:14:34 -0500 Subject: [PATCH] skip older mongodb decorator --- tests/document/indexes.py | 5 ++-- tests/queryset/geo.py | 6 ++-- tests/queryset/queryset.py | 61 ++++++++++---------------------------- tests/utils.py | 32 +++++++++++++++++--- 4 files changed, 50 insertions(+), 54 deletions(-) diff --git a/tests/document/indexes.py b/tests/document/indexes.py index 1bd750e0..88352ef7 100644 --- a/tests/document/indexes.py +++ b/tests/document/indexes.py @@ -9,7 +9,7 @@ import pymongo from mongoengine import * from mongoengine.connection import get_db -from tests.utils import get_mongodb_version, skip_in_old_mongodb +from tests.utils import get_mongodb_version, skip_older_mongodb __all__ = ("IndexesTest", ) @@ -865,9 +865,8 @@ class IndexesTest(unittest.TestCase): info['provider_ids.foo_1_provider_ids.bar_1']['key']) self.assertTrue(info['provider_ids.foo_1_provider_ids.bar_1']['sparse']) + @skip_older_mongodb def test_text_indexes(self): - skip_in_old_mongodb('Text search is disabled by default in MongoDB < v2.6') - class Book(Document): title = DictField() meta = { diff --git a/tests/queryset/geo.py b/tests/queryset/geo.py index 8811890e..45f4db4d 100644 --- a/tests/queryset/geo.py +++ b/tests/queryset/geo.py @@ -7,7 +7,7 @@ from pymongo.errors import OperationFailure from mongoengine import * from mongoengine.connection import get_connection -from tests.utils import MongoDBTestCase, skip_in_old_mongodb +from tests.utils import MongoDBTestCase, get_mongodb_version __all__ = ("GeoQueriesTest",) @@ -314,7 +314,9 @@ class GeoQueriesTest(MongoDBTestCase): self.assertEqual(events.count(), 0) # $minDistance was only added in MongoDB v2.6, skip for older versions - skip_in_old_mongodb('Need MongoDB v2.6+') + mongodb_ver = get_mongodb_ver() + if mongodb_ver[0] == 2 and mongodb_ver[1] < 6: + raise SkipTest('Need MongoDB v2.6+') # ensure min_distance and max_distance combine well events = Event.objects(location__near=[-87.67892, 41.9120459], diff --git a/tests/queryset/queryset.py b/tests/queryset/queryset.py index c2885579..ae608bdb 100644 --- a/tests/queryset/queryset.py +++ b/tests/queryset/queryset.py @@ -19,7 +19,8 @@ from mongoengine.python_support import IS_PYMONGO_3 from mongoengine.queryset import (DoesNotExist, MultipleObjectsReturned, QuerySet, QuerySetManager, queryset_manager) -from tests.utils import skip_in_old_mongodb +from tests.utils import skip_older_mongodb, skip_pymongo3 + __all__ = ("QuerySetTest",) @@ -34,37 +35,6 @@ class db_ops_tracker(query_counter): return list(self.db.system.profile.find(ignore_query)) -def skip_older_mongodb(f): - def _inner(*args, **kwargs): - connection = get_connection() - info = connection.test.command('buildInfo') - mongodb_version = tuple([int(i) for i in info['version'].split('.')]) - - if mongodb_version < (2, 6): - raise SkipTest("Need MongoDB version 2.6+") - - return f(*args, **kwargs) - - _inner.__name__ = f.__name__ - _inner.__doc__ = f.__doc__ - - return _inner - - -def skip_pymongo3(f): - def _inner(*args, **kwargs): - - if IS_PYMONGO_3: - raise SkipTest("Useless with PyMongo 3+") - - return f(*args, **kwargs) - - _inner.__name__ = f.__name__ - _inner.__doc__ = f.__doc__ - - return _inner - - class QuerySetTest(unittest.TestCase): def setUp(self): @@ -601,9 +571,8 @@ class QuerySetTest(unittest.TestCase): self.assertEqual(post.comments[0].by, 'joe') self.assertEqual(post.comments[0].votes.score, 4) + @skip_older_mongodb def test_update_min_max(self): - skip_in_old_mongodb('$min is not supported in MongoDB < v2.6') - class Scores(Document): high_score = IntField() low_score = IntField() @@ -615,6 +584,11 @@ class QuerySetTest(unittest.TestCase): Scores.objects(id=scores.id).update(min__low_score=250) self.assertEqual(Scores.objects.get(id=scores.id).low_score, 150) + Scores.objects(id=scores.id).update(max__high_score=250) + self.assertEqual(Scores.objects.get(id=scores.id).low_score, 250) + Scores.objects(id=scores.id).update(max__high_score=100) + self.assertEqual(Scores.objects.get(id=scores.id).low_score, 250) + def test_updates_can_have_match_operators(self): class Comment(EmbeddedDocument): @@ -4896,6 +4870,7 @@ class QuerySetTest(unittest.TestCase): self.assertTrue(Person.objects._has_data(), 'Cursor has data and returned False') + @skip_older_mongodb def test_queryset_aggregation_framework(self): class Person(Document): name = StringField() @@ -4930,17 +4905,13 @@ class QuerySetTest(unittest.TestCase): {'_id': p1.pk, 'name': "ISABELLA LUANNA"} ]) - data = Person.objects( - age__gte=17, age__lte=40).order_by('-age').aggregate( - {'$group': { - '_id': None, - 'total': {'$sum': 1}, - 'avg': {'$avg': '$age'} - } - } - - ) - + data = Person.objects(age__gte=17, age__lte=40).order_by('-age').aggregate({ + '$group': { + '_id': None, + 'total': {'$sum': 1}, + 'avg': {'$avg': '$age'} + } + }) self.assertEqual(list(data), [ {'_id': None, 'avg': 29, 'total': 2} ]) diff --git a/tests/utils.py b/tests/utils.py index 52d4a3bd..0472a2b4 100644 --- a/tests/utils.py +++ b/tests/utils.py @@ -4,6 +4,7 @@ from nose.plugins.skip import SkipTest from mongoengine import connect from mongoengine.connection import get_db, get_connection +from mongoengine.python_support import IS_PYMONGO_3 MONGO_TEST_DB = 'mongoenginetest' @@ -32,10 +33,33 @@ def get_mongodb_version(): return get_connection().server_info()['versionArray'] -def skip_in_old_mongodb(msg): +def skip_older_mongodb(f): """Raise a SkipTest exception with a given message if we're working with MongoDB version lower than v2.6. """ - mongodb_ver = get_mongodb_version() - if mongodb_ver[0] == 2 and mongodb_ver[1] < 6: - raise SkipTest(msg) + def _inner(*args, **kwargs): + mongodb_ver = get_mongodb_version() + if mongodb_ver[0] == 2 and mongodb_ver[1] < 6: + raise SkipTest('Need MongoDB v2.6+') + return f(*args, **kwargs) + + _inner.__name__ = f.__name__ + _inner.__doc__ = f.__doc__ + + return _inner + + +def skip_pymongo3(f): + """Raise a SkipTest exception if we're running a test against + PyMongo v3.x. + """ + def _inner(*args, **kwargs): + if IS_PYMONGO_3: + raise SkipTest("Useless with PyMongo 3+") + return f(*args, **kwargs) + + _inner.__name__ = f.__name__ + _inner.__doc__ = f.__doc__ + + return _inner +