You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

plugin_test.rb 7.7KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208
  1. # frozen_string_literal: true
  2. # Redmine - project management software
  3. # Copyright (C) 2006-2017 Jean-Philippe Lang
  4. #
  5. # This program is free software; you can redistribute it and/or
  6. # modify it under the terms of the GNU General Public License
  7. # as published by the Free Software Foundation; either version 2
  8. # of the License, or (at your option) any later version.
  9. #
  10. # This program is distributed in the hope that it will be useful,
  11. # but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13. # GNU General Public License for more details.
  14. #
  15. # You should have received a copy of the GNU General Public License
  16. # along with this program; if not, write to the Free Software
  17. # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  18. require File.expand_path('../../../../test_helper', __FILE__)
  19. class Redmine::PluginTest < ActiveSupport::TestCase
  20. def setup
  21. @klass = Redmine::Plugin
  22. # Change plugin directory for testing to default
  23. # plugins/foo => test/fixtures/plugins/foo
  24. @klass.directory = Rails.root.join('test/fixtures/plugins')
  25. # In case some real plugins are installed
  26. @klass.clear
  27. end
  28. def teardown
  29. @klass.clear
  30. end
  31. def test_register
  32. @klass.register :foo_plugin do
  33. name 'Foo plugin'
  34. url 'http://example.net/plugins/foo'
  35. author 'John Smith'
  36. author_url 'http://example.net/jsmith'
  37. description 'This is a test plugin'
  38. version '0.0.1'
  39. settings :default => {'sample_setting' => 'value', 'foo'=>'bar'}, :partial => 'foo/settings'
  40. end
  41. assert_equal 1, @klass.all.size
  42. plugin = @klass.find('foo_plugin')
  43. assert plugin.is_a?(Redmine::Plugin)
  44. assert_equal :foo_plugin, plugin.id
  45. assert_equal 'Foo plugin', plugin.name
  46. assert_equal 'http://example.net/plugins/foo', plugin.url
  47. assert_equal 'John Smith', plugin.author
  48. assert_equal 'http://example.net/jsmith', plugin.author_url
  49. assert_equal 'This is a test plugin', plugin.description
  50. assert_equal '0.0.1', plugin.version
  51. end
  52. def test_register_should_raise_error_if_plugin_directory_does_not_exist
  53. e = assert_raises Redmine::PluginNotFound do
  54. @klass.register(:bar_plugin) {}
  55. end
  56. assert_equal "Plugin not found. The directory for plugin bar_plugin should be #{Rails.root.join('test/fixtures/plugins/bar_plugin')}.", e.message
  57. end
  58. def test_installed
  59. @klass.register(:foo_plugin) {}
  60. assert_equal true, @klass.installed?(:foo_plugin)
  61. assert_equal false, @klass.installed?(:bar)
  62. end
  63. def test_menu
  64. assert_difference 'Redmine::MenuManager.items(:project_menu).size' do
  65. @klass.register :foo_plugin do
  66. menu :project_menu, :foo_menu_item, '/foo', :caption => 'Foo'
  67. end
  68. end
  69. menu_item = Redmine::MenuManager.items(:project_menu).detect {|i| i.name == :foo_menu_item}
  70. assert_not_nil menu_item
  71. assert_equal 'Foo', menu_item.caption
  72. assert_equal '/foo', menu_item.url
  73. ensure
  74. Redmine::MenuManager.map(:project_menu).delete(:foo_menu_item)
  75. end
  76. def test_delete_menu_item
  77. Redmine::MenuManager.map(:project_menu).push(:foo_menu_item, '/foo', :caption => 'Foo')
  78. assert_difference 'Redmine::MenuManager.items(:project_menu).size', -1 do
  79. @klass.register :foo_plugin do
  80. delete_menu_item :project_menu, :foo_menu_item
  81. end
  82. end
  83. assert_nil Redmine::MenuManager.items(:project_menu).detect {|i| i.name == :foo_menu_item}
  84. ensure
  85. Redmine::MenuManager.map(:project_menu).delete(:foo_menu_item)
  86. end
  87. def test_directory_with_override
  88. @klass.register(:foo) do
  89. directory 'test/fixtures/plugins/foo_plugin'
  90. end
  91. assert_equal 'test/fixtures/plugins/foo_plugin', @klass.find('foo').directory
  92. end
  93. def test_directory_without_override
  94. @klass.register(:other_plugin) {}
  95. assert_equal File.join(@klass.directory, 'other_plugin'), @klass.find('other_plugin').directory
  96. end
  97. def test_requires_redmine
  98. plugin = Redmine::Plugin.register(:foo_plugin) {}
  99. Redmine::VERSION.stubs(:to_a).returns([2, 1, 3, "stable", 10817])
  100. # Specific version without hash
  101. assert plugin.requires_redmine('2.1.3')
  102. assert plugin.requires_redmine('2.1')
  103. assert_raise Redmine::PluginRequirementError do
  104. plugin.requires_redmine('2.1.4')
  105. end
  106. assert_raise Redmine::PluginRequirementError do
  107. plugin.requires_redmine('2.2')
  108. end
  109. # Specific version
  110. assert plugin.requires_redmine(:version => '2.1.3')
  111. assert plugin.requires_redmine(:version => ['2.1.3', '2.2.0'])
  112. assert plugin.requires_redmine(:version => '2.1')
  113. assert_raise Redmine::PluginRequirementError do
  114. plugin.requires_redmine(:version => '2.2.0')
  115. end
  116. assert_raise Redmine::PluginRequirementError do
  117. plugin.requires_redmine(:version => ['2.1.4', '2.2.0'])
  118. end
  119. assert_raise Redmine::PluginRequirementError do
  120. plugin.requires_redmine(:version => '2.2')
  121. end
  122. # Version range
  123. assert plugin.requires_redmine(:version => '2.0.0'..'2.2.4')
  124. assert plugin.requires_redmine(:version => '2.1.3'..'2.2.4')
  125. assert plugin.requires_redmine(:version => '2.0.0'..'2.1.3')
  126. assert plugin.requires_redmine(:version => '2.0'..'2.2')
  127. assert plugin.requires_redmine(:version => '2.1'..'2.2')
  128. assert plugin.requires_redmine(:version => '2.0'..'2.1')
  129. assert_raise Redmine::PluginRequirementError do
  130. plugin.requires_redmine(:version => '2.1.4'..'2.2.4')
  131. end
  132. # Version or higher
  133. assert plugin.requires_redmine(:version_or_higher => '0.1.0')
  134. assert plugin.requires_redmine(:version_or_higher => '2.1.3')
  135. assert plugin.requires_redmine(:version_or_higher => '2.1')
  136. assert_raise Redmine::PluginRequirementError do
  137. plugin.requires_redmine(:version_or_higher => '2.2.0')
  138. end
  139. assert_raise Redmine::PluginRequirementError do
  140. plugin.requires_redmine(:version_or_higher => '2.2')
  141. end
  142. end
  143. def test_requires_redmine_plugin
  144. test = self
  145. other_version = '0.5.0'
  146. @klass.register :other_plugin do
  147. name 'Other'
  148. version other_version
  149. end
  150. @klass.register :foo_plugin do
  151. test.assert requires_redmine_plugin(:other_plugin, :version_or_higher => '0.1.0')
  152. test.assert requires_redmine_plugin(:other_plugin, :version_or_higher => other_version)
  153. test.assert requires_redmine_plugin(:other_plugin, other_version)
  154. test.assert_raise Redmine::PluginRequirementError do
  155. requires_redmine_plugin(:other_plugin, :version_or_higher => '99.0.0')
  156. end
  157. test.assert requires_redmine_plugin(:other_plugin, :version => other_version)
  158. test.assert requires_redmine_plugin(:other_plugin, :version => [other_version, '99.0.0'])
  159. test.assert_raise Redmine::PluginRequirementError do
  160. requires_redmine_plugin(:other_plugin, :version => '99.0.0')
  161. end
  162. test.assert_raise Redmine::PluginRequirementError do
  163. requires_redmine_plugin(:other_plugin, :version => ['98.0.0', '99.0.0'])
  164. end
  165. # Missing plugin
  166. test.assert_raise Redmine::PluginRequirementError do
  167. requires_redmine_plugin(:missing, :version_or_higher => '0.1.0')
  168. end
  169. test.assert_raise Redmine::PluginRequirementError do
  170. requires_redmine_plugin(:missing, '0.1.0')
  171. end
  172. test.assert_raise Redmine::PluginRequirementError do
  173. requires_redmine_plugin(:missing, :version => '0.1.0')
  174. end
  175. end
  176. end
  177. def test_settings_warns_about_possible_partial_collision
  178. @klass.register(:foo_plugin) { settings :partial => 'foo/settings' }
  179. Rails.logger.expects(:warn)
  180. @klass.register(:other_plugin) { settings :partial => 'foo/settings' }
  181. end
  182. def test_migrate_redmine_plugin
  183. @klass.register :foo_plugin do
  184. name 'Foo plugin'
  185. version '0.0.1'
  186. end
  187. assert Redmine::Plugin.migrate('foo_plugin')
  188. end
  189. end