Du kannst nicht mehr als 25 Themen auswählen Themen müssen mit entweder einem Buchstaben oder einer Ziffer beginnen. Sie können Bindestriche („-“) enthalten und bis zu 35 Zeichen lang sein.

plugin_test.rb 7.4KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200
  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_installed
  53. @klass.register(:foo_plugin) {}
  54. assert_equal true, @klass.installed?(:foo_plugin)
  55. assert_equal false, @klass.installed?(:bar)
  56. end
  57. def test_menu
  58. assert_difference 'Redmine::MenuManager.items(:project_menu).size' do
  59. @klass.register :foo_plugin do
  60. menu :project_menu, :foo_menu_item, '/foo', :caption => 'Foo'
  61. end
  62. end
  63. menu_item = Redmine::MenuManager.items(:project_menu).detect {|i| i.name == :foo_menu_item}
  64. assert_not_nil menu_item
  65. assert_equal 'Foo', menu_item.caption
  66. assert_equal '/foo', menu_item.url
  67. ensure
  68. Redmine::MenuManager.map(:project_menu).delete(:foo_menu_item)
  69. end
  70. def test_delete_menu_item
  71. Redmine::MenuManager.map(:project_menu).push(:foo_menu_item, '/foo', :caption => 'Foo')
  72. assert_difference 'Redmine::MenuManager.items(:project_menu).size', -1 do
  73. @klass.register :foo_plugin do
  74. delete_menu_item :project_menu, :foo_menu_item
  75. end
  76. end
  77. assert_nil Redmine::MenuManager.items(:project_menu).detect {|i| i.name == :foo_menu_item}
  78. ensure
  79. Redmine::MenuManager.map(:project_menu).delete(:foo_menu_item)
  80. end
  81. def test_directory_with_override
  82. @klass.register(:foo) do
  83. directory 'test/fixtures/plugins/foo_plugin'
  84. end
  85. assert_equal 'test/fixtures/plugins/foo_plugin', @klass.find('foo').directory
  86. end
  87. def test_directory_without_override
  88. @klass.register(:other_plugin) {}
  89. assert_equal File.join(@klass.directory, 'other_plugin'), @klass.find('other_plugin').directory
  90. end
  91. def test_requires_redmine
  92. plugin = Redmine::Plugin.register(:foo_plugin) {}
  93. Redmine::VERSION.stubs(:to_a).returns([2, 1, 3, "stable", 10817])
  94. # Specific version without hash
  95. assert plugin.requires_redmine('2.1.3')
  96. assert plugin.requires_redmine('2.1')
  97. assert_raise Redmine::PluginRequirementError do
  98. plugin.requires_redmine('2.1.4')
  99. end
  100. assert_raise Redmine::PluginRequirementError do
  101. plugin.requires_redmine('2.2')
  102. end
  103. # Specific version
  104. assert plugin.requires_redmine(:version => '2.1.3')
  105. assert plugin.requires_redmine(:version => ['2.1.3', '2.2.0'])
  106. assert plugin.requires_redmine(:version => '2.1')
  107. assert_raise Redmine::PluginRequirementError do
  108. plugin.requires_redmine(:version => '2.2.0')
  109. end
  110. assert_raise Redmine::PluginRequirementError do
  111. plugin.requires_redmine(:version => ['2.1.4', '2.2.0'])
  112. end
  113. assert_raise Redmine::PluginRequirementError do
  114. plugin.requires_redmine(:version => '2.2')
  115. end
  116. # Version range
  117. assert plugin.requires_redmine(:version => '2.0.0'..'2.2.4')
  118. assert plugin.requires_redmine(:version => '2.1.3'..'2.2.4')
  119. assert plugin.requires_redmine(:version => '2.0.0'..'2.1.3')
  120. assert plugin.requires_redmine(:version => '2.0'..'2.2')
  121. assert plugin.requires_redmine(:version => '2.1'..'2.2')
  122. assert plugin.requires_redmine(:version => '2.0'..'2.1')
  123. assert_raise Redmine::PluginRequirementError do
  124. plugin.requires_redmine(:version => '2.1.4'..'2.2.4')
  125. end
  126. # Version or higher
  127. assert plugin.requires_redmine(:version_or_higher => '0.1.0')
  128. assert plugin.requires_redmine(:version_or_higher => '2.1.3')
  129. assert plugin.requires_redmine(:version_or_higher => '2.1')
  130. assert_raise Redmine::PluginRequirementError do
  131. plugin.requires_redmine(:version_or_higher => '2.2.0')
  132. end
  133. assert_raise Redmine::PluginRequirementError do
  134. plugin.requires_redmine(:version_or_higher => '2.2')
  135. end
  136. end
  137. def test_requires_redmine_plugin
  138. test = self
  139. other_version = '0.5.0'
  140. @klass.register :other_plugin do
  141. name 'Other'
  142. version other_version
  143. end
  144. @klass.register :foo_plugin do
  145. test.assert requires_redmine_plugin(:other_plugin, :version_or_higher => '0.1.0')
  146. test.assert requires_redmine_plugin(:other_plugin, :version_or_higher => other_version)
  147. test.assert requires_redmine_plugin(:other_plugin, other_version)
  148. test.assert_raise Redmine::PluginRequirementError do
  149. requires_redmine_plugin(:other_plugin, :version_or_higher => '99.0.0')
  150. end
  151. test.assert requires_redmine_plugin(:other_plugin, :version => other_version)
  152. test.assert requires_redmine_plugin(:other_plugin, :version => [other_version, '99.0.0'])
  153. test.assert_raise Redmine::PluginRequirementError do
  154. requires_redmine_plugin(:other_plugin, :version => '99.0.0')
  155. end
  156. test.assert_raise Redmine::PluginRequirementError do
  157. requires_redmine_plugin(:other_plugin, :version => ['98.0.0', '99.0.0'])
  158. end
  159. # Missing plugin
  160. test.assert_raise Redmine::PluginRequirementError do
  161. requires_redmine_plugin(:missing, :version_or_higher => '0.1.0')
  162. end
  163. test.assert_raise Redmine::PluginRequirementError do
  164. requires_redmine_plugin(:missing, '0.1.0')
  165. end
  166. test.assert_raise Redmine::PluginRequirementError do
  167. requires_redmine_plugin(:missing, :version => '0.1.0')
  168. end
  169. end
  170. end
  171. def test_settings_warns_about_possible_partial_collision
  172. @klass.register(:foo_plugin) { settings :partial => 'foo/settings' }
  173. Rails.logger.expects(:warn)
  174. @klass.register(:other_plugin) { settings :partial => 'foo/settings' }
  175. end
  176. def test_migrate_redmine_plugin
  177. @klass.register :foo_plugin do
  178. name 'Foo plugin'
  179. version '0.0.1'
  180. end
  181. assert Redmine::Plugin.migrate('foo_plugin')
  182. end
  183. end