Browse Source

100% coverage for mongodb backend

Ask Solem 13 years ago
parent
commit
2041a87fbb

+ 3 - 3
celery/backends/mongodb.py

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

+ 8 - 5
celery/events/cursesmon.py

@@ -35,8 +35,11 @@ TIMESTAMP_WIDTH = 8
 MIN_WORKER_WIDTH = 15
 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 = {}
     win = None
     screen_width = None
@@ -459,7 +462,7 @@ class CursesMonitor(object):
                         if w.alive]
 
 
-class DisplayThread(threading.Thread):
+class DisplayThread(threading.Thread):  # pragma: no cover
 
     def __init__(self, display):
         self.display = display
@@ -472,7 +475,7 @@ class DisplayThread(threading.Thread):
             self.display.nap()
 
 
-def capture_events(app, state, display):
+def capture_events(app, state, display):  # pragma: no cover
 
     def on_connection_error(exc, interval):
         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, ))
 
 
-def evtop(app=None):
+def evtop(app=None):  # pragma: no cover
     app = app_or_default(app)
     state = app.events.State()
     display = CursesMonitor(state, app=app)
@@ -513,5 +516,5 @@ def evtop(app=None):
         display.resetscreen()
 
 
-if __name__ == "__main__":
+if __name__ == "__main__":  # pragma: no cover
     evtop()

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

@@ -1,14 +1,19 @@
 from __future__ import absolute_import
+from __future__ import with_statement
 
 import datetime
 import uuid
 
 from mock import MagicMock, Mock, patch, sentinel
 from nose import SkipTest
+from pickle import loads, dumps
 
+from celery import Celery
 from celery import states
-from celery.backends.mongodb import MongoBackend
-from celery.tests.utils import Case
+from celery.backends import mongodb as module
+from celery.backends.mongodb import MongoBackend, Bunch
+from celery.exceptions import ImproperlyConfigured
+from celery.tests.utils import AppCase
 
 
 try:
@@ -27,7 +32,7 @@ MONGODB_DATABASE = "testing"
 MONGODB_COLLECTION = "collection1"
 
 
-class test_MongoBackend(Case):
+class test_MongoBackend(AppCase):
 
     def setUp(self):
         if pymongo is None:
@@ -49,22 +54,54 @@ class test_MongoBackend(Case):
         binary.Binary = self._reset["Binary"]
         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):
 
-        @patch("pymongo.connection.Connection")
-        def do_test(mock_Connection):
+        with patch("pymongo.connection.Connection") as mock_Connection:
             self.backend._connection = sentinel._connection
 
             connection = self.backend._get_connection()
 
             self.assertEquals(sentinel._connection, connection)
             self.assertFalse(mock_Connection.called)
-        do_test()
 
     def test_get_connection_no_connection_host(self):
 
-        @patch("pymongo.connection.Connection")
-        def do_test(mock_Connection):
+        with patch("pymongo.connection.Connection") as mock_Connection:
             self.backend._connection = None
             self.backend.mongodb_host = MONGODB_HOST
             self.backend.mongodb_port = MONGODB_PORT
@@ -74,12 +111,10 @@ class test_MongoBackend(Case):
             mock_Connection.assert_called_once_with(
                 MONGODB_HOST, MONGODB_PORT)
             self.assertEquals(sentinel.connection, connection)
-        do_test()
 
     def test_get_connection_no_connection_mongodb_uri(self):
 
-        @patch("pymongo.connection.Connection")
-        def do_test(mock_Connection):
+        with patch("pymongo.connection.Connection") as mock_Connection:
             mongodb_uri = "mongodb://%s:%d" % (MONGODB_HOST, MONGODB_PORT)
             self.backend._connection = None
             self.backend.mongodb_host = mongodb_uri
@@ -89,7 +124,6 @@ class test_MongoBackend(Case):
             connection = self.backend._get_connection()
             mock_Connection.assert_called_once_with(mongodb_uri)
             self.assertEquals(sentinel.connection, connection)
-        do_test()
 
     @patch("celery.backends.mongodb.MongoBackend._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(
             MONGODB_COLLECTION)
         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,
 )
 
-from celery.tests.utils import Case, mock_module
+from celery.tests.utils import Case, mock_module, patch_many
 
 
 class EventletCase(Case):
@@ -59,9 +59,9 @@ class test_Schedule(Case):
 
     def test_sched(self):
         with mock_module(*eventlet_modules):
-            @patch("eventlet.greenthread.spawn_after")
-            @patch("greenlet.GreenletExit")
-            def do_test(GreenletExit, spawn_after):
+            with patch_many("eventlet.greenthread.spawn_after",
+                            "greenlet.GreenletExit") as (spawn_after,
+                                                         GreenletExit):
                 x = Schedule()
                 x.GreenletExit = KeyError
                 entry = Mock()
@@ -80,16 +80,14 @@ class test_Schedule(Case):
                 g.cancel.side_effect = KeyError()
                 x.clear()
 
-            do_test()
-
 
 class test_TasKPool(Case):
 
     def test_pool(self):
         with mock_module(*eventlet_modules):
-            @patch("eventlet.greenpool.GreenPool")
-            @patch("eventlet.greenthread")
-            def do_test(greenthread, GreenPool):
+            with patch_many("eventlet.greenpool.GreenPool",
+                            "eventlet.greenthread") as (GreenPool,
+                                                        greenthread):
                 x = TaskPool()
                 x.on_start()
                 x.on_stop()
@@ -98,8 +96,6 @@ class test_TasKPool(Case):
                 x.on_stop()
                 self.assertTrue(x.getpid())
 
-            do_test()
-
     @patch("celery.concurrency.eventlet.base")
     def test_apply_target(self, base):
         apply_target(Mock(), getpid=Mock())

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

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

+ 4 - 0
celery/tests/utils.py

@@ -28,6 +28,7 @@ from types import ModuleType
 import mock
 from nose import SkipTest
 from kombu.log import NullHandler
+from kombu.utils import nested
 
 from ..app import app_or_default
 from ..utils.compat import WhateverIO
@@ -524,3 +525,6 @@ def mock_open(typ=WhateverIO, side_effect=None):
             val = context.__enter__.return_value = typ()
             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.dfd042c7
                  celery.contrib*
-                 celery.backends.mongodb
                  celery.backends.cassandra
-                 celery.events.cursesmon
 
 [build_sphinx]
 source-dir = docs/