diff --git a/tests/document/indexes.py b/tests/document/indexes.py index 88352ef7..5d219eda 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_older_mongodb +from tests.utils import get_mongodb_version, needs_mongodb_v26 __all__ = ("IndexesTest", ) @@ -865,7 +865,7 @@ 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 + @needs_mongodb_v26 def test_text_indexes(self): class Book(Document): title = DictField() diff --git a/tests/queryset/geo.py b/tests/queryset/geo.py index b6e602fc..51a32382 100644 --- a/tests/queryset/geo.py +++ b/tests/queryset/geo.py @@ -3,7 +3,7 @@ import unittest from mongoengine import * -from tests.utils import MongoDBTestCase, skip_older_mongodb +from tests.utils import MongoDBTestCase, needs_mongodb_v3 __all__ = ("GeoQueriesTest",) @@ -70,8 +70,9 @@ class GeoQueriesTest(MongoDBTestCase): self.assertEqual(events.count(), 1) self.assertEqual(events[0], event2) - # $minDistance was only added in MongoDB v2.6, skip for older versions - @skip_older_mongodb + # $minDistance was added in MongoDB v2.6, but continued being buggy + # until v3.0; skip for older versions + @needs_mongodb_v3 def test_near_and_min_distance(self): """Ensure the "min_distance" operator works alongside the "near" operator. @@ -242,8 +243,9 @@ class GeoQueriesTest(MongoDBTestCase): events = self.Event.objects(location__geo_within_polygon=polygon2) self.assertEqual(events.count(), 0) - # $minDistance was only added in MongoDB v2.6, skip for older versions - @skip_older_mongodb + # $minDistance was added in MongoDB v2.6, but continued being buggy + # until v3.0; skip for older versions + @needs_mongodb_v3 def test_2dsphere_near_and_min_max_distance(self): """Ensure "min_distace" and "max_distance" operators work well together with the "near" operator in a 2dsphere index. @@ -327,7 +329,7 @@ class GeoQueriesTest(MongoDBTestCase): self._test_embedded(point_field_class=PointField) # Needs MongoDB > 2.6.4 https://jira.mongodb.org/browse/SERVER-14039 - @skip_older_mongodb + @needs_mongodb_v3 def test_spherical_geospatial_operators(self): """Ensure that spherical geospatial queries are working.""" class Point(Document): diff --git a/tests/queryset/queryset.py b/tests/queryset/queryset.py index 42dd2cb3..b496e04a 100644 --- a/tests/queryset/queryset.py +++ b/tests/queryset/queryset.py @@ -19,7 +19,7 @@ from mongoengine.python_support import IS_PYMONGO_3 from mongoengine.queryset import (DoesNotExist, MultipleObjectsReturned, QuerySet, QuerySetManager, queryset_manager) -from tests.utils import skip_older_mongodb, skip_pymongo3 +from tests.utils import needs_mongodb_v26, skip_pymongo3 __all__ = ("QuerySetTest",) @@ -571,7 +571,7 @@ class QuerySetTest(unittest.TestCase): self.assertEqual(post.comments[0].by, 'joe') self.assertEqual(post.comments[0].votes.score, 4) - @skip_older_mongodb + @needs_mongodb_v26 def test_update_min_max(self): class Scores(Document): high_score = IntField() @@ -991,7 +991,7 @@ class QuerySetTest(unittest.TestCase): self.assertEqual(person.name, "User A") self.assertEqual(person.age, 20) - @skip_older_mongodb + @needs_mongodb_v26 @skip_pymongo3 def test_cursor_args(self): """Ensures the cursor args can be set as expected @@ -3108,7 +3108,7 @@ class QuerySetTest(unittest.TestCase): self.assertEqual(Foo.objects.distinct("bar"), [bar]) - @skip_older_mongodb + @needs_mongodb_v26 def test_text_indexes(self): class News(Document): title = StringField() @@ -3195,7 +3195,7 @@ class QuerySetTest(unittest.TestCase): 'brasil').order_by('$text_score').first() self.assertEqual(item.get_text_score(), max_text_score) - @skip_older_mongodb + @needs_mongodb_v26 def test_distinct_handles_references_to_alias(self): register_connection('testdb', 'mongoenginetest2') @@ -4870,7 +4870,7 @@ class QuerySetTest(unittest.TestCase): self.assertTrue(Person.objects._has_data(), 'Cursor has data and returned False') - @skip_older_mongodb + @needs_mongodb_v26 def test_queryset_aggregation_framework(self): class Person(Document): name = StringField() diff --git a/tests/utils.py b/tests/utils.py index 0472a2b4..cf0e9f84 100644 --- a/tests/utils.py +++ b/tests/utils.py @@ -32,22 +32,35 @@ def get_mongodb_version(): """ return get_connection().server_info()['versionArray'] - -def skip_older_mongodb(f): - """Raise a SkipTest exception with a given message if we're working - with MongoDB version lower than v2.6. +def _decorated_with_ver_requirement(func, ver_tuple): + """Return a given function decorated with the version requirement + for a particular MongoDB version tuple. """ 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) + if mongodb_ver >= ver_tuple: + return func(*args, **kwargs) - _inner.__name__ = f.__name__ - _inner.__doc__ = f.__doc__ + raise SkipTest('Needs MongoDB v{}+'.format( + '.'.join([str(v) for v in ver_tuple]) + )) + + _inner.__name__ = func.__name__ + _inner.__doc__ = func.__doc__ return _inner +def needs_mongodb_v26(func): + """Raise a SkipTest exception if we're working with MongoDB version + lower than v2.6. + """ + return _decorated_with_ver_requirement(func, (2, 6)) + +def needs_mongodb_v3(func): + """Raise a SkipTest exception if we're working with MongoDB version + lower than v3.0. + """ + return _decorated_with_ver_requirement(func, (3, 0)) def skip_pymongo3(f): """Raise a SkipTest exception if we're running a test against