features/step_definitions/rails_steps.rb in katapult-0.2.0 vs features/step_definitions/rails_steps.rb in katapult-0.3.0

- old
+ new

@@ -1,46 +1,106 @@ require 'katapult/binary_util' -module KatapultRailsHelper +module RailsHelper + # Directory names + TEST_APP = 'katapult_test_app' + APP_WITH_BASICS = 'cached_test_app_with_basics' + PRISTINE_APP = 'cached_pristine_test_app' + def with_aruba_timeout(timeout, &block) original_aruba_timeout = aruba.config.exit_timeout aruba.config.exit_timeout = timeout.to_i # print "(timeout: #{ timeout })" block.call ensure aruba.config.exit_timeout = original_aruba_timeout end - def create_cached_app(name) - job = 'Cached Rails app generation' - - puts "#{job} started (in #{Dir.pwd})" + def create_app(name) Katapult::BinaryUtil.create_rails_app(name) - puts "#{job} done." + puts 'Done generating rails app.' end + def test_app_path + File.join expand_path('.'), TEST_APP + end + def ensure_bundled(path) Dir.chdir(path) do Bundler.with_clean_env do system('bundle check > /dev/null 2>&1') or system('bundle install') end end end + def recreate_databases(path) + Dir.chdir(path) do + # Katapult doesn't run test app tests in parallel + Katapult::BinaryUtil.run 'bundle exec rake db:drop db:create > /dev/null' + end + end + end -World(KatapultRailsHelper) +World(RailsHelper) +# In these steps, cached Rails apps are created to speed up test runs. +# +# Note: The current Ruby process and Aruba have *different* opinions about the +# current working directory: +# - Ruby knows the "real" Dir.pwd +# - Aruba is scoped to its test directory "tmp/aruba" Given /^a pristine Rails application$/ do - with_aruba_timeout(120) do - Dir.chdir('tmp') do - create_cached_app('cached_test_app') unless File.directory?('cached_test_app') - ensure_bundled('cached_test_app') + unless @no_clobber + with_aruba_timeout(80) do + # Change Ruby cwd + Dir.chdir('tmp') do + if File.directory?(RailsHelper::PRISTINE_APP) + puts "Using a cached Rails app from tmp/#{RailsHelper::PRISTINE_APP}" + else + create_app(RailsHelper::PRISTINE_APP) + end + + ensure_bundled(RailsHelper::PRISTINE_APP) + FileUtils.cp_r RailsHelper::PRISTINE_APP, test_app_path + end end + end - # copy cached app to aruba directory - FileUtils.cp_r 'tmp/cached_test_app', File.join(expand_path('.'), 'katapult_test_app') - cd 'katapult_test_app' # Aruba::Api method + cd RailsHelper::TEST_APP # Change Aruba cwd +end + +Given 'a new Rails application with Katapult basics installed' do + unless @no_clobber + with_aruba_timeout(120) do + # Change Ruby cwd + Dir.chdir('tmp') do + if File.directory?(RailsHelper::APP_WITH_BASICS) + puts <<-NOTE + Using a cached Rails app with basics installed. Remember to + rm -rf tmp/#{RailsHelper::APP_WITH_BASICS} + when modifying the basics generator. + NOTE + else + create_app(RailsHelper::APP_WITH_BASICS) + + Dir.chdir(RailsHelper::APP_WITH_BASICS) do + # :path will be correct when copied to the TEST_APP path + Katapult::BinaryUtil.run %(echo "gem 'katapult', path: '../../..'" >> Gemfile) + Katapult::BinaryUtil.run 'bin/rails generate katapult:basics --db-user katapult --db-password secret' + # Spring running in the cache dir is of no further use, but would + # break things when the cache dir is removed + Katapult::BinaryUtil.run 'spring stop' + end + end + + ensure_bundled(RailsHelper::APP_WITH_BASICS) + recreate_databases(RailsHelper::APP_WITH_BASICS) + FileUtils.cp_r RailsHelper::APP_WITH_BASICS, test_app_path + end + end end + + cd RailsHelper::TEST_APP # Change Aruba cwd end