rails/railties/test/application/rake/dbs_test.rb
schneems ba882934bb Partial fix of database url tests
Prior to #13463 when `DATABASE_URL` was set, Rails automagically used that value instead of the database.yml. There are tests in dbs_test that expect this to still be true. After that PR, `RAILS_DATABASE_URL` is expected to be read into the YAML file via ERB, this PR fixes that behavior.

Note: this does not entirely fix the tests. It seems that `ActiveRecord::Tasks::DatabaseTasks.current_config` does not process the url string correctly (convert it into a hash), and ` ActiveRecord::Tasks::DatabaseTasks.structure_load(current_config, filename)` as well as other methods in `DatabaseTasks` expect a hash.

It seems like we should involve the resolver somewhere in this process to correctly convert the database url, I do not know the best place for that /cc @josevalim
2013-12-25 18:03:55 -05:00

175 lines
5.8 KiB
Ruby

require "isolation/abstract_unit"
module ApplicationTests
module RakeTests
class RakeDbsTest < ActiveSupport::TestCase
include ActiveSupport::Testing::Isolation
def setup
build_app
boot_rails
FileUtils.rm_rf("#{app_path}/config/environments")
end
def teardown
teardown_app
end
def database_url_db_name
File.join(app_path, "db/database_url_db.sqlite3")
end
def set_database_url
ENV['RAILS_DATABASE_URL'] = File.join("sqlite3://:@localhost", database_url_db_name)
# ensure it's using the DATABASE_URL
FileUtils.rm_rf("#{app_path}/config/database.yml")
File.open("#{app_path}/config/database.yml", 'w') do |f|
f << {ENV['RAILS_ENV'] => '<%= ENV["RAILS_DATABASE_URL"] %>'}.to_yaml
end
end
def expected
@expected ||= {}
end
def db_create_and_drop
Dir.chdir(app_path) do
output = `bundle exec rake db:create`
assert_equal output, ""
assert File.exist?(expected[:database])
assert_equal expected[:database],
ActiveRecord::Base.connection_config[:database]
output = `bundle exec rake db:drop`
assert_equal output, ""
assert !File.exist?(expected[:database])
end
end
test 'db:create and db:drop without database url' do
require "#{app_path}/config/environment"
expected[:database] = ActiveRecord::Base.configurations[Rails.env]['database']
db_create_and_drop
end
test 'db:create and db:drop with database url' do
require "#{app_path}/config/environment"
set_database_url
expected[:database] = database_url_db_name
db_create_and_drop
end
def db_migrate_and_status
Dir.chdir(app_path) do
`rails generate model book title:string;
bundle exec rake db:migrate`
output = `bundle exec rake db:migrate:status`
assert_match(%r{database:\s+\S*#{Regexp.escape(expected[:database])}}, output)
assert_match(/up\s+\d{14}\s+Create books/, output)
end
end
test 'db:migrate and db:migrate:status without database_url' do
require "#{app_path}/config/environment"
expected[:database] = ActiveRecord::Base.configurations[Rails.env]['database']
db_migrate_and_status
end
test 'db:migrate and db:migrate:status with database_url' do
require "#{app_path}/config/environment"
set_database_url
expected[:database] = database_url_db_name
db_migrate_and_status
end
def db_schema_dump
Dir.chdir(app_path) do
`rails generate model book title:string;
rake db:migrate db:schema:dump`
schema_dump = File.read("db/schema.rb")
assert_match(/create_table \"books\"/, schema_dump)
end
end
test 'db:schema:dump without database_url' do
db_schema_dump
end
test 'db:schema:dump with database_url' do
set_database_url
db_schema_dump
end
def db_fixtures_load
Dir.chdir(app_path) do
`rails generate model book title:string;
bundle exec rake db:migrate db:fixtures:load`
assert_match(/#{expected[:database]}/,
ActiveRecord::Base.connection_config[:database])
require "#{app_path}/app/models/book"
assert_equal 2, Book.count
end
end
test 'db:fixtures:load without database_url' do
require "#{app_path}/config/environment"
expected[:database] = ActiveRecord::Base.configurations[Rails.env]['database']
db_fixtures_load
end
test 'db:fixtures:load with database_url' do
require "#{app_path}/config/environment"
set_database_url
expected[:database] = database_url_db_name
db_fixtures_load
end
def db_structure_dump_and_load
Dir.chdir(app_path) do
`rails generate model book title:string;
bundle exec rake db:migrate db:structure:dump`
structure_dump = File.read("db/structure.sql")
assert_match(/CREATE TABLE \"books\"/, structure_dump)
`bundle exec rake db:drop db:structure:load`
assert_match(/#{expected[:database]}/,
ActiveRecord::Base.connection_config[:database])
require "#{app_path}/app/models/book"
#if structure is not loaded correctly, exception would be raised
assert Book.count, 0
end
end
test 'db:structure:dump and db:structure:load without database_url' do
require "#{app_path}/config/environment"
expected[:database] = ActiveRecord::Base.configurations[Rails.env]['database']
db_structure_dump_and_load
end
test 'db:structure:dump and db:structure:load with database_url' do
require "#{app_path}/config/environment"
set_database_url
expected[:database] = database_url_db_name
db_structure_dump_and_load
end
def db_test_load_structure
Dir.chdir(app_path) do
`rails generate model book title:string;
bundle exec rake db:migrate db:structure:dump db:test:load_structure`
ActiveRecord::Base.configurations = Rails.application.config.database_configuration
ActiveRecord::Base.establish_connection :test
require "#{app_path}/app/models/book"
#if structure is not loaded correctly, exception would be raised
assert Book.count, 0
assert_match(/#{ActiveRecord::Base.configurations['test']['database']}/,
ActiveRecord::Base.connection_config[:database])
end
end
test 'db:test:load_structure without database_url' do
require "#{app_path}/config/environment"
db_test_load_structure
end
end
end
end