test_mongodb.py 9.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259
  1. from __future__ import absolute_import
  2. import uuid
  3. from mock import MagicMock, Mock, patch, sentinel
  4. from nose import SkipTest
  5. from celery import states
  6. from celery.backends.mongodb import MongoBackend
  7. from celery.tests.utils import unittest
  8. try:
  9. import pymongo
  10. except ImportError:
  11. pymongo = None # noqa
  12. COLLECTION = "taskmeta_celery"
  13. TASK_ID = str(uuid.uuid1())
  14. MONGODB_HOST = "localhost"
  15. MONGODB_PORT = 27017
  16. MONGODB_USER = "mongo"
  17. MONGODB_PASSWORD = "1234"
  18. MONGODB_DATABASE = "testing"
  19. MONGODB_COLLECTION = "collection1"
  20. @patch("celery.backends.mongodb.MongoBackend.decode", Mock())
  21. @patch("celery.backends.mongodb.MongoBackend.encode", Mock())
  22. @patch("pymongo.binary.Binary", Mock())
  23. @patch("datetime.datetime", Mock())
  24. class TestBackendMongoDb(unittest.TestCase):
  25. def setUp(self):
  26. if pymongo is None:
  27. raise SkipTest("pymongo is not installed.")
  28. self.backend = MongoBackend()
  29. @patch("pymongo.connection.Connection")
  30. def test_get_connection_connection_exists(self, mock_Connection):
  31. self.backend._connection = sentinel._connection
  32. connection = self.backend._get_connection()
  33. self.assertEquals(sentinel._connection, connection)
  34. self.assertFalse(mock_Connection.called)
  35. @patch("pymongo.connection.Connection")
  36. def test_get_connection_no_connection_host(self, mock_Connection):
  37. self.backend._connection = None
  38. self.backend.mongodb_host = MONGODB_HOST
  39. self.backend.mongodb_port = MONGODB_PORT
  40. mock_Connection.return_value = sentinel.connection
  41. connection = self.backend._get_connection()
  42. mock_Connection.assert_called_once_with(
  43. MONGODB_HOST, MONGODB_PORT)
  44. self.assertEquals(sentinel.connection, connection)
  45. @patch("pymongo.connection.Connection")
  46. def test_get_connection_no_connection_mongodb_uri(self, mock_Connection):
  47. mongodb_uri = "mongodb://%s:%d" % (MONGODB_HOST, MONGODB_PORT)
  48. self.backend._connection = None
  49. self.backend.mongodb_host = mongodb_uri
  50. mock_Connection.return_value = sentinel.connection
  51. connection = self.backend._get_connection()
  52. mock_Connection.assert_called_once_with(mongodb_uri)
  53. self.assertEquals(sentinel.connection, connection)
  54. @patch("celery.backends.mongodb.MongoBackend._get_connection")
  55. def test_get_database_no_existing(self, mock_get_connection):
  56. # Should really check for combinations of these two, to be complete.
  57. self.backend.mongodb_user = MONGODB_USER
  58. self.backend.mongodb_password = MONGODB_PASSWORD
  59. mock_database = Mock()
  60. mock_connection = MagicMock(spec=['__getitem__'])
  61. mock_connection.__getitem__.return_value = mock_database
  62. mock_get_connection.return_value = mock_connection
  63. database = self.backend._get_database()
  64. self.assertTrue(database is mock_database)
  65. self.assertTrue(self.backend._database is mock_database)
  66. mock_database.authenticate.assert_called_once_with(
  67. MONGODB_USER, MONGODB_PASSWORD)
  68. @patch("celery.backends.mongodb.MongoBackend._get_connection")
  69. def test_get_database_no_existing_no_auth(self, mock_get_connection):
  70. # Should really check for combinations of these two, to be complete.
  71. self.backend.mongodb_user = None
  72. self.backend.mongodb_password = None
  73. mock_database = Mock()
  74. mock_connection = MagicMock(spec=['__getitem__'])
  75. mock_connection.__getitem__.return_value = mock_database
  76. mock_get_connection.return_value = mock_connection
  77. database = self.backend._get_database()
  78. self.assertTrue(database is mock_database)
  79. self.assertFalse(mock_database.authenticate.called)
  80. self.assertTrue(self.backend._database is mock_database)
  81. def test_process_cleanup(self):
  82. self.backend._connection = None
  83. self.backend.process_cleanup()
  84. self.assertEquals(self.backend._connection, None)
  85. self.backend._connection = "not none"
  86. self.backend.process_cleanup()
  87. self.assertEquals(self.backend._connection, None)
  88. @patch("celery.backends.mongodb.MongoBackend._get_database")
  89. def test_store_result(self, mock_get_database):
  90. self.backend.mongodb_taskmeta_collection = MONGODB_COLLECTION
  91. mock_database = MagicMock(spec=['__getitem__', '__setitem__'])
  92. mock_collection = Mock()
  93. mock_get_database.return_value = mock_database
  94. mock_database.__getitem__.return_value = mock_collection
  95. ret_val = self.backend._store_result(
  96. sentinel.task_id, sentinel.result, sentinel.status)
  97. mock_get_database.assert_called_once_with()
  98. mock_database.__getitem__.assert_called_once_with(MONGODB_COLLECTION)
  99. mock_collection.save.assert_called_once()
  100. self.assertEquals(sentinel.result, ret_val)
  101. @patch("celery.backends.mongodb.MongoBackend._get_database")
  102. def test_get_task_meta_for(self, mock_get_database):
  103. self.backend.mongodb_taskmeta_collection = MONGODB_COLLECTION
  104. mock_database = MagicMock(spec=['__getitem__', '__setitem__'])
  105. mock_collection = Mock()
  106. mock_collection.find_one.return_value = MagicMock()
  107. mock_get_database.return_value = mock_database
  108. mock_database.__getitem__.return_value = mock_collection
  109. ret_val = self.backend._get_task_meta_for(sentinel.task_id)
  110. mock_get_database.assert_called_once_with()
  111. mock_database.__getitem__.assert_called_once_with(MONGODB_COLLECTION)
  112. self.assertEquals(
  113. ['status', 'date_done', 'traceback', 'result', 'task_id'],
  114. ret_val.keys())
  115. @patch("celery.backends.mongodb.MongoBackend._get_database")
  116. def test_get_task_meta_for_no_result(self, mock_get_database):
  117. self.backend.mongodb_taskmeta_collection = MONGODB_COLLECTION
  118. mock_database = MagicMock(spec=['__getitem__', '__setitem__'])
  119. mock_collection = Mock()
  120. mock_collection.find_one.return_value = None
  121. mock_get_database.return_value = mock_database
  122. mock_database.__getitem__.return_value = mock_collection
  123. ret_val = self.backend._get_task_meta_for(sentinel.task_id)
  124. mock_get_database.assert_called_once_with()
  125. mock_database.__getitem__.assert_called_once_with(MONGODB_COLLECTION)
  126. self.assertEquals({"status": states.PENDING, "result": None}, ret_val)
  127. @patch("celery.backends.mongodb.MongoBackend._get_database")
  128. def test_save_taskset(self, mock_get_database):
  129. self.backend.mongodb_taskmeta_collection = MONGODB_COLLECTION
  130. mock_database = MagicMock(spec=['__getitem__', '__setitem__'])
  131. mock_collection = Mock()
  132. mock_get_database.return_value = mock_database
  133. mock_database.__getitem__.return_value = mock_collection
  134. ret_val = self.backend._save_taskset(
  135. sentinel.taskset_id, sentinel.result)
  136. mock_get_database.assert_called_once_with()
  137. mock_database.__getitem__.assert_called_once_with(MONGODB_COLLECTION)
  138. mock_collection.save.assert_called_once()
  139. self.assertEquals(sentinel.result, ret_val)
  140. @patch("celery.backends.mongodb.MongoBackend._get_database")
  141. def test_restore_taskset(self, mock_get_database):
  142. self.backend.mongodb_taskmeta_collection = MONGODB_COLLECTION
  143. mock_database = MagicMock(spec=['__getitem__', '__setitem__'])
  144. mock_collection = Mock()
  145. mock_collection.find_one.return_value = MagicMock()
  146. mock_get_database.return_value = mock_database
  147. mock_database.__getitem__.return_value = mock_collection
  148. ret_val = self.backend._restore_taskset(sentinel.taskset_id)
  149. mock_get_database.assert_called_once_with()
  150. mock_database.__getitem__.assert_called_once_with(MONGODB_COLLECTION)
  151. mock_collection.find_one.assert_called_once_with(
  152. {"_id": sentinel.taskset_id})
  153. self.assertEquals(['date_done', 'result', 'task_id'], ret_val.keys())
  154. @patch("celery.backends.mongodb.MongoBackend._get_database")
  155. def test_delete_taskset(self, mock_get_database):
  156. self.backend.mongodb_taskmeta_collection = MONGODB_COLLECTION
  157. mock_database = MagicMock(spec=['__getitem__', '__setitem__'])
  158. mock_collection = Mock()
  159. mock_get_database.return_value = mock_database
  160. mock_database.__getitem__.return_value = mock_collection
  161. self.backend._delete_taskset(sentinel.taskset_id)
  162. mock_get_database.assert_called_once_with()
  163. mock_database.__getitem__.assert_called_once_with(MONGODB_COLLECTION)
  164. mock_collection.remove.assert_called_once_with(
  165. {"_id": sentinel.taskset_id})
  166. @patch("celery.backends.mongodb.MongoBackend._get_database")
  167. def test_forget(self, mock_get_database):
  168. self.backend.mongodb_taskmeta_collection = MONGODB_COLLECTION
  169. mock_database = MagicMock(spec=['__getitem__', '__setitem__'])
  170. mock_collection = Mock()
  171. mock_get_database.return_value = mock_database
  172. mock_database.__getitem__.return_value = mock_collection
  173. self.backend._forget(sentinel.task_id)
  174. mock_get_database.assert_called_once_with()
  175. mock_database.__getitem__.assert_called_once_with(
  176. MONGODB_COLLECTION)
  177. mock_collection.remove.assert_called_once_with(
  178. {"_id": sentinel.task_id}, safe=True)
  179. @patch("celery.backends.mongodb.MongoBackend._get_database")
  180. def test_cleanup(self, mock_get_database):
  181. self.backend.mongodb_taskmeta_collection = MONGODB_COLLECTION
  182. mock_database = MagicMock(spec=['__getitem__', '__setitem__'])
  183. mock_collection = Mock()
  184. mock_get_database.return_value = mock_database
  185. mock_database.__getitem__.return_value = mock_collection
  186. self.backend.cleanup()
  187. mock_get_database.assert_called_once_with()
  188. mock_database.__getitem__.assert_called_once_with(
  189. MONGODB_COLLECTION)
  190. mock_collection.assert_called_once()