Commit 2ec5f07eb9056914cd563696aaf30c6a08e082a2

Authored by Antonio Terceiro
1 parent b8cc4fc1

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 end 4 end
  5 +disabled_plugins = all_plugins - enabled_plugins
13 6
14 task 'db:test:plugins:prepare' do 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 end 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 end 67 end
52 - task plugin_name => dependencies  
53 end 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 end 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 end 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 end 92 end
74 - Rake::Task['test:noosfero_plugins:rollback_temp_enable_plugins'].invoke  
75 end 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 end 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 end 105 end
100 106
  107 + task :rollback_enable_all_plugins do
  108 + sh './script/noosfero-plugins', 'disable', *disabled_plugins
  109 + end
101 end 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 end 114 end
106 -