Commit ebd822e937e759294c71374a29c405259f7940c4

Authored by Rodrigo Souto
1 parent 098f1c0d

plugin-tests-task: refactor to allow independent plugin test run

Making every plugin run its tests with independently, with only its
migrations and only it enabled.
lib/noosfero.rb
1 # -*- coding: utf-8 -*- 1 # -*- coding: utf-8 -*-
2 require 'fast_gettext' 2 require 'fast_gettext'
3 -  
4 module Noosfero 3 module Noosfero
5 PROJECT = 'noosfero' 4 PROJECT = 'noosfero'
6 VERSION = '0.47.0~rc1' 5 VERSION = '0.47.0~rc1'
lib/tasks/plugins_tests.rake
1 -all_plugins = Dir.glob('plugins/*').map { |f| File.basename(f) } - ['template'] 1 +@all_plugins = Dir.glob('plugins/*').map { |f| File.basename(f) } - ['template']
  2 +@all_tasks = [:units, :functionals, :integration, :cucumber, :selenium]
  3 +
2 def enabled_plugins 4 def enabled_plugins
3 Dir.glob('config/plugins/*').map { |f| File.basename(f) } - ['README'] 5 Dir.glob('config/plugins/*').map { |f| File.basename(f) } - ['README']
4 end 6 end
5 -disabled_plugins = all_plugins - enabled_plugins 7 +
  8 +@original_enabled_plugins = enabled_plugins
  9 +
  10 +def disabled_plugins
  11 + @all_plugins - enabled_plugins
  12 +end
  13 +
  14 +def enable_plugins(plugins = nil)
  15 + if plugins == '*' || plugins.nil?
  16 + sh './script/noosfero-plugins', '-q', 'enableall'
  17 + else
  18 + plugins = Array(plugins)
  19 + sh './script/noosfero-plugins', '-q', 'enable', *plugins
  20 + end
  21 +end
  22 +
  23 +def disable_plugins(plugins = nil)
  24 + if plugins == '*' || plugins.nil?
  25 + sh './script/noosfero-plugins', '-q', 'disableall'
  26 + else
  27 + plugins = Array(plugins)
  28 + sh './script/noosfero-plugins', '-q', 'disable', *plugins
  29 + end
  30 +end
  31 +
  32 +def rollback_plugins_state
  33 + puts
  34 + puts "==> Rolling back plugins to their original states..."
  35 + disable_plugins
  36 + enable_plugins(@original_enabled_plugins)
  37 +end
6 38
7 task 'db:test:plugins:prepare' do 39 task 'db:test:plugins:prepare' do
8 if Dir.glob('config/plugins/*/db/migrate/*.rb').empty? 40 if Dir.glob('config/plugins/*/db/migrate/*.rb').empty?
9 puts "I: skipping database setup, enabled plugins have no migrations" 41 puts "I: skipping database setup, enabled plugins have no migrations"
10 else 42 else
11 - Rake::Task['db:test:prepare'].invoke 43 + Rake::Task['db:test:prepare'].execute
12 sh 'rake db:migrate RAILS_ENV=test SCHEMA=/dev/null' 44 sh 'rake db:migrate RAILS_ENV=test SCHEMA=/dev/null'
13 end 45 end
14 end 46 end
@@ -101,72 +133,74 @@ def run_tests(name, plugins, run=:individually) @@ -101,72 +133,74 @@ def run_tests(name, plugins, run=:individually)
101 end 133 end
102 end 134 end
103 135
104 -def plugin_test_task(name, plugin, run=:individually)  
105 - desc "Run #{name} tests for #{plugin_name(plugin)}"  
106 - task name => 'db:test:plugins:prepare' do |t|  
107 - if plugin_enabled?(plugin)  
108 - run_tests(name, plugin, run)  
109 - else  
110 - plugin_disabled_warning(plugin) 136 +def test_sequence(plugins, tasks)
  137 + failed = {}
  138 + disable_plugins
  139 + plugins = @all_plugins if plugins == '*'
  140 + plugins = Array(plugins)
  141 + tasks = Array(tasks)
  142 + plugins.each do |plugin|
  143 + failed[plugin] = []
  144 + enable_plugins(plugin)
  145 + next if !plugin_enabled?(plugin)
  146 + begin
  147 + Rake::Task['db:test:plugins:prepare' ].execute
  148 + rescue Exception => ex
  149 + failed[plugin] << :migration
111 end 150 end
112 - end  
113 -end  
114 -  
115 -def test_sequence_task(name, plugin, *tasks)  
116 - desc "Run all tests for #{plugin_name(plugin)}"  
117 - task name do  
118 - failed = []  
119 tasks.each do |task| 151 tasks.each do |task|
120 begin 152 begin
121 - Rake::Task['test:noosfero_plugins:' + task.to_s].invoke 153 + run_tests(task, plugin)
122 rescue Exception => ex 154 rescue Exception => ex
123 puts ex 155 puts ex
124 - failed << task 156 + failed[plugin] << task
125 end 157 end
126 end 158 end
127 - unless failed.empty?  
128 - fail 'Tests failed: ' + failed.join(', ') 159 + disable_plugins(plugin)
  160 + end
  161 + fail_flag = false
  162 + failed.each do |plugin, tasks|
  163 + unless tasks.empty?
  164 + puts "Tests failed on #{plugin} plugin: #{tasks.join(', ')}"
  165 + fail_flag = true
129 end 166 end
130 end 167 end
  168 + rollback_plugins_state
  169 + fail 'There are broken tests to be fixed!' if fail_flag
  170 +end
  171 +
  172 +def plugin_test_task(plugin, task, run=:individually)
  173 + desc "Run #{task} tests for #{plugin_name(plugin)}"
  174 + task task do
  175 + test_sequence(plugin, task)
  176 + end
131 end 177 end
132 178
133 namespace :test do 179 namespace :test do
134 namespace :noosfero_plugins do 180 namespace :noosfero_plugins do
135 - all_plugins.each do |plugin| 181 + @all_plugins.each do |plugin|
136 namespace plugin do 182 namespace plugin do
137 - plugin_test_task :units, plugin  
138 - plugin_test_task :functionals, plugin  
139 - plugin_test_task :integration, plugin  
140 - plugin_test_task :cucumber, plugin  
141 - plugin_test_task :selenium, plugin 183 + @all_tasks.each do |taskname|
  184 + plugin_test_task plugin, taskname
  185 + end
142 end 186 end
143 187
144 - test_sequence_task(plugin, plugin, "#{plugin}:units", "#{plugin}:functionals", "#{plugin}:integration", "#{plugin}:cucumber", "#{plugin}:selenium")  
145 - end  
146 -  
147 - [:units, :functionals, :integration].each do |taskname|  
148 - task taskname => 'db:test:plugins:prepare' do |t|  
149 - run_tests taskname, enabled_plugins 188 + desc "Run all tests for #{plugin_name(plugin)}"
  189 + task plugin do
  190 + test_sequence([plugin], @all_tasks)
150 end 191 end
151 end 192 end
152 193
153 - task :cucumber => 'db:test:plugins:prepare' do |t|  
154 - run_tests :cucumber, enabled_plugins  
155 - end  
156 -  
157 - task :selenium => 'db:test:plugins:prepare' do |t|  
158 - run_tests :selenium, enabled_plugins  
159 - end  
160 -  
161 - task :temp_enable_all_plugins do  
162 - sh './script/noosfero-plugins', 'enableall'  
163 - end  
164 -  
165 - task :rollback_enable_all_plugins do  
166 - sh './script/noosfero-plugins', 'disable', *disabled_plugins 194 + @all_tasks.each do |taskname|
  195 + desc "Run #{taskname} tests for all plugins"
  196 + task taskname do
  197 + test_sequence(@all_plugins, taskname)
  198 + end
167 end 199 end
168 end 200 end
169 201
170 - test_sequence_task(:noosfero_plugins, '*', :temp_enable_all_plugins, :units, :functionals, :integration, :cucumber, :selenium, :rollback_enable_all_plugins)  
171 - 202 + desc "Run all tests for all plugins"
  203 + task :noosfero_plugins do
  204 + test_sequence(@all_plugins, @all_tasks)
  205 + end
172 end 206 end
plugins/ldap/install.rb
@@ -4,7 +4,7 @@ rescue Gem::LoadError =&gt; exception @@ -4,7 +4,7 @@ rescue Gem::LoadError =&gt; exception
4 system "gem install --user-install net-ldap -v 0.3.1" 4 system "gem install --user-install net-ldap -v 0.3.1"
5 end 5 end
6 6
7 -puts "\nWARNING: This plugin is not setting up a ldap test server automatically. 7 +puts "WARNING: This plugin is not setting up a ldap test server automatically.
8 Some tests may not be running. If you want to fully test this plugin, please 8 Some tests may not be running. If you want to fully test this plugin, please
9 setup the ldap test server and make the proper configurations on 9 setup the ldap test server and make the proper configurations on
10 fixtures/ldap.yml.\n\n" 10 fixtures/ldap.yml.\n\n"
plugins/ldap/test/test_helper.rb
@@ -20,4 +20,4 @@ def ldap_configured? @@ -20,4 +20,4 @@ def ldap_configured?
20 end 20 end
21 end 21 end
22 22
23 -LDAP_SERVER_ERROR_MESSAGE = "\n\nWARNING: LDAP test server is not configured properly. Please see the file fixtures/ldap.yml on ldap plugin\n\n" 23 +LDAP_SERVER_ERROR_MESSAGE = "\nWARNING: LDAP test server is not configured properly. Please see the file fixtures/ldap.yml on ldap plugin\n\n"
script/noosfero-plugins
@@ -108,8 +108,10 @@ _enable(){ @@ -108,8 +108,10 @@ _enable(){
108 needs_migrate=true 108 needs_migrate=true
109 elif [ "$installation_ok" = false ]; then 109 elif [ "$installation_ok" = false ]; then
110 echo "W: failed to install $plugin; not enabling" 110 echo "W: failed to install $plugin; not enabling"
  111 + echo
111 elif [ "$dependencies_ok" = false ]; then 112 elif [ "$dependencies_ok" = false ]; then
112 echo "W: failed to load dependencies for $plugin; not enabling" 113 echo "W: failed to load dependencies for $plugin; not enabling"
  114 + echo
113 fi 115 fi
114 fi 116 fi
115 } 117 }
@@ -227,6 +229,7 @@ esac @@ -227,6 +229,7 @@ esac
227 229
228 if [ "$needs_migrate" = 'true' ] && [ "$quiet" = 'false' ]; then 230 if [ "$needs_migrate" = 'true' ] && [ "$quiet" = 'false' ]; then
229 cat <<-EOF 231 cat <<-EOF
  232 +
230 ==================================================================== 233 ====================================================================
231 To finish the activation of the plugins you have just enabled, you 234 To finish the activation of the plugins you have just enabled, you
232 need to restart Noosfero. 235 need to restart Noosfero.