123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281 |
- from __future__ import absolute_import, unicode_literals
- import pytest
- import sys
- from case import Mock, patch
- from celery import __main__
- from celery.five import WhateverIO
- from celery.platforms import EX_FAILURE, EX_USAGE, EX_OK
- from celery.bin.base import Error
- from celery.bin import celery as mod
- from celery.bin.celery import (
- Command,
- help,
- report,
- CeleryCommand,
- determine_exit_status,
- multi,
- main as mainfun,
- )
- class test__main__:
- def test_main(self):
- with patch('celery.__main__.maybe_patch_concurrency') as mpc:
- with patch('celery.bin.celery.main') as main:
- __main__.main()
- mpc.assert_called_with()
- main.assert_called_with()
- def test_main__multi(self):
- with patch('celery.__main__.maybe_patch_concurrency') as mpc:
- with patch('celery.bin.celery.main') as main:
- prev, sys.argv = sys.argv, ['foo', 'multi']
- try:
- __main__.main()
- mpc.assert_not_called()
- main.assert_called_with()
- finally:
- sys.argv = prev
- class test_Command:
- def test_Error_repr(self):
- x = Error('something happened')
- assert x.status is not None
- assert x.reason
- assert str(x)
- def setup(self):
- self.out = WhateverIO()
- self.err = WhateverIO()
- self.cmd = Command(self.app, stdout=self.out, stderr=self.err)
- def test_error(self):
- self.cmd.out = Mock()
- self.cmd.error('FOO')
- self.cmd.out.assert_called()
- def test_out(self):
- f = Mock()
- self.cmd.out('foo', f)
- def test_call(self):
- def ok_run():
- pass
- self.cmd.run = ok_run
- assert self.cmd() == EX_OK
- def error_run():
- raise Error('error', EX_FAILURE)
- self.cmd.run = error_run
- assert self.cmd() == EX_FAILURE
- def test_run_from_argv(self):
- with pytest.raises(NotImplementedError):
- self.cmd.run_from_argv('prog', ['foo', 'bar'])
- def test_pretty_list(self):
- assert self.cmd.pretty([])[1] == '- empty -'
- assert 'bar', self.cmd.pretty(['foo' in 'bar'][1])
- def test_pretty_dict(self, text='the quick brown fox'):
- assert 'OK' in str(self.cmd.pretty({'ok': text})[0])
- assert 'ERROR' in str(self.cmd.pretty({'error': text})[0])
- def test_pretty(self):
- assert 'OK' in str(self.cmd.pretty('the quick brown'))
- assert 'OK' in str(self.cmd.pretty(object()))
- assert 'OK' in str(self.cmd.pretty({'foo': 'bar'}))
- class test_report:
- def test_run(self):
- out = WhateverIO()
- r = report(app=self.app, stdout=out)
- assert r.run() == EX_OK
- assert out.getvalue()
- class test_help:
- def test_run(self):
- out = WhateverIO()
- h = help(app=self.app, stdout=out)
- h.parser = Mock()
- assert h.run() == EX_USAGE
- assert out.getvalue()
- assert h.usage('help')
- h.parser.print_help.assert_called_with()
- class test_CeleryCommand:
- def test_execute_from_commandline(self):
- x = CeleryCommand(app=self.app)
- x.handle_argv = Mock()
- x.handle_argv.return_value = 1
- with pytest.raises(SystemExit):
- x.execute_from_commandline()
- x.handle_argv.return_value = True
- with pytest.raises(SystemExit):
- x.execute_from_commandline()
- x.handle_argv.side_effect = KeyboardInterrupt()
- with pytest.raises(SystemExit):
- x.execute_from_commandline()
- x.respects_app_option = True
- with pytest.raises(SystemExit):
- x.execute_from_commandline(['celery', 'multi'])
- assert not x.respects_app_option
- x.respects_app_option = True
- with pytest.raises(SystemExit):
- x.execute_from_commandline(['manage.py', 'celery', 'multi'])
- assert not x.respects_app_option
- def test_with_pool_option(self):
- x = CeleryCommand(app=self.app)
- assert x.with_pool_option(['celery', 'events']) is None
- assert x.with_pool_option(['celery', 'worker'])
- assert x.with_pool_option(['manage.py', 'celery', 'worker'])
- def test_load_extensions_no_commands(self):
- with patch('celery.bin.celery.Extensions') as Ext:
- ext = Ext.return_value = Mock(name='Extension')
- ext.load.return_value = None
- x = CeleryCommand(app=self.app)
- x.load_extension_commands()
- def test_load_extensions_commands(self):
- with patch('celery.bin.celery.Extensions') as Ext:
- prev, mod.command_classes = list(mod.command_classes), Mock()
- try:
- ext = Ext.return_value = Mock(name='Extension')
- ext.load.return_value = ['foo', 'bar']
- x = CeleryCommand(app=self.app)
- x.load_extension_commands()
- mod.command_classes.append.assert_called_with(
- ('Extensions', ['foo', 'bar'], 'magenta'),
- )
- finally:
- mod.command_classes = prev
- def test_determine_exit_status(self):
- assert determine_exit_status('true') == EX_OK
- assert determine_exit_status('') == EX_FAILURE
- def test_relocate_args_from_start(self):
- x = CeleryCommand(app=self.app)
- assert x._relocate_args_from_start(None) == []
- relargs1 = x._relocate_args_from_start([
- '-l', 'debug', 'worker', '-c', '3', '--foo',
- ])
- assert relargs1 == ['worker', '-c', '3', '--foo', '-l', 'debug']
- relargs2 = x._relocate_args_from_start([
- '--pool=gevent', '-l', 'debug', 'worker', '--foo', '-c', '3',
- ])
- assert relargs2 == [
- 'worker', '--foo', '-c', '3',
- '--pool=gevent', '-l', 'debug',
- ]
- assert x._relocate_args_from_start(['foo', '--foo=1']) == [
- 'foo', '--foo=1',
- ]
- def test_register_command(self):
- prev, CeleryCommand.commands = dict(CeleryCommand.commands), {}
- try:
- fun = Mock(name='fun')
- CeleryCommand.register_command(fun, name='foo')
- assert CeleryCommand.commands['foo'] is fun
- finally:
- CeleryCommand.commands = prev
- def test_handle_argv(self):
- x = CeleryCommand(app=self.app)
- x.execute = Mock()
- x.handle_argv('celery', [])
- x.execute.assert_called_with('help', ['help'])
- x.handle_argv('celery', ['start', 'foo'])
- x.execute.assert_called_with('start', ['start', 'foo'])
- def test_execute(self):
- x = CeleryCommand(app=self.app)
- Help = x.commands['help'] = Mock()
- help = Help.return_value = Mock()
- x.execute('fooox', ['a'])
- help.run_from_argv.assert_called_with(x.prog_name, [], command='help')
- help.reset()
- x.execute('help', ['help'])
- help.run_from_argv.assert_called_with(x.prog_name, [], command='help')
- Dummy = x.commands['dummy'] = Mock()
- dummy = Dummy.return_value = Mock()
- exc = dummy.run_from_argv.side_effect = Error(
- 'foo', status='EX_FAILURE',
- )
- x.on_error = Mock(name='on_error')
- help.reset()
- x.execute('dummy', ['dummy'])
- x.on_error.assert_called_with(exc)
- dummy.run_from_argv.assert_called_with(
- x.prog_name, [], command='dummy',
- )
- help.run_from_argv.assert_called_with(
- x.prog_name, [], command='help',
- )
- exc = dummy.run_from_argv.side_effect = x.UsageError('foo')
- x.on_usage_error = Mock()
- x.execute('dummy', ['dummy'])
- x.on_usage_error.assert_called_with(exc)
- def test_on_usage_error(self):
- x = CeleryCommand(app=self.app)
- x.error = Mock()
- x.on_usage_error(x.UsageError('foo'), command=None)
- x.error.assert_called()
- x.on_usage_error(x.UsageError('foo'), command='dummy')
- def test_prepare_prog_name(self):
- x = CeleryCommand(app=self.app)
- main = Mock(name='__main__')
- main.__file__ = '/opt/foo.py'
- with patch.dict(sys.modules, __main__=main):
- assert x.prepare_prog_name('__main__.py') == '/opt/foo.py'
- assert x.prepare_prog_name('celery') == 'celery'
- class test_multi:
- def test_get_options(self):
- assert multi(app=self.app).get_options() is None
- def test_run_from_argv(self):
- with patch('celery.bin.multi.MultiTool') as MultiTool:
- m = MultiTool.return_value = Mock()
- multi(self.app).run_from_argv('celery', ['arg'], command='multi')
- m.execute_from_commandline.assert_called_with(['multi', 'arg'])
- class test_main:
- @patch('celery.bin.celery.CeleryCommand')
- def test_main(self, Command):
- cmd = Command.return_value = Mock()
- mainfun()
- cmd.execute_from_commandline.assert_called_with(None)
- @patch('celery.bin.celery.CeleryCommand')
- def test_main_KeyboardInterrupt(self, Command):
- cmd = Command.return_value = Mock()
- cmd.execute_from_commandline.side_effect = KeyboardInterrupt()
- mainfun()
- cmd.execute_from_commandline.assert_called_with(None)
|