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