plugins_tests.rake 3.56 KB
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 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, '--format', ENV['CUCUMBER_FORMAT'] || 'progress' , *features
  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

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

    { :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
    end

    task :cucumber => 'db:test:plugins:prepare' do |t|
      run_cucumber t.name, :default, "plugins/{#{enabled_plugins.join(',')}}/features/**/*.features"
    end

    task :selenium => 'db:test:plugins:prepare' do |t|
      run_cucumber t.name, :selenium, "plugins/{#{enabled_plugins.join(',')}}/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