plugins_tests.rake
4.13 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
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
  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
def plugin_name(plugin)
  "#{plugin} plugin"
end
def plugin_enabled?(plugin)
  File.exist?(File.join('config', 'plugins', plugin))
end
def plugin_disabled_warning(plugin)
  puts "E: you should enable #{plugin} plugin before running it's tests!"
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
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.to_s, '--format', ENV['CUCUMBER_FORMAT'] || 'progress' , *files
  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|
    if plugin_enabled?(plugin)
      run_tests t.name, files_glob
    else
      plugin_disabled_warning(plugin)
    end
  end
end
def plugin_cucumber_task(name, plugin, files_glob)
  desc "Run #{name} tests for #{plugin_name(plugin)}"
  task name => 'db:test:plugins:prepare' do |t|
    if plugin_enabled?(plugin)
      run_cucumber t.name, plugin, files_glob
    else
      plugin_disabled_warning(plugin)
    end
  end
end
def plugin_selenium_task(name, plugin, files_glob)
  desc "Run #{name} tests for #{plugin_name(plugin)}"
  task name => 'db:test:plugins:prepare' do |t|
    if plugin_enabled?(plugin)
      run_cucumber t.name, "#{plugin}_selenium", files_glob
    else
      plugin_disabled_warning(plugin)
    end
  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
    end
    unless failed.empty?
      fail 'Tests failed: ' + failed.join(', ')
    end
  end
end
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 :cucumber, plugin, "plugins/#{plugin}/features/**/*.feature"
        plugin_selenium_task :selenium, plugin, "plugins/#{plugin}/features/**/*.feature"
      end
      test_sequence_task(plugin, plugin, "#{plugin}:units", "#{plugin}:functionals", "#{plugin}:integration", "#{plugin}:cucumber", "#{plugin}:selenium")
    end
    { :units => :unit , :functionals => :functional , :integration => :integration }.each do |taskname,folder|
      task taskname => 'db:test:plugins:prepare' do |t|
        run_tests t.name, "plugins/{#{enabled_plugins.join(',')}}/test/#{folder}/**/*.rb"
      end
    end
    task :cucumber => 'db:test:plugins:prepare' do |t|
      run_cucumber t.name, :default, "plugins/{#{enabled_plugins.join(',')}}/test/features/**/*.features"
    end
    task :selenium => 'db:test:plugins:prepare' do |t|
      run_cucumber t.name, :selenium, "plugins/{#{enabled_plugins.join(',')}}/test/features/**/*.features"
    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
  test_sequence_task(:noosfero_plugins, '*', :temp_enable_all_plugins, :units, :functionals, :integration, :cucumber, :selenium, :rollback_enable_all_plugins)
end