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)
 
 
334
372
        self.assertEqual(['called'], hook_calls)
 
335
373
        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')
 
 
375
class TestPreAndPostCommandHooks(tests.TestCase):
 
 
376
    class TestError(Exception):
 
 
377
        __doc__ = """A test exception."""
 
 
379
    def test_pre_and_post_hooks(self):
 
 
382
        def pre_command(cmd):
 
 
383
            self.assertEqual([], hook_calls)
 
 
384
            hook_calls.append('pre')
 
 
386
        def post_command(cmd):
 
 
387
            self.assertEqual(['pre', 'run'], hook_calls)
 
 
388
            hook_calls.append('post')
 
 
391
            self.assertEqual(['pre'], hook_calls)
 
 
392
            hook_calls.append('run')
 
 
394
        self.overrideAttr(builtins.cmd_rocks, 'run', run)
 
 
395
        commands.install_bzr_command_hooks()
 
 
396
        commands.Command.hooks.install_named_hook(
 
 
397
            "pre_command", pre_command, None)
 
 
398
        commands.Command.hooks.install_named_hook(
 
 
399
            "post_command", post_command, None)
 
 
401
        self.assertEqual([], hook_calls)
 
 
402
        self.run_bzr(['rocks', '-Oxx=12', '-Oyy=foo'])
 
 
403
        self.assertEqual(['pre', 'run', 'post'], hook_calls)
 
 
405
    def test_post_hook_provided_exception(self):
 
 
408
        def post_command(cmd):
 
 
409
            hook_calls.append('post')
 
 
412
            hook_calls.append('run')
 
 
413
            raise self.TestError()
 
 
415
        self.overrideAttr(builtins.cmd_rocks, 'run', run)
 
 
416
        commands.install_bzr_command_hooks()
 
 
417
        commands.Command.hooks.install_named_hook(
 
 
418
            "post_command", post_command, None)
 
 
420
        self.assertEqual([], hook_calls)
 
 
421
        self.assertRaises(self.TestError, commands.run_bzr, [u'rocks'])
 
 
422
        self.assertEqual(['run', 'post'], hook_calls)
 
 
424
    def test_pre_command_error(self):
 
 
425
        """Ensure an BzrCommandError in pre_command aborts the command"""
 
 
429
        def pre_command(cmd):
 
 
430
            hook_calls.append('pre')
 
 
431
            # verify that all subclasses of BzrCommandError caught too
 
 
432
            raise errors.BzrOptionError()
 
 
434
        def post_command(cmd, e):
 
 
435
            self.fail('post_command should not be called')
 
 
438
            self.fail('command should not be called')
 
 
440
        self.overrideAttr(builtins.cmd_rocks, 'run', run)
 
 
441
        commands.install_bzr_command_hooks()
 
 
442
        commands.Command.hooks.install_named_hook(
 
 
443
            "pre_command", pre_command, None)
 
 
444
        commands.Command.hooks.install_named_hook(
 
 
445
            "post_command", post_command, None)
 
 
447
        self.assertEqual([], hook_calls)
 
 
448
        self.assertRaises(errors.BzrCommandError,
 
 
449
                          commands.run_bzr, [u'rocks'])
 
 
450
        self.assertEqual(['pre'], hook_calls)