mirror of
https://github.com/thoughtbot/shoulda-matchers.git
synced 2022-11-09 12:01:38 -05:00
72f60fae94
When running tests, you can now switch between running them against a SQLite or PostgreSQL database. This is accomplished by modifying the unit and acceptance tests so that when they generate and load the test Rails application, database.yml is replaced with content that will configure the database appropriately.
126 lines
2.6 KiB
Ruby
126 lines
2.6 KiB
Ruby
require_relative '../tests/bundle'
|
|
require_relative '../tests/command_runner'
|
|
require_relative '../tests/database'
|
|
require_relative '../tests/filesystem'
|
|
|
|
require 'yaml'
|
|
|
|
module UnitTests
|
|
class RailsApplication
|
|
def initialize
|
|
@fs = Tests::Filesystem.new
|
|
@bundle = Tests::Bundle.new
|
|
@database = Tests::Database.instance
|
|
end
|
|
|
|
def create
|
|
fs.clean
|
|
generate
|
|
|
|
fs.within_project do
|
|
install_gems
|
|
remove_unwanted_gems
|
|
end
|
|
end
|
|
|
|
def load
|
|
load_environment
|
|
run_migrations
|
|
end
|
|
|
|
def gemfile_path
|
|
fs.find('Gemfile')
|
|
end
|
|
|
|
def environment_file_path
|
|
fs.find_in_project('config/environment')
|
|
end
|
|
|
|
def temp_views_directory
|
|
fs.find_in_project('tmp/views')
|
|
end
|
|
|
|
def create_temp_view(path, contents)
|
|
full_path = temp_view_path_for(path)
|
|
full_path.dirname.mkpath
|
|
full_path.open('w') { |f| f.write(contents) }
|
|
end
|
|
|
|
def delete_temp_views
|
|
if temp_views_directory.exist?
|
|
temp_views_directory.rmtree
|
|
end
|
|
end
|
|
|
|
def draw_routes(&block)
|
|
Rails.application.routes.draw(&block)
|
|
Rails.application.routes
|
|
end
|
|
|
|
protected
|
|
|
|
attr_reader :fs, :shell, :bundle, :database
|
|
|
|
private
|
|
|
|
def migrations_directory
|
|
fs.find_in_project('db/migrate')
|
|
end
|
|
|
|
def temp_view_path_for(path)
|
|
temp_views_directory.join(path)
|
|
end
|
|
|
|
def generate
|
|
rails_new
|
|
fix_available_locales_warning
|
|
write_database_configuration
|
|
end
|
|
|
|
def rails_new
|
|
run_command! %W(rails new #{fs.project_directory} --skip-bundle)
|
|
end
|
|
|
|
def fix_available_locales_warning
|
|
# See here for more on this:
|
|
# http://stackoverflow.com/questions/20361428/rails-i18n-validation-deprecation-warning
|
|
fs.transform('config/application.rb') do |lines|
|
|
lines.insert(-3, <<-EOT)
|
|
if I18n.respond_to?(:enforce_available_locales=)
|
|
I18n.enforce_available_locales = false
|
|
end
|
|
EOT
|
|
end
|
|
end
|
|
|
|
def write_database_configuration
|
|
YAML.dump(database.config.to_hash, fs.open('config/database.yml', 'w'))
|
|
end
|
|
|
|
def load_environment
|
|
require environment_file_path
|
|
end
|
|
|
|
def run_migrations
|
|
fs.within_project do
|
|
run_command! 'bundle exec rake db:drop db:create db:migrate'
|
|
end
|
|
end
|
|
|
|
def install_gems
|
|
bundle.install_gems
|
|
end
|
|
|
|
def remove_unwanted_gems
|
|
bundle.updating do
|
|
bundle.remove_gem 'debugger'
|
|
bundle.remove_gem 'byebug'
|
|
bundle.remove_gem 'web-console'
|
|
end
|
|
end
|
|
|
|
def run_command!(*args)
|
|
Tests::CommandRunner.run!(*args)
|
|
end
|
|
end
|
|
end
|