test_loaders.py 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. import os
  2. import sys
  3. import unittest2 as unittest
  4. from celery import task
  5. from celery import loaders
  6. from celery.loaders import base
  7. from celery.loaders import djangoapp
  8. from celery.loaders import default
  9. from celery.tests.utils import with_environ
  10. class TestLoaders(unittest.TestCase):
  11. def test_get_loader_cls(self):
  12. self.assertEqual(loaders.get_loader_cls("django"),
  13. loaders.DjangoLoader)
  14. self.assertEqual(loaders.get_loader_cls("default"),
  15. loaders.DefaultLoader)
  16. # Execute cached branch.
  17. self.assertEqual(loaders.get_loader_cls("django"),
  18. loaders.DjangoLoader)
  19. self.assertEqual(loaders.get_loader_cls("default"),
  20. loaders.DefaultLoader)
  21. @with_environ("CELERY_LOADER", "default")
  22. def test_detect_loader_CELERY_LOADER(self):
  23. self.assertEqual(loaders.detect_loader(), loaders.DefaultLoader)
  24. class DummyLoader(base.BaseLoader):
  25. class Config(object):
  26. def __init__(self, **kwargs):
  27. for attr, val in kwargs.items():
  28. setattr(self, attr, val)
  29. def read_configuration(self):
  30. return self.Config(foo="bar", CELERY_IMPORTS=("os", "sys"))
  31. class TestLoaderBase(unittest.TestCase):
  32. def setUp(self):
  33. self.loader = DummyLoader()
  34. def test_handlers_pass(self):
  35. self.loader.on_task_init("foo.task", "feedface-cafebabe")
  36. self.loader.on_worker_init()
  37. def test_import_task_module(self):
  38. self.assertEqual(sys, self.loader.import_task_module("sys"))
  39. def test_conf_property(self):
  40. self.assertEqual(self.loader.conf.foo, "bar")
  41. self.assertEqual(self.loader._conf_cache.foo, "bar")
  42. self.assertEqual(self.loader.conf.foo, "bar")
  43. def test_import_default_modules(self):
  44. self.assertSameElements(self.loader.import_default_modules(),
  45. [os, sys, task])
  46. class TestDjangoLoader(unittest.TestCase):
  47. def setUp(self):
  48. self.loader = loaders.DjangoLoader()
  49. def test_on_worker_init(self):
  50. from django.conf import settings
  51. old_imports = settings.CELERY_IMPORTS
  52. settings.CELERY_IMPORTS = ("xxx.does.not.exist", )
  53. try:
  54. self.assertRaises(ImportError, self.loader.on_worker_init)
  55. finally:
  56. settings.CELERY_IMPORTS = old_imports
  57. def test_race_protection(self):
  58. djangoapp._RACE_PROTECTION = True
  59. try:
  60. self.assertFalse(self.loader.on_worker_init())
  61. finally:
  62. djangoapp._RACE_PROTECTION = False
  63. def test_find_related_module_no_path(self):
  64. self.assertFalse(djangoapp.find_related_module("sys", "tasks"))
  65. def test_find_related_module_no_related(self):
  66. self.assertFalse(djangoapp.find_related_module("someapp",
  67. "frobulators"))
  68. class TestDefaultLoader(unittest.TestCase):
  69. def test_wanted_module_item(self):
  70. self.assertTrue(default.wanted_module_item("FOO"))
  71. self.assertTrue(default.wanted_module_item("foo"))
  72. self.assertFalse(default.wanted_module_item("_foo"))
  73. self.assertFalse(default.wanted_module_item("__foo"))
  74. def test_read_configuration(self):
  75. from types import ModuleType
  76. class ConfigModule(ModuleType):
  77. pass
  78. celeryconfig = ConfigModule("celeryconfig")
  79. celeryconfig.CELERY_IMPORTS = ("os", "sys")
  80. sys.modules["celeryconfig"] = celeryconfig
  81. try:
  82. l = default.Loader()
  83. settings = l.read_configuration()
  84. self.assertTupleEqual(settings.CELERY_IMPORTS, ("os", "sys"))
  85. from django.conf import settings
  86. settings.configured = False
  87. settings = l.read_configuration()
  88. self.assertTupleEqual(settings.CELERY_IMPORTS, ("os", "sys"))
  89. self.assertTrue(settings.configured)
  90. l.on_worker_init()
  91. finally:
  92. sys.modules.pop("celeryconfig", None)