if ENV['BUNDLE_GEMFILE'] STDERR.puts <<-HERE ======================================================================== ERROR: Cannot test 'paper_trail_manager' because Bundler is loaded! Do not use 'bundle exec rake' or otherwise load Bundler into the Rake environment. This test suite runs across multiple versions of Rails and needs to be able to setup individual environments for each of these, and it can't do this if Bundler is already loaded. ======================================================================== HERE raise end def run(cmd) puts "* running: #{cmd}" system cmd raise "ERROR running command" unless $? == 0 end def setup_rails_app dir dir =~ /rails-([^-]+)/ version = $1 run "./generate_test_directory #{version}" bundler_cache = File.expand_path("bundler_cache") Dir.chdir dir do File.open("Gemfile", "w") do |gemfile| gemfile.write <<-GEM source :gemcutter gem "rails", "=#{version}" gem "sqlite3-ruby", :require => "sqlite3" gem "rake" gem "will_paginate", "~> 3.0.pre2" gem "paper_trail_manager", :path => "#{File.expand_path(File.join(File.dirname(__FILE__), '..', '..', '..'))}" gem 'factory_girl_rails', '~> 1.7.0' gem 'rspec-rails', '~> 2.11.0' GEM end run "bundle install --path=#{bundler_cache}" end end def test_rails_app dir @results ||= {} Dir.chdir(dir) do ENV['RAILS_ENV'] = "test" FileUtils.mkdir_p "log" begin run "touch db/test.sqlite3" # db:create doesn't exist before rails 2.0 run "bundle exec rake db:migrate --trace" # run "bundle exec rspec --backtrace spec" run "bundle exec rake" rescue Object @results[dir] = "FAIL" else @results[dir] = "SUCCESS" end end end def print_results puts "----- RESULTS -----" @results.keys.sort.each do |key| puts "* #{key}: #{@results[key]}" end end Dir["#{File.dirname(__FILE__)}/rails-*"].sort.each do |fqdir| dir = File.basename fqdir desc "test #{dir}" task "test:#{dir}" do Dir.chdir(File.dirname(__FILE__)) do setup_rails_app dir test_rails_app dir end end end namespace :test do desc "run tests across various versions of Rails" task :rails do Dir["#{File.dirname(__FILE__)}/rails-*"].sort.reverse.each do |fqdir| dir = File.basename fqdir Rake::Task["test:#{dir}"].invoke end print_results end end