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.0KB

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