From 2ec5f07eb9056914cd563696aaf30c6a08e082a2 Mon Sep 17 00:00:00 2001 From: Antonio Terceiro Date: Tue, 28 Aug 2012 12:12:03 -0300 Subject: [PATCH] Refactor plugin tests tasks --- lib/tasks/plugins_tests.rake | 168 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-------------------------------------------------------------------------------- 1 file changed, 88 insertions(+), 80 deletions(-) diff --git a/lib/tasks/plugins_tests.rake b/lib/tasks/plugins_tests.rake index ad1cca2..f6e7f6c 100644 --- a/lib/tasks/plugins_tests.rake +++ b/lib/tasks/plugins_tests.rake @@ -1,106 +1,114 @@ -@disabled_plugins = Dir.glob(File.join(Rails.root, 'plugins', '*')).map { |file| File.basename(file)} - Dir.glob(File.join(Rails.root, 'config', 'plugins', '*')).map { |file| File.basename(file)} -@disabled_plugins.delete('template') - -def define_task(test, plugins_folder='plugins', plugin = '*') - test_files = Dir.glob(File.join(Rails.root, plugins_folder, plugin, 'test', test[:folder], '**', '*_test.rb')) - desc 'Runs ' + (plugin != '*' ? plugin : 'plugins') + ' ' + test[:name] + ' tests' - Rake::TestTask.new(test[:name].to_sym => 'db:test:plugins:prepare') do |t| - t.libs << 'test' - t.test_files = test_files - t.verbose = true - end +all_plugins = Dir.glob('plugins/*').map { |f| File.basename(f) } - ['template'] +def enabled_plugins + Dir.glob('config/plugins/*').map { |f| File.basename(f) } - ['README'] end +disabled_plugins = all_plugins - enabled_plugins task 'db:test:plugins:prepare' do - Rake::Task['db:test:prepare'].invoke - sh 'rake db:migrate RAILS_ENV=test SCHEMA=/dev/null' + if Dir.glob('config/plugins/*/db/migrate/*.rb').empty? + puts "I: skipping database setup, enabled plugins have no migrations" + else + Rake::Task['db:test:prepare'].invoke + sh 'rake db:migrate RAILS_ENV=test SCHEMA=/dev/null' + end end -namespace :test do - namespace :noosfero_plugins do - tasks = [ - {:name => :available, :folder => 'plugins'}, - {:name => :enabled, :folder => File.join('config', 'plugins')} - ] - tests = [ - {:name => 'units', :folder => 'unit'}, - {:name => 'functionals', :folder => 'functional'}, - {:name => 'integration', :folder => 'integration'} - ] - - tasks.each do |t| - namespace t[:name] do - tests.each do |test| - define_task(test, t[:folder]) - end - end - end +def plugin_name(plugin) + "#{plugin} plugin" +end + +def run_tests(name, files_glob) + files = Dir.glob(files_glob) + if files.empty? + puts "I: no tests to run (#{name})" + else + sh 'testrb', '-Itest', *files + end +end - plugins = Dir.glob(File.join(Rails.root, 'plugins', '*')).map {|path| File.basename(path)} +def run_cucumber(name, profile, files_glob) + files = Dir.glob(files_glob) + if files.empty? + puts "I: no tests to run #{name}" + else + sh 'xvfb-run', 'ruby', '-S', 'cucumber', '--profile', profile, '--format', ENV['CUCUMBER_FORMAT'] || 'progress' , *features + end +end - plugins.each do |plugin_name| - namespace plugin_name do - tests.each do |test| - define_task(test, 'plugins', plugin_name) - end - end +def plugin_test_task(name, plugin, files_glob) + desc "Run #{name} tests for #{plugin_name(plugin)}" + task name => 'db:test:plugins:prepare' do |t| + run_tests t.name, files_glob + end +end + +def plugin_cucumber_task(plugin, files_glob) + task :cucumber => 'db:test:plugins:prepare' do |t| + run_cucumber t.name, :default, files_blog + end +end - dependencies = [] - tests.each do |test| - dependencies << plugin_name+':'+test[:name] +def plugin_selenium_task(plugin, files_glob) + task :selenium => 'db:test:plugins:prepare' do |t| + run_cucumber t.name, :selenium, files_glob + end +end + +def test_sequence_task(name, plugin, *tasks) + desc "Run all tests for #{plugin_name(plugin)}" + task name do + failed = [] + tasks.each do |task| + begin + Rake::Task['test:noosfero_plugins:' + task.to_s].invoke + rescue Exception => ex + puts ex + failed << task end - task plugin_name => dependencies end - - task :temp_enable_plugins do - system('./script/noosfero-plugins enableall') + unless failed.empty? + fail 'Tests failed: ' + failed.join(', ') end + end +end - task :rollback_temp_enable_plugins do - @disabled_plugins.each { |plugin| system('./script/noosfero-plugins disable ' + plugin)} +namespace :test do + namespace :noosfero_plugins do + all_plugins.each do |plugin| + namespace plugin do + plugin_test_task :units, plugin, "plugins/#{plugin}/test/unit/**/*.rb" + plugin_test_task :functionals, plugin, "plugins/#{plugin}/test/functional/**/*.rb" + plugin_test_task :integration, plugin, "plugins/#{plugin}/test/integration/**/*.rb" + plugin_cucumber_task plugin, "plugins/#{plugin}/features/**/*.feature" + plugin_selenium_task plugin, "plugins/#{plugin}/features/**/*.feature" + end + + test_sequence_task(plugin, plugin, "#{plugin}:units", "#{plugin}:functionals", "#{plugin}:integration", "#{plugin}:cucumber", "#{plugin}:selenium") # FIXME missing cucumber and selenium end - task :units => 'available:units' - task :functionals => 'available:functionals' - task :integration => 'available:integration' - task :available do - Rake::Task['test:noosfero_plugins:temp_enable_plugins'].invoke - begin - Rake::Task['test:noosfero_plugins:units'].invoke - Rake::Task['test:noosfero_plugins:functionals'].invoke - Rake::Task['test:noosfero_plugins:integration'].invoke - rescue + { :units => :unit , :functionals => :functional , :integration => :integration }.each do |taskname,folder| + task taskname => 'db:test:plugins:prepare' do + run_tests taskname, "plugins/{#{enabled_plugins.join(',')}}/test/#{folder}/**/*.rb" end - Rake::Task['test:noosfero_plugins:rollback_temp_enable_plugins'].invoke end - task :enabled => ['enabled:units', 'enabled:functionals', 'enabled:integration'] + task :cucumber => 'db:test:plugins:prepare' do |t| + run_cucumber t.name, :default, "plugins/{#{enabled_plugins.join(',')}}/features/**/*.features" + end - namespace :cucumber do - task :enabled do - features = Dir.glob('config/plugins/*/features/*.feature') - if features.empty? - puts "No acceptance tests for enabled plugins, skipping" - else - ruby '-S', 'cucumber', '--format', ENV['CUCUMBER_FORMAT'] || 'progress' , *features - end - end + task :selenium => 'db:test:plugins:prepare' do |t| + run_cucumber t.name, :selenium, "plugins/{#{enabled_plugins.join(',')}}/features/**/*.features" end - namespace :selenium do - task :enabled do - features = Dir.glob('config/plugins/*/features/*.feature') - if features.empty? - puts "No acceptance tests for enabled plugins, skipping" - else - sh 'xvfb-run', 'ruby', '-S', 'cucumber', '--profile', 'selenium', '--format', ENV['CUCUMBER_FORMAT'] || 'progress' , *features - end - end + task :temp_enable_all_plugins do + sh './script/noosfero-plugins', 'enableall' end + task :rollback_enable_all_plugins do + sh './script/noosfero-plugins', 'disable', *disabled_plugins + end end - task :noosfero_plugins => %w[ noosfero_plugins:available noosfero_plugins:cucumber:enabled noosfero_plugins:selenium:enabled ] + test_sequence_task(:noosfero_plugins, '*', :temp_enable_all_plugins, :units, :functionals, :integration, :cucumber, :selenium, :rollback_enable_all_plugins) end - -- libgit2 0.21.2