~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/tests/test_commands.py

MergeĀ lp:bzr.

Show diffs side-by-side

added added

removed removed

Lines of Context:
25
25
    errors,
26
26
    option,
27
27
    tests,
 
28
    trace,
28
29
    )
29
30
from bzrlib.commands import display_command
30
31
from bzrlib.tests import TestSkipped
370
371
        cmds = list(commands.all_command_names())
371
372
        self.assertEqual(['called'], hook_calls)
372
373
        self.assertSubset(['foo', 'bar'], cmds)
 
374
 
 
375
class TestPreAndPostCommandHooks(tests.TestCase):
 
376
    class TestError(StandardError):
 
377
        __doc__ = """A test exception."""
 
378
 
 
379
    def test_pre_and_post_hooks(self):
 
380
        hook_calls = []
 
381
 
 
382
        def pre_command(cmd):
 
383
            self.assertEqual([], hook_calls)
 
384
            hook_calls.append('pre')
 
385
 
 
386
        def post_command(cmd):
 
387
            self.assertEqual(['pre', 'run'], hook_calls)
 
388
            hook_calls.append('post')
 
389
 
 
390
        def run(cmd):
 
391
            self.assertEqual(['pre'], hook_calls)
 
392
            hook_calls.append('run')
 
393
 
 
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)
 
400
 
 
401
        self.assertEqual([], hook_calls)
 
402
        self.run_bzr(['rocks', '-Oxx=12', '-Oyy=foo'])
 
403
        self.assertEqual(['pre', 'run', 'post'], hook_calls)
 
404
 
 
405
    def test_post_hook_provided_exception(self):
 
406
        hook_calls = []
 
407
 
 
408
        def post_command(cmd):
 
409
            hook_calls.append('post')
 
410
 
 
411
        def run(cmd):
 
412
            hook_calls.append('run')
 
413
            raise self.TestError()
 
414
 
 
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)
 
419
 
 
420
        self.assertEqual([], hook_calls)
 
421
        self.assertRaises(self.TestError, commands.run_bzr, [u'rocks'])
 
422
        self.assertEqual(['run', 'post'], hook_calls)
 
423
 
 
424
    def test_pre_command_error(self):
 
425
        """Ensure an BzrCommandError in pre_command aborts the command"""
 
426
 
 
427
        hook_calls = []
 
428
 
 
429
        def pre_command(cmd):
 
430
            hook_calls.append('pre')
 
431
            # verify that all subclasses of BzrCommandError caught too
 
432
            raise errors.BzrOptionError()
 
433
 
 
434
        def post_command(cmd, e):
 
435
            self.fail('post_command should not be called')
 
436
 
 
437
        def run(cmd):
 
438
            self.fail('command should not be called')
 
439
 
 
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)
 
446
 
 
447
        self.assertEqual([], hook_calls)
 
448
        self.assertRaises(errors.BzrCommandError,
 
449
                          commands.run_bzr, [u'rocks'])
 
450
        self.assertEqual(['pre'], hook_calls)
 
451