"""Create Celery app instances used for testing."""importweakreffromcontextlibimportcontextmanagerfromcopyimportdeepcopyfromkombu.utils.importsimportsymbol_by_namefromceleryimportCelery,_state#: Contains the default configuration values for the test app.DEFAULT_TEST_CONFIG={'worker_hijack_root_logger':False,'worker_log_color':False,'accept_content':{'json'},'enable_utc':True,'timezone':'UTC','broker_url':'memory://','result_backend':'cache+memory://','broker_heartbeat':0,}
[文档]classTrap:"""Trap that pretends to be an app but raises an exception instead. This to protect from code that does not properly pass app instances, then falls back to the current_app. """def__getattr__(self,name):# Workaround to allow unittest.mock to patch this object# in Python 3.8 and above.ifname=='_is_coroutine'orname=='__func__':returnNoneprint(name)raiseRuntimeError('Test depends on current_app')
[文档]classUnitLogging(symbol_by_name(Celery.log_cls)):"""Sets up logging for the test application."""def__init__(self,*args,**kwargs):super().__init__(*args,**kwargs)self.already_setup=True
[文档]defTestApp(name=None,config=None,enable_logging=False,set_as_current=False,log=UnitLogging,backend=None,broker=None,**kwargs):"""App used for testing."""from.importtasks# noqaconfig=dict(deepcopy(DEFAULT_TEST_CONFIG),**configor{})ifbrokerisnotNone:config.pop('broker_url',None)ifbackendisnotNone:config.pop('result_backend',None)log=Noneifenable_loggingelselogtest_app=Celery(nameor'celery.tests',set_as_current=set_as_current,log=log,broker=broker,backend=backend,**kwargs)test_app.add_defaults(config)returntest_app
[文档]@contextmanagerdefset_trap(app):"""Contextmanager that installs the trap app. The trap means that anything trying to use the current or default app will raise an exception. """trap=Trap()prev_tls=_state._tls_state.set_default_app(trap)classNonTLS:current_app=trap_state._tls=NonTLS()try:yieldfinally:_state._tls=prev_tls
[文档]@contextmanagerdefsetup_default_app(app,use_trap=False):"""Setup default app for testing. Ensures state is clean after the test returns. """prev_current_app=_state.get_current_app()prev_default_app=_state.default_appprev_finalizers=set(_state._on_app_finalizers)prev_apps=weakref.WeakSet(_state._apps)try:ifuse_trap:withset_trap(app):yieldelse:yieldfinally:_state.set_default_app(prev_default_app)_state._tls.current_app=prev_current_appifappisnotprev_current_app:app.close()_state._on_app_finalizers=prev_finalizers_state._apps=prev_apps