14
14
# along with this program; if not, write to the Free Software
 
15
15
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
 
17
 
from cStringIO import StringIO
 
30
 
from bzrlib.commands import display_command
 
31
 
from bzrlib.tests import TestSkipped
 
 
30
from ..commands import display_command
 
 
31
from . import TestSkipped
 
34
34
class TestCommands(tests.TestCase):
 
 
36
    def test_all_commands_have_help(self):
 
 
37
        commands._register_builtin_commands()
 
 
38
        commands_without_help = set()
 
 
39
        base_doc = inspect.getdoc(commands.Command)
 
 
40
        for cmd_name in commands.all_command_names():
 
 
41
            cmd = commands.get_cmd_object(cmd_name)
 
 
43
            if not cmd_help or cmd_help == base_doc:
 
 
44
                commands_without_help.append(cmd_name)
 
 
45
        self.assertLength(0, commands_without_help)
 
36
47
    def test_display_command(self):
 
37
48
        """EPIPE message is selectively suppressed"""
 
38
49
        def pipe_thrower():
 
 
80
91
        self.assertContainsRe(c.get_help_text(), '--foo')
 
 
94
class TestInsideCommand(tests.TestCaseInTempDir):
 
 
96
    def test_command_see_config_overrides(self):
 
 
98
            # We override the run() command method so we can observe the
 
 
99
            # overrides from inside.
 
 
100
            c = config.GlobalStack()
 
 
101
            self.assertEqual('12', c.get('xx'))
 
 
102
            self.assertEqual('foo', c.get('yy'))
 
 
103
        self.overrideAttr(builtins.cmd_rocks, 'run', run)
 
 
104
        self.run_bzr(['rocks', '-Oxx=12', '-Oyy=foo'])
 
 
105
        c = config.GlobalStack()
 
 
106
        # Ensure that we don't leak outside of the command
 
 
107
        self.assertEqual(None, c.get('xx'))
 
 
108
        self.assertEqual(None, c.get('yy'))
 
 
111
class TestInvokedAs(tests.TestCase):
 
 
113
    def test_invoked_as(self):
 
 
114
        """The command object knows the actual name used to invoke it."""
 
 
115
        commands.install_bzr_command_hooks()
 
 
116
        commands._register_builtin_commands()
 
 
117
        # get one from the real get_cmd_object.
 
 
118
        c = commands.get_cmd_object('ci')
 
 
119
        self.assertIsInstance(c, builtins.cmd_commit)
 
 
120
        self.assertEqual(c.invoked_as, 'ci')
 
83
123
class TestGetAlias(tests.TestCase):
 
85
125
    def _get_config(self, config_text):
 
86
 
        my_config = config.GlobalConfig()
 
87
 
        config_file = StringIO(config_text.encode('utf-8'))
 
88
 
        my_config._parser = my_config._get_parser(file=config_file)
 
 
126
        my_config = config.GlobalConfig.from_string(config_text)
 
91
129
    def test_simple(self):
 
 
168
206
        commands.plugin_cmds.remove('fake')
 
170
208
    def assertIsFakeCommand(self, cmd_obj):
 
171
 
        from bzrlib.tests.fake_command import cmd_fake
 
 
209
        from breezy.tests.fake_command import cmd_fake
 
172
210
        self.assertIsInstance(cmd_obj, cmd_fake)
 
174
212
    def test_register_lazy(self):
 
175
213
        """Ensure lazy registration works"""
 
176
214
        commands.plugin_cmds.register_lazy('cmd_fake', [],
 
177
 
                                           'bzrlib.tests.fake_command')
 
 
215
                                           'breezy.tests.fake_command')
 
178
216
        self.addCleanup(self.remove_fake)
 
179
217
        self.assertFalse(lazy_command_imported)
 
180
218
        fake_instance = commands.get_cmd_object('fake')
 
 
184
222
    def test_get_unrelated_does_not_import(self):
 
185
223
        commands.plugin_cmds.register_lazy('cmd_fake', [],
 
186
 
                                           'bzrlib.tests.fake_command')
 
 
224
                                           'breezy.tests.fake_command')
 
187
225
        self.addCleanup(self.remove_fake)
 
188
226
        commands.get_cmd_object('status')
 
189
227
        self.assertFalse(lazy_command_imported)
 
191
229
    def test_aliases(self):
 
192
230
        commands.plugin_cmds.register_lazy('cmd_fake', ['fake_alias'],
 
193
 
                                           'bzrlib.tests.fake_command')
 
 
231
                                           'breezy.tests.fake_command')
 
194
232
        self.addCleanup(self.remove_fake)
 
195
233
        fake_instance = commands.get_cmd_object('fake_alias')
 
196
234
        self.assertIsFakeCommand(fake_instance)
 
 
271
309
        self.assertIsInstance(hook_calls[0][1], builtins.cmd_info)
 
 
312
class TestCommandNotFound(tests.TestCase):
 
 
315
        super(TestCommandNotFound, self).setUp()
 
 
316
        commands._register_builtin_commands()
 
 
317
        commands.install_bzr_command_hooks()
 
 
319
    def test_not_found_no_suggestion(self):
 
 
320
        e = self.assertRaises(errors.BzrCommandError,
 
 
321
            commands.get_cmd_object, 'idontexistand')
 
 
322
        self.assertEqual('unknown command "idontexistand"', str(e))
 
 
324
    def test_not_found_with_suggestion(self):
 
 
325
        e = self.assertRaises(errors.BzrCommandError,
 
 
326
            commands.get_cmd_object, 'statue')
 
 
327
        self.assertEqual('unknown command "statue". Perhaps you meant "status"',
 
274
331
class TestGetMissingCommandHook(tests.TestCase):
 
276
333
    def hook_missing(self):
 
 
334
391
        self.assertEqual(['called'], hook_calls)
 
335
392
        self.assertSubset(['foo', 'bar'], cmds)
 
337
 
class TestDeprecations(tests.TestCase):
 
339
 
    def test_shlex_split_unicode_deprecation(self):
 
340
 
        res = self.applyDeprecated(
 
341
 
                symbol_versioning.deprecated_in((2, 2, 0)),
 
342
 
                commands.shlex_split_unicode, 'whatever')
 
 
394
class TestPreAndPostCommandHooks(tests.TestCase):
 
 
395
    class TestError(Exception):
 
 
396
        __doc__ = """A test exception."""
 
 
398
    def test_pre_and_post_hooks(self):
 
 
401
        def pre_command(cmd):
 
 
402
            self.assertEqual([], hook_calls)
 
 
403
            hook_calls.append('pre')
 
 
405
        def post_command(cmd):
 
 
406
            self.assertEqual(['pre', 'run'], hook_calls)
 
 
407
            hook_calls.append('post')
 
 
410
            self.assertEqual(['pre'], hook_calls)
 
 
411
            hook_calls.append('run')
 
 
413
        self.overrideAttr(builtins.cmd_rocks, 'run', run)
 
 
414
        commands.install_bzr_command_hooks()
 
 
415
        commands.Command.hooks.install_named_hook(
 
 
416
            "pre_command", pre_command, None)
 
 
417
        commands.Command.hooks.install_named_hook(
 
 
418
            "post_command", post_command, None)
 
 
420
        self.assertEqual([], hook_calls)
 
 
421
        self.run_bzr(['rocks', '-Oxx=12', '-Oyy=foo'])
 
 
422
        self.assertEqual(['pre', 'run', 'post'], hook_calls)
 
 
424
    def test_post_hook_provided_exception(self):
 
 
427
        def post_command(cmd):
 
 
428
            hook_calls.append('post')
 
 
431
            hook_calls.append('run')
 
 
432
            raise self.TestError()
 
 
434
        self.overrideAttr(builtins.cmd_rocks, 'run', run)
 
 
435
        commands.install_bzr_command_hooks()
 
 
436
        commands.Command.hooks.install_named_hook(
 
 
437
            "post_command", post_command, None)
 
 
439
        self.assertEqual([], hook_calls)
 
 
440
        self.assertRaises(self.TestError, commands.run_bzr, [u'rocks'])
 
 
441
        self.assertEqual(['run', 'post'], hook_calls)
 
 
443
    def test_pre_command_error(self):
 
 
444
        """Ensure an BzrCommandError in pre_command aborts the command"""
 
 
448
        def pre_command(cmd):
 
 
449
            hook_calls.append('pre')
 
 
450
            # verify that all subclasses of BzrCommandError caught too
 
 
451
            raise commands.BzrOptionError()
 
 
453
        def post_command(cmd, e):
 
 
454
            self.fail('post_command should not be called')
 
 
457
            self.fail('command should not be called')
 
 
459
        self.overrideAttr(builtins.cmd_rocks, 'run', run)
 
 
460
        commands.install_bzr_command_hooks()
 
 
461
        commands.Command.hooks.install_named_hook(
 
 
462
            "pre_command", pre_command, None)
 
 
463
        commands.Command.hooks.install_named_hook(
 
 
464
            "post_command", post_command, None)
 
 
466
        self.assertEqual([], hook_calls)
 
 
467
        self.assertRaises(errors.BzrCommandError,
 
 
468
                          commands.run_bzr, [u'rocks'])
 
 
469
        self.assertEqual(['pre'], hook_calls)
 
 
472
class GuessCommandTests(tests.TestCase):
 
 
475
        super(GuessCommandTests, self).setUp()
 
 
476
        commands._register_builtin_commands()
 
 
477
        commands.install_bzr_command_hooks()
 
 
479
    def test_guess_override(self):
 
 
480
        self.assertEqual('ci', commands.guess_command('ic'))
 
 
482
    def test_guess(self):
 
 
483
        commands.get_cmd_object('status')
 
 
484
        self.assertEqual('status', commands.guess_command('statue'))
 
 
487
        self.assertIs(None, commands.guess_command('nothingisevenclose'))