소스 검색

100% coverage for mongodb backend

Ask Solem 13 년 전
부모
커밋
2041a87fbb

+ 3 - 3
celery/backends/mongodb.py

@@ -6,8 +6,8 @@ from datetime import datetime
 
 
 try:
 try:
     import pymongo
     import pymongo
-except ImportError:
+except ImportError:  # pragma: no cover
-    pymongo = None  # noqa
+    pymongo = None   # noqa
 
 
 from kombu.utils import cached_property
 from kombu.utils import cached_property
 
 
@@ -18,7 +18,7 @@ from celery.utils.timeutils import maybe_timedelta
 from .base import BaseDictBackend
 from .base import BaseDictBackend
 
 
 
 
-class Bunch:
+class Bunch(object):
 
 
     def __init__(self, **kw):
     def __init__(self, **kw):
         self.__dict__.update(kw)
         self.__dict__.update(kw)

+ 8 - 5
celery/events/cursesmon.py

@@ -35,8 +35,11 @@ TIMESTAMP_WIDTH = 8
 MIN_WORKER_WIDTH = 15
 MIN_WORKER_WIDTH = 15
 MIN_TASK_WIDTH = 16
 MIN_TASK_WIDTH = 16
 
 
+# this module is considered experimental
+# we don't care about coverage.
 
 
-class CursesMonitor(object):
+
+class CursesMonitor(object):  # pragma: no cover
     keymap = {}
     keymap = {}
     win = None
     win = None
     screen_width = None
     screen_width = None
@@ -459,7 +462,7 @@ class CursesMonitor(object):
                         if w.alive]
                         if w.alive]
 
 
 
 
-class DisplayThread(threading.Thread):
+class DisplayThread(threading.Thread):  # pragma: no cover
 
 
     def __init__(self, display):
     def __init__(self, display):
         self.display = display
         self.display = display
@@ -472,7 +475,7 @@ class DisplayThread(threading.Thread):
             self.display.nap()
             self.display.nap()
 
 
 
 
-def capture_events(app, state, display):
+def capture_events(app, state, display):  # pragma: no cover
 
 
     def on_connection_error(exc, interval):
     def on_connection_error(exc, interval):
         sys.stderr.write("Connection Error: %r. Retry in %ss." % (
         sys.stderr.write("Connection Error: %r. Retry in %ss." % (
@@ -493,7 +496,7 @@ def capture_events(app, state, display):
                 sys.stderr.write("Connection lost: %r" % (exc, ))
                 sys.stderr.write("Connection lost: %r" % (exc, ))
 
 
 
 
-def evtop(app=None):
+def evtop(app=None):  # pragma: no cover
     app = app_or_default(app)
     app = app_or_default(app)
     state = app.events.State()
     state = app.events.State()
     display = CursesMonitor(state, app=app)
     display = CursesMonitor(state, app=app)
@@ -513,5 +516,5 @@ def evtop(app=None):
         display.resetscreen()
         display.resetscreen()
 
 
 
 
-if __name__ == "__main__":
+if __name__ == "__main__":  # pragma: no cover
     evtop()
     evtop()

+ 59 - 12
celery/tests/test_backends/test_mongodb.py

@@ -1,14 +1,19 @@
 from __future__ import absolute_import
 from __future__ import absolute_import
+from __future__ import with_statement
 
 
 import datetime
 import datetime
 import uuid
 import uuid
 
 
 from mock import MagicMock, Mock, patch, sentinel
 from mock import MagicMock, Mock, patch, sentinel
 from nose import SkipTest
 from nose import SkipTest
+from pickle import loads, dumps
 
 
+from celery import Celery
 from celery import states
 from celery import states
-from celery.backends.mongodb import MongoBackend
+from celery.backends import mongodb as module
-from celery.tests.utils import Case
+from celery.backends.mongodb import MongoBackend, Bunch
+from celery.exceptions import ImproperlyConfigured
+from celery.tests.utils import AppCase
 
 
 
 
 try:
 try:
@@ -27,7 +32,7 @@ MONGODB_DATABASE = "testing"
 MONGODB_COLLECTION = "collection1"
 MONGODB_COLLECTION = "collection1"
 
 
 
 
-class test_MongoBackend(Case):
+class test_MongoBackend(AppCase):
 
 
     def setUp(self):
     def setUp(self):
         if pymongo is None:
         if pymongo is None:
@@ -49,22 +54,54 @@ class test_MongoBackend(Case):
         binary.Binary = self._reset["Binary"]
         binary.Binary = self._reset["Binary"]
         datetime.datetime = self._reset["datetime"]
         datetime.datetime = self._reset["datetime"]
 
 
+    def test_Bunch(self):
+        x = Bunch(foo="foo", bar=2)
+        self.assertEqual(x.foo, "foo")
+        self.assertEqual(x.bar, 2)
+
+    def test_init_no_mongodb(self):
+        prev, module.pymongo = module.pymongo, None
+        try:
+            with self.assertRaises(ImproperlyConfigured):
+                MongoBackend()
+        finally:
+            module.pymongo = prev
+
+    def test_init_no_settings(self):
+        celery = Celery(set_as_current=False)
+        celery.conf.CELERY_MONGODB_BACKEND_SETTINGS = []
+        with self.assertRaises(ImproperlyConfigured):
+            MongoBackend(app=celery)
+
+    def test_init_settings_is_None(self):
+        celery = Celery(set_as_current=False)
+        celery.conf.CELERY_MONGODB_BACKEND_SETTINGS = None
+        MongoBackend(app=celery)
+
+    def test_restore_taskset_no_entry(self):
+        x = MongoBackend()
+        x.collection = Mock()
+        fo = x.collection.find_one = Mock()
+        fo.return_value = None
+        self.assertIsNone(x._restore_taskset("1f3fab"))
+
+    def test_reduce(self):
+        x = MongoBackend()
+        self.assertTrue(loads(dumps(x)))
+
     def test_get_connection_connection_exists(self):
     def test_get_connection_connection_exists(self):
 
 
-        @patch("pymongo.connection.Connection")
+        with patch("pymongo.connection.Connection") as mock_Connection:
-        def do_test(mock_Connection):
             self.backend._connection = sentinel._connection
             self.backend._connection = sentinel._connection
 
 
             connection = self.backend._get_connection()
             connection = self.backend._get_connection()
 
 
             self.assertEquals(sentinel._connection, connection)
             self.assertEquals(sentinel._connection, connection)
             self.assertFalse(mock_Connection.called)
             self.assertFalse(mock_Connection.called)
-        do_test()
 
 
     def test_get_connection_no_connection_host(self):
     def test_get_connection_no_connection_host(self):
 
 
-        @patch("pymongo.connection.Connection")
+        with patch("pymongo.connection.Connection") as mock_Connection:
-        def do_test(mock_Connection):
             self.backend._connection = None
             self.backend._connection = None
             self.backend.mongodb_host = MONGODB_HOST
             self.backend.mongodb_host = MONGODB_HOST
             self.backend.mongodb_port = MONGODB_PORT
             self.backend.mongodb_port = MONGODB_PORT
@@ -74,12 +111,10 @@ class test_MongoBackend(Case):
             mock_Connection.assert_called_once_with(
             mock_Connection.assert_called_once_with(
                 MONGODB_HOST, MONGODB_PORT)
                 MONGODB_HOST, MONGODB_PORT)
             self.assertEquals(sentinel.connection, connection)
             self.assertEquals(sentinel.connection, connection)
-        do_test()
 
 
     def test_get_connection_no_connection_mongodb_uri(self):
     def test_get_connection_no_connection_mongodb_uri(self):
 
 
-        @patch("pymongo.connection.Connection")
+        with patch("pymongo.connection.Connection") as mock_Connection:
-        def do_test(mock_Connection):
             mongodb_uri = "mongodb://%s:%d" % (MONGODB_HOST, MONGODB_PORT)
             mongodb_uri = "mongodb://%s:%d" % (MONGODB_HOST, MONGODB_PORT)
             self.backend._connection = None
             self.backend._connection = None
             self.backend.mongodb_host = mongodb_uri
             self.backend.mongodb_host = mongodb_uri
@@ -89,7 +124,6 @@ class test_MongoBackend(Case):
             connection = self.backend._get_connection()
             connection = self.backend._get_connection()
             mock_Connection.assert_called_once_with(mongodb_uri)
             mock_Connection.assert_called_once_with(mongodb_uri)
             self.assertEquals(sentinel.connection, connection)
             self.assertEquals(sentinel.connection, connection)
-        do_test()
 
 
     @patch("celery.backends.mongodb.MongoBackend._get_connection")
     @patch("celery.backends.mongodb.MongoBackend._get_connection")
     def test_get_database_no_existing(self, mock_get_connection):
     def test_get_database_no_existing(self, mock_get_connection):
@@ -280,3 +314,16 @@ class test_MongoBackend(Case):
         mock_database.__getitem__.assert_called_once_with(
         mock_database.__getitem__.assert_called_once_with(
             MONGODB_COLLECTION)
             MONGODB_COLLECTION)
         mock_collection.assert_called_once()
         mock_collection.assert_called_once()
+
+    def test_get_database_authfailure(self):
+        x = MongoBackend()
+        x._get_connection = Mock()
+        conn = x._get_connection.return_value = {}
+        db = conn[x.mongodb_database] = Mock()
+        db.authenticate.return_value = False
+        x.mongodb_user = "jerry"
+        x.mongodb_password = "cere4l"
+        with self.assertRaises(ImproperlyConfigured):
+            x._get_database()
+        db.authenticate.assert_called_with("jerry", "cere4l")
+

+ 7 - 11
celery/tests/test_concurrency/test_concurrency_eventlet.py

@@ -14,7 +14,7 @@ from celery.concurrency.eventlet import (
     TaskPool,
     TaskPool,
 )
 )
 
 
-from celery.tests.utils import Case, mock_module
+from celery.tests.utils import Case, mock_module, patch_many
 
 
 
 
 class EventletCase(Case):
 class EventletCase(Case):
@@ -59,9 +59,9 @@ class test_Schedule(Case):
 
 
     def test_sched(self):
     def test_sched(self):
         with mock_module(*eventlet_modules):
         with mock_module(*eventlet_modules):
-            @patch("eventlet.greenthread.spawn_after")
+            with patch_many("eventlet.greenthread.spawn_after",
-            @patch("greenlet.GreenletExit")
+                            "greenlet.GreenletExit") as (spawn_after,
-            def do_test(GreenletExit, spawn_after):
+                                                         GreenletExit):
                 x = Schedule()
                 x = Schedule()
                 x.GreenletExit = KeyError
                 x.GreenletExit = KeyError
                 entry = Mock()
                 entry = Mock()
@@ -80,16 +80,14 @@ class test_Schedule(Case):
                 g.cancel.side_effect = KeyError()
                 g.cancel.side_effect = KeyError()
                 x.clear()
                 x.clear()
 
 
-            do_test()
-
 
 
 class test_TasKPool(Case):
 class test_TasKPool(Case):
 
 
     def test_pool(self):
     def test_pool(self):
         with mock_module(*eventlet_modules):
         with mock_module(*eventlet_modules):
-            @patch("eventlet.greenpool.GreenPool")
+            with patch_many("eventlet.greenpool.GreenPool",
-            @patch("eventlet.greenthread")
+                            "eventlet.greenthread") as (GreenPool,
-            def do_test(greenthread, GreenPool):
+                                                        greenthread):
                 x = TaskPool()
                 x = TaskPool()
                 x.on_start()
                 x.on_start()
                 x.on_stop()
                 x.on_stop()
@@ -98,8 +96,6 @@ class test_TasKPool(Case):
                 x.on_stop()
                 x.on_stop()
                 self.assertTrue(x.getpid())
                 self.assertTrue(x.getpid())
 
 
-            do_test()
-
     @patch("celery.concurrency.eventlet.base")
     @patch("celery.concurrency.eventlet.base")
     def test_apply_target(self, base):
     def test_apply_target(self, base):
         apply_target(Mock(), getpid=Mock())
         apply_target(Mock(), getpid=Mock())

+ 6 - 10
celery/tests/test_concurrency/test_gevent.py

@@ -13,7 +13,7 @@ from celery.concurrency.gevent import (
     TaskPool,
     TaskPool,
 )
 )
 
 
-from celery.tests.utils import Case, mock_module
+from celery.tests.utils import Case, mock_module, patch_many
 gevent_modules = (
 gevent_modules = (
     "gevent",
     "gevent",
     "gevent.monkey",
     "gevent.monkey",
@@ -58,9 +58,9 @@ class test_Schedule(Case):
 
 
     def test_sched(self):
     def test_sched(self):
         with mock_module(*gevent_modules):
         with mock_module(*gevent_modules):
-            @patch("gevent.greenlet")
+            with patch_many("gevent.greenlet",
-            @patch("gevent.greenlet.GreenletExit")
+                    "gevent.greenlet.GreenletExit") as (greenlet,
-            def do_test(GreenletExit, greenlet):
+                                                        GreenletExit):
                 greenlet.Greenlet = object
                 greenlet.Greenlet = object
                 x = Schedule()
                 x = Schedule()
                 greenlet.Greenlet = Mock()
                 greenlet.Greenlet = Mock()
@@ -80,16 +80,13 @@ class test_Schedule(Case):
                 g.kill.side_effect = KeyError()
                 g.kill.side_effect = KeyError()
                 x.clear()
                 x.clear()
 
 
-            do_test()
-
 
 
 class test_TasKPool(Case):
 class test_TasKPool(Case):
 
 
     def test_pool(self):
     def test_pool(self):
         with mock_module(*gevent_modules):
         with mock_module(*gevent_modules):
-            @patch("gevent.spawn_raw")
+            with patch_many("gevent.spawn_raw", "gevent.pool.Pool") as (
-            @patch("gevent.pool.Pool")
+                    spawn_raw, Pool):
-            def do_test(Pool, spawn_raw):
                 x = TaskPool()
                 x = TaskPool()
                 x.on_start()
                 x.on_start()
                 x.on_stop()
                 x.on_stop()
@@ -109,7 +106,6 @@ class test_TasKPool(Case):
 
 
                 x._pool = [4, 5, 6]
                 x._pool = [4, 5, 6]
                 self.assertEqual(x.num_processes, 3)
                 self.assertEqual(x.num_processes, 3)
-            do_test()
 
 
 
 
 class test_Timer(Case):
 class test_Timer(Case):

+ 4 - 0
celery/tests/utils.py

@@ -28,6 +28,7 @@ from types import ModuleType
 import mock
 import mock
 from nose import SkipTest
 from nose import SkipTest
 from kombu.log import NullHandler
 from kombu.log import NullHandler
+from kombu.utils import nested
 
 
 from ..app import app_or_default
 from ..app import app_or_default
 from ..utils.compat import WhateverIO
 from ..utils.compat import WhateverIO
@@ -524,3 +525,6 @@ def mock_open(typ=WhateverIO, side_effect=None):
             val = context.__enter__.return_value = typ()
             val = context.__enter__.return_value = typ()
             yield val
             yield val
 
 
+
+def patch_many(*targets):
+    return nested(*[mock.patch(target) for target in targets])

+ 0 - 2
setup.cfg

@@ -10,9 +10,7 @@ cover3-exclude = celery
                  celery.backends.database.a805d4bd
                  celery.backends.database.a805d4bd
                  celery.backends.database.dfd042c7
                  celery.backends.database.dfd042c7
                  celery.contrib*
                  celery.contrib*
-                 celery.backends.mongodb
                  celery.backends.cassandra
                  celery.backends.cassandra
-                 celery.events.cursesmon
 
 
 [build_sphinx]
 [build_sphinx]
 source-dir = docs/
 source-dir = docs/