122
91
def test_unicode(self):
123
92
my_config = self._get_config("[ALIASES]\n"
124
u'iam=whoami "Erik B\u00e5gfors <erik@bagfors.nu>"\n')
93
u"iam=whoami 'Erik B\u00e5gfors <erik@bagfors.nu>'\n")
125
94
self.assertEqual([u'whoami', u'Erik B\u00e5gfors <erik@bagfors.nu>'],
126
95
commands.get_alias("iam", config=my_config))
129
class TestSeeAlso(tests.TestCase):
130
"""Tests for the see also functional of Command."""
133
def _get_command_with_see_also(see_also):
134
class ACommand(commands.Command):
135
__doc__ = """A sample command."""
139
def test_default_subclass_no_see_also(self):
140
command = self._get_command_with_see_also([])
141
self.assertEqual([], command.get_see_also())
143
def test__see_also(self):
144
"""When _see_also is defined, it sets the result of get_see_also()."""
145
command = self._get_command_with_see_also(['bar', 'foo'])
146
self.assertEqual(['bar', 'foo'], command.get_see_also())
148
def test_deduplication(self):
149
"""Duplicates in _see_also are stripped out."""
150
command = self._get_command_with_see_also(['foo', 'foo'])
151
self.assertEqual(['foo'], command.get_see_also())
153
def test_sorted(self):
154
"""_see_also is sorted by get_see_also."""
155
command = self._get_command_with_see_also(['foo', 'bar'])
156
self.assertEqual(['bar', 'foo'], command.get_see_also())
158
def test_additional_terms(self):
159
"""Additional terms can be supplied and are deduped and sorted."""
160
command = self._get_command_with_see_also(['foo', 'bar'])
161
self.assertEqual(['bar', 'foo', 'gam'],
162
command.get_see_also(['gam', 'bar', 'gam']))
165
class TestRegisterLazy(tests.TestCase):
168
tests.TestCase.setUp(self)
169
import bzrlib.tests.fake_command
170
del sys.modules['bzrlib.tests.fake_command']
171
global lazy_command_imported
172
lazy_command_imported = False
173
commands.install_bzr_command_hooks()
177
commands.plugin_cmds.remove('fake')
179
def assertIsFakeCommand(self, cmd_obj):
180
from bzrlib.tests.fake_command import cmd_fake
181
self.assertIsInstance(cmd_obj, cmd_fake)
183
def test_register_lazy(self):
184
"""Ensure lazy registration works"""
185
commands.plugin_cmds.register_lazy('cmd_fake', [],
186
'bzrlib.tests.fake_command')
187
self.addCleanup(self.remove_fake)
188
self.assertFalse(lazy_command_imported)
189
fake_instance = commands.get_cmd_object('fake')
190
self.assertTrue(lazy_command_imported)
191
self.assertIsFakeCommand(fake_instance)
193
def test_get_unrelated_does_not_import(self):
194
commands.plugin_cmds.register_lazy('cmd_fake', [],
195
'bzrlib.tests.fake_command')
196
self.addCleanup(self.remove_fake)
197
commands.get_cmd_object('status')
198
self.assertFalse(lazy_command_imported)
200
def test_aliases(self):
201
commands.plugin_cmds.register_lazy('cmd_fake', ['fake_alias'],
202
'bzrlib.tests.fake_command')
203
self.addCleanup(self.remove_fake)
204
fake_instance = commands.get_cmd_object('fake_alias')
205
self.assertIsFakeCommand(fake_instance)
208
class TestExtendCommandHook(tests.TestCase):
210
def test_fires_on_get_cmd_object(self):
211
# The extend_command(cmd) hook fires when commands are delivered to the
212
# ui, not simply at registration (because lazy registered plugin
213
# commands are registered).
214
# when they are simply created.
216
commands.install_bzr_command_hooks()
217
commands.Command.hooks.install_named_hook(
218
"extend_command", hook_calls.append, None)
219
# create a command, should not fire
220
class cmd_test_extend_command_hook(commands.Command):
221
__doc__ = """A sample command."""
222
self.assertEqual([], hook_calls)
224
# register the command class, should not fire
226
commands.builtin_command_registry.register(cmd_test_extend_command_hook)
227
self.assertEqual([], hook_calls)
228
# and ask for the object, should fire
229
cmd = commands.get_cmd_object('test-extend-command-hook')
230
# For resilience - to ensure all code paths hit it - we
231
# fire on everything returned in the 'cmd_dict', which is currently
232
# all known commands, so assert that cmd is in hook_calls
233
self.assertSubset([cmd], hook_calls)
236
commands.builtin_command_registry.remove('test-extend-command-hook')
237
# -- as a plugin lazy registration
239
# register the command class, should not fire
240
commands.plugin_cmds.register_lazy('cmd_fake', [],
241
'bzrlib.tests.fake_command')
242
self.assertEqual([], hook_calls)
243
# and ask for the object, should fire
244
cmd = commands.get_cmd_object('fake')
245
self.assertEqual([cmd], hook_calls)
247
commands.plugin_cmds.remove('fake')
250
class TestGetCommandHook(tests.TestCase):
252
def test_fires_on_get_cmd_object(self):
253
# The get_command(cmd) hook fires when commands are delivered to the
255
commands.install_bzr_command_hooks()
257
class ACommand(commands.Command):
258
__doc__ = """A sample command."""
259
def get_cmd(cmd_or_None, cmd_name):
260
hook_calls.append(('called', cmd_or_None, cmd_name))
261
if cmd_name in ('foo', 'info'):
263
commands.Command.hooks.install_named_hook(
264
"get_command", get_cmd, None)
265
# create a command directly, should not fire
267
self.assertEqual([], hook_calls)
268
# ask by name, should fire and give us our command
269
cmd = commands.get_cmd_object('foo')
270
self.assertEqual([('called', None, 'foo')], hook_calls)
271
self.assertIsInstance(cmd, ACommand)
273
# ask by a name that is supplied by a builtin - the hook should still
274
# fire and we still get our object, but we should see the builtin
275
# passed to the hook.
276
cmd = commands.get_cmd_object('info')
277
self.assertIsInstance(cmd, ACommand)
278
self.assertEqual(1, len(hook_calls))
279
self.assertEqual('info', hook_calls[0][2])
280
self.assertIsInstance(hook_calls[0][1], builtins.cmd_info)
283
class TestGetMissingCommandHook(tests.TestCase):
285
def hook_missing(self):
286
"""Hook get_missing_command for testing."""
288
class ACommand(commands.Command):
289
__doc__ = """A sample command."""
290
def get_missing_cmd(cmd_name):
291
self.hook_calls.append(('called', cmd_name))
292
if cmd_name in ('foo', 'info'):
294
commands.Command.hooks.install_named_hook(
295
"get_missing_command", get_missing_cmd, None)
296
self.ACommand = ACommand
298
def test_fires_on_get_cmd_object(self):
299
# The get_missing_command(cmd) hook fires when commands are delivered to the
302
# create a command directly, should not fire
303
self.cmd = self.ACommand()
304
self.assertEqual([], self.hook_calls)
305
# ask by name, should fire and give us our command
306
cmd = commands.get_cmd_object('foo')
307
self.assertEqual([('called', 'foo')], self.hook_calls)
308
self.assertIsInstance(cmd, self.ACommand)
309
del self.hook_calls[:]
310
# ask by a name that is supplied by a builtin - the hook should not
311
# fire and we still get our object.
312
commands.install_bzr_command_hooks()
313
cmd = commands.get_cmd_object('info')
314
self.assertNotEqual(None, cmd)
315
self.assertEqual(0, len(self.hook_calls))
317
def test_skipped_on_HelpCommandIndex_get_topics(self):
318
# The get_missing_command(cmd_name) hook is not fired when
319
# looking up help topics.
321
topic = commands.HelpCommandIndex()
322
topics = topic.get_topics('foo')
323
self.assertEqual([], self.hook_calls)
326
class TestListCommandHook(tests.TestCase):
328
def test_fires_on_all_command_names(self):
329
# The list_commands() hook fires when all_command_names() is invoked.
331
commands.install_bzr_command_hooks()
332
def list_my_commands(cmd_names):
333
hook_calls.append('called')
334
cmd_names.update(['foo', 'bar'])
336
commands.Command.hooks.install_named_hook(
337
"list_commands", list_my_commands, None)
338
# Get a command, which should not trigger the hook.
339
cmd = commands.get_cmd_object('info')
340
self.assertEqual([], hook_calls)
341
# Get all command classes (for docs and shell completion).
342
cmds = list(commands.all_command_names())
343
self.assertEqual(['called'], hook_calls)
344
self.assertSubset(['foo', 'bar'], cmds)
347
class TestDeprecations(tests.TestCase):
349
def test_shlex_split_unicode_deprecation(self):
350
res = self.applyDeprecated(
351
symbol_versioning.deprecated_in((2, 2, 0)),
352
commands.shlex_split_unicode, 'whatever')