Commit 2ec5f07eb9056914cd563696aaf30c6a08e082a2
1 parent
b8cc4fc1
Exists in
master
and in
29 other branches
Refactor plugin tests tasks
Showing
1 changed file
with
88 additions
and
80 deletions
Show diff stats
lib/tasks/plugins_tests.rake
| 1 | -@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)} | |
| 2 | -@disabled_plugins.delete('template') | |
| 3 | - | |
| 4 | -def define_task(test, plugins_folder='plugins', plugin = '*') | |
| 5 | - test_files = Dir.glob(File.join(Rails.root, plugins_folder, plugin, 'test', test[:folder], '**', '*_test.rb')) | |
| 6 | - desc 'Runs ' + (plugin != '*' ? plugin : 'plugins') + ' ' + test[:name] + ' tests' | |
| 7 | - Rake::TestTask.new(test[:name].to_sym => 'db:test:plugins:prepare') do |t| | |
| 8 | - t.libs << 'test' | |
| 9 | - t.test_files = test_files | |
| 10 | - t.verbose = true | |
| 11 | - end | |
| 1 | +all_plugins = Dir.glob('plugins/*').map { |f| File.basename(f) } - ['template'] | |
| 2 | +def enabled_plugins | |
| 3 | + Dir.glob('config/plugins/*').map { |f| File.basename(f) } - ['README'] | |
| 12 | 4 | end |
| 5 | +disabled_plugins = all_plugins - enabled_plugins | |
| 13 | 6 | |
| 14 | 7 | task 'db:test:plugins:prepare' do |
| 15 | - Rake::Task['db:test:prepare'].invoke | |
| 16 | - sh 'rake db:migrate RAILS_ENV=test SCHEMA=/dev/null' | |
| 8 | + if Dir.glob('config/plugins/*/db/migrate/*.rb').empty? | |
| 9 | + puts "I: skipping database setup, enabled plugins have no migrations" | |
| 10 | + else | |
| 11 | + Rake::Task['db:test:prepare'].invoke | |
| 12 | + sh 'rake db:migrate RAILS_ENV=test SCHEMA=/dev/null' | |
| 13 | + end | |
| 17 | 14 | end |
| 18 | 15 | |
| 19 | -namespace :test do | |
| 20 | - namespace :noosfero_plugins do | |
| 21 | - tasks = [ | |
| 22 | - {:name => :available, :folder => 'plugins'}, | |
| 23 | - {:name => :enabled, :folder => File.join('config', 'plugins')} | |
| 24 | - ] | |
| 25 | - tests = [ | |
| 26 | - {:name => 'units', :folder => 'unit'}, | |
| 27 | - {:name => 'functionals', :folder => 'functional'}, | |
| 28 | - {:name => 'integration', :folder => 'integration'} | |
| 29 | - ] | |
| 30 | - | |
| 31 | - tasks.each do |t| | |
| 32 | - namespace t[:name] do | |
| 33 | - tests.each do |test| | |
| 34 | - define_task(test, t[:folder]) | |
| 35 | - end | |
| 36 | - end | |
| 37 | - end | |
| 16 | +def plugin_name(plugin) | |
| 17 | + "#{plugin} plugin" | |
| 18 | +end | |
| 19 | + | |
| 20 | +def run_tests(name, files_glob) | |
| 21 | + files = Dir.glob(files_glob) | |
| 22 | + if files.empty? | |
| 23 | + puts "I: no tests to run (#{name})" | |
| 24 | + else | |
| 25 | + sh 'testrb', '-Itest', *files | |
| 26 | + end | |
| 27 | +end | |
| 38 | 28 | |
| 39 | - plugins = Dir.glob(File.join(Rails.root, 'plugins', '*')).map {|path| File.basename(path)} | |
| 29 | +def run_cucumber(name, profile, files_glob) | |
| 30 | + files = Dir.glob(files_glob) | |
| 31 | + if files.empty? | |
| 32 | + puts "I: no tests to run #{name}" | |
| 33 | + else | |
| 34 | + sh 'xvfb-run', 'ruby', '-S', 'cucumber', '--profile', profile, '--format', ENV['CUCUMBER_FORMAT'] || 'progress' , *features | |
| 35 | + end | |
| 36 | +end | |
| 40 | 37 | |
| 41 | - plugins.each do |plugin_name| | |
| 42 | - namespace plugin_name do | |
| 43 | - tests.each do |test| | |
| 44 | - define_task(test, 'plugins', plugin_name) | |
| 45 | - end | |
| 46 | - end | |
| 38 | +def plugin_test_task(name, plugin, files_glob) | |
| 39 | + desc "Run #{name} tests for #{plugin_name(plugin)}" | |
| 40 | + task name => 'db:test:plugins:prepare' do |t| | |
| 41 | + run_tests t.name, files_glob | |
| 42 | + end | |
| 43 | +end | |
| 44 | + | |
| 45 | +def plugin_cucumber_task(plugin, files_glob) | |
| 46 | + task :cucumber => 'db:test:plugins:prepare' do |t| | |
| 47 | + run_cucumber t.name, :default, files_blog | |
| 48 | + end | |
| 49 | +end | |
| 47 | 50 | |
| 48 | - dependencies = [] | |
| 49 | - tests.each do |test| | |
| 50 | - dependencies << plugin_name+':'+test[:name] | |
| 51 | +def plugin_selenium_task(plugin, files_glob) | |
| 52 | + task :selenium => 'db:test:plugins:prepare' do |t| | |
| 53 | + run_cucumber t.name, :selenium, files_glob | |
| 54 | + end | |
| 55 | +end | |
| 56 | + | |
| 57 | +def test_sequence_task(name, plugin, *tasks) | |
| 58 | + desc "Run all tests for #{plugin_name(plugin)}" | |
| 59 | + task name do | |
| 60 | + failed = [] | |
| 61 | + tasks.each do |task| | |
| 62 | + begin | |
| 63 | + Rake::Task['test:noosfero_plugins:' + task.to_s].invoke | |
| 64 | + rescue Exception => ex | |
| 65 | + puts ex | |
| 66 | + failed << task | |
| 51 | 67 | end |
| 52 | - task plugin_name => dependencies | |
| 53 | 68 | end |
| 54 | - | |
| 55 | - task :temp_enable_plugins do | |
| 56 | - system('./script/noosfero-plugins enableall') | |
| 69 | + unless failed.empty? | |
| 70 | + fail 'Tests failed: ' + failed.join(', ') | |
| 57 | 71 | end |
| 72 | + end | |
| 73 | +end | |
| 58 | 74 | |
| 59 | - task :rollback_temp_enable_plugins do | |
| 60 | - @disabled_plugins.each { |plugin| system('./script/noosfero-plugins disable ' + plugin)} | |
| 75 | +namespace :test do | |
| 76 | + namespace :noosfero_plugins do | |
| 77 | + all_plugins.each do |plugin| | |
| 78 | + namespace plugin do | |
| 79 | + plugin_test_task :units, plugin, "plugins/#{plugin}/test/unit/**/*.rb" | |
| 80 | + plugin_test_task :functionals, plugin, "plugins/#{plugin}/test/functional/**/*.rb" | |
| 81 | + plugin_test_task :integration, plugin, "plugins/#{plugin}/test/integration/**/*.rb" | |
| 82 | + plugin_cucumber_task plugin, "plugins/#{plugin}/features/**/*.feature" | |
| 83 | + plugin_selenium_task plugin, "plugins/#{plugin}/features/**/*.feature" | |
| 84 | + end | |
| 85 | + | |
| 86 | + test_sequence_task(plugin, plugin, "#{plugin}:units", "#{plugin}:functionals", "#{plugin}:integration", "#{plugin}:cucumber", "#{plugin}:selenium") # FIXME missing cucumber and selenium | |
| 61 | 87 | end |
| 62 | 88 | |
| 63 | - task :units => 'available:units' | |
| 64 | - task :functionals => 'available:functionals' | |
| 65 | - task :integration => 'available:integration' | |
| 66 | - task :available do | |
| 67 | - Rake::Task['test:noosfero_plugins:temp_enable_plugins'].invoke | |
| 68 | - begin | |
| 69 | - Rake::Task['test:noosfero_plugins:units'].invoke | |
| 70 | - Rake::Task['test:noosfero_plugins:functionals'].invoke | |
| 71 | - Rake::Task['test:noosfero_plugins:integration'].invoke | |
| 72 | - rescue | |
| 89 | + { :units => :unit , :functionals => :functional , :integration => :integration }.each do |taskname,folder| | |
| 90 | + task taskname => 'db:test:plugins:prepare' do | |
| 91 | + run_tests taskname, "plugins/{#{enabled_plugins.join(',')}}/test/#{folder}/**/*.rb" | |
| 73 | 92 | end |
| 74 | - Rake::Task['test:noosfero_plugins:rollback_temp_enable_plugins'].invoke | |
| 75 | 93 | end |
| 76 | - task :enabled => ['enabled:units', 'enabled:functionals', 'enabled:integration'] | |
| 77 | 94 | |
| 95 | + task :cucumber => 'db:test:plugins:prepare' do |t| | |
| 96 | + run_cucumber t.name, :default, "plugins/{#{enabled_plugins.join(',')}}/features/**/*.features" | |
| 97 | + end | |
| 78 | 98 | |
| 79 | - namespace :cucumber do | |
| 80 | - task :enabled do | |
| 81 | - features = Dir.glob('config/plugins/*/features/*.feature') | |
| 82 | - if features.empty? | |
| 83 | - puts "No acceptance tests for enabled plugins, skipping" | |
| 84 | - else | |
| 85 | - ruby '-S', 'cucumber', '--format', ENV['CUCUMBER_FORMAT'] || 'progress' , *features | |
| 86 | - end | |
| 87 | - end | |
| 99 | + task :selenium => 'db:test:plugins:prepare' do |t| | |
| 100 | + run_cucumber t.name, :selenium, "plugins/{#{enabled_plugins.join(',')}}/features/**/*.features" | |
| 88 | 101 | end |
| 89 | 102 | |
| 90 | - namespace :selenium do | |
| 91 | - task :enabled do | |
| 92 | - features = Dir.glob('config/plugins/*/features/*.feature') | |
| 93 | - if features.empty? | |
| 94 | - puts "No acceptance tests for enabled plugins, skipping" | |
| 95 | - else | |
| 96 | - sh 'xvfb-run', 'ruby', '-S', 'cucumber', '--profile', 'selenium', '--format', ENV['CUCUMBER_FORMAT'] || 'progress' , *features | |
| 97 | - end | |
| 98 | - end | |
| 103 | + task :temp_enable_all_plugins do | |
| 104 | + sh './script/noosfero-plugins', 'enableall' | |
| 99 | 105 | end |
| 100 | 106 | |
| 107 | + task :rollback_enable_all_plugins do | |
| 108 | + sh './script/noosfero-plugins', 'disable', *disabled_plugins | |
| 109 | + end | |
| 101 | 110 | end |
| 102 | 111 | |
| 103 | - task :noosfero_plugins => %w[ noosfero_plugins:available noosfero_plugins:cucumber:enabled noosfero_plugins:selenium:enabled ] | |
| 112 | + test_sequence_task(:noosfero_plugins, '*', :temp_enable_all_plugins, :units, :functionals, :integration, :cucumber, :selenium, :rollback_enable_all_plugins) | |
| 104 | 113 | |
| 105 | 114 | end |
| 106 | - | ... | ... |