1
# Copyright (C) 2005 by Canonical Ltd
1
# Copyright (C) 2005 Canonical Ltd
3
3
# This program is free software; you can redistribute it and/or modify
4
4
# it under the terms of the GNU General Public License as published by
5
5
# the Free Software Foundation; either version 2 of the License, or
6
6
# (at your option) any later version.
8
8
# This program is distributed in the hope that it will be useful,
9
9
# but WITHOUT ANY WARRANTY; without even the implied warranty of
10
10
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11
11
# GNU General Public License for more details.
13
13
# You should have received a copy of the GNU General Public License
14
14
# along with this program; if not, write to the Free Software
15
15
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18
17
"""Tests for plugins"""
20
19
# XXX: There are no plugin tests at the moment because the plugin module
24
from StringIO import StringIO
26
from bzrlib.selftest import TestCaseInTempDir
28
import bzrlib.commands
30
from bzrlib.tests import TestCaseInTempDir
31
from bzrlib.osutils import pathjoin, abspath
28
33
class PluginTest(TestCaseInTempDir):
29
34
"""Create an external plugin and test loading."""
30
35
# def test_plugin_loading(self):
31
36
# orig_help = self.run_bzr_captured('bzr help commands')[0]
32
37
# os.mkdir('plugin_test')
33
# f = open(os.path.join('plugin_test', 'myplug.py'), 'wt')
38
# f = open(pathjoin('plugin_test', 'myplug.py'), 'wt')
34
39
# f.write(PLUGIN_TEXT)
36
41
# newhelp = self.run_bzr_captured('bzr help commands')[0]
76
81
print 'Hello from my plugin'
84
# TODO: Write a test for plugin decoration of commands.
86
class TestOneNamedPluginOnly(TestCaseInTempDir):
90
def test_plugins_with_the_same_name_are_not_loaded(self):
91
# This test tests that having two plugins in different
92
# directories does not result in both being loaded.
93
# get a file name we can use which is also a valid attribute
94
# for accessing in activeattributes. - we cannot give import parameters.
96
self.failIf(tempattribute in self.activeattributes)
97
# set a place for the plugins to record their loading, and at the same
98
# time validate that the location the plugins should record to is
100
bzrlib.tests.test_plugins.TestOneNamedPluginOnly.activeattributes \
102
self.failUnless(tempattribute in self.activeattributes)
103
# create two plugin directories
106
# write a plugin that will record when its loaded in the
107
# tempattribute list.
108
template = ("from bzrlib.tests.test_plugins import TestOneNamedPluginOnly\n"
109
"TestOneNamedPluginOnly.activeattributes[%r].append('%s')\n")
110
print >> file(os.path.join('first', 'plugin.py'), 'w'), template % (tempattribute, 'first')
111
print >> file(os.path.join('second', 'plugin.py'), 'w'), template % (tempattribute, 'second')
113
bzrlib.plugin.load_from_dirs(['first', 'second'])
114
self.assertEqual(['first'], self.activeattributes[tempattribute])
116
# remove the plugin 'plugin'
117
del self.activeattributes[tempattribute]
118
if getattr(bzrlib.plugins, 'plugin', None):
119
del bzrlib.plugins.plugin
120
self.failIf(getattr(bzrlib.plugins, 'plugin', None))
123
class TestAllPlugins(TestCaseInTempDir):
125
def test_plugin_appears_in_all_plugins(self):
126
# This test tests a new plugin appears in bzrlib.plugin.all_plugins().
127
# check the plugin is not loaded already
128
self.failIf(getattr(bzrlib.plugins, 'plugin', None))
129
# write a plugin that _cannot_ fail to load.
130
print >> file('plugin.py', 'w'), ""
132
bzrlib.plugin.load_from_dirs(['.'])
133
self.failUnless('plugin' in bzrlib.plugin.all_plugins())
134
self.failUnless(getattr(bzrlib.plugins, 'plugin', None))
135
self.assertEqual(bzrlib.plugin.all_plugins()['plugin'],
136
bzrlib.plugins.plugin)
138
# remove the plugin 'plugin'
139
if getattr(bzrlib.plugins, 'plugin', None):
140
del bzrlib.plugins.plugin
141
self.failIf(getattr(bzrlib.plugins, 'plugin', None))
144
class TestPluginHelp(TestCaseInTempDir):
146
def split_help_commands(self):
149
for line in self.capture('help commands').splitlines():
150
if not line.startswith(' '):
151
current = line.split()[0]
152
help[current] = help.get(current, '') + line
156
def test_plugin_help_builtins_unaffected(self):
157
# Check we don't get false positives
158
help_commands = self.split_help_commands()
159
for cmd_name in bzrlib.commands.builtin_command_names():
160
if cmd_name in bzrlib.commands.plugin_command_names():
164
bzrlib.help.help_on_command(cmd_name, help)
165
except NotImplementedError:
166
# some commands have no help
170
self.assertNotContainsRe(help.read(), 'From plugin "[^"]*"')
172
if help in help_commands.keys():
173
# some commands are hidden
174
help = help_commands[cmd_name]
175
self.assertNotContainsRe(help, 'From plugin "[^"]*"')
177
def test_plugin_help_shows_plugin(self):
178
# Create a test plugin
179
os.mkdir('plugin_test')
180
f = open(pathjoin('plugin_test', 'myplug.py'), 'w')
186
bzrlib.plugin.load_from_dirs(['plugin_test'])
187
bzrlib.commands.register_command( bzrlib.plugins.myplug.cmd_myplug)
188
help = self.capture('help myplug')
189
self.assertContainsRe(help, 'From plugin "myplug"')
190
help = self.split_help_commands()['myplug']
191
self.assertContainsRe(help, '\[myplug\]')
193
# remove the plugin 'plugin'
194
if getattr(bzrlib.plugins, 'plugin', None):
195
del bzrlib.plugins.plugin