Skip to content

Commit

Permalink
Allow 3-level DB configs to group connections by environment
Browse files Browse the repository at this point in the history
[Arthur Nogueira Neves & Matthew Draper]
  • Loading branch information
matthewd committed Feb 21, 2017
1 parent 5716c4d commit 0a4f600
Show file tree
Hide file tree
Showing 2 changed files with 69 additions and 0 deletions.
Expand Up @@ -149,9 +149,18 @@ def resolve(config)
# Expands each key in @configurations hash into fully resolved hash
def resolve_all
config = configurations.dup

if env = ActiveRecord::ConnectionHandling::DEFAULT_ENV.call
env_config = config[env] if config[env].is_a?(Hash) && !(config[env].key?("adapter") || config[env].key?("url"))
end

config.reject! { |k, v| v.is_a?(Hash) && !(v.key?("adapter") || v.key?("url")) }
config.merge! env_config if env_config

config.each do |key, value|
config[key] = resolve(value) if value
end

config
end

Expand Down
Expand Up @@ -20,6 +20,66 @@ def test_establish_connection_uses_spec_name
@handler.remove_connection("readonly")
end

def test_establish_connection_using_3_levels_config
previous_env, ENV["RAILS_ENV"] = ENV["RAILS_ENV"], "default_env"

config = {
"default_env" => {
"readonly" => { "adapter" => "sqlite3", "database" => "db/readonly.sqlite3" },
"primary" => { "adapter" => "sqlite3", "database" => "db/primary.sqlite3" }
},
"another_env" => {
"readonly" => { "adapter" => "sqlite3", "database" => "db/bad-readonly.sqlite3" },
"primary" => { "adapter" => "sqlite3", "database" => "db/bad-primary.sqlite3" }
},
"common" => { "adapter" => "sqlite3", "database" => "db/common.sqlite3" }
}
@prev_configs, ActiveRecord::Base.configurations = ActiveRecord::Base.configurations, config

@handler.establish_connection(:common)
@handler.establish_connection(:primary)
@handler.establish_connection(:readonly)

assert_not_nil pool = @handler.retrieve_connection_pool("readonly")
assert_equal "db/readonly.sqlite3", pool.spec.config[:database]

assert_not_nil pool = @handler.retrieve_connection_pool("primary")
assert_equal "db/primary.sqlite3", pool.spec.config[:database]

assert_not_nil pool = @handler.retrieve_connection_pool("common")
assert_equal "db/common.sqlite3", pool.spec.config[:database]
ensure
ActiveRecord::Base.configurations = @prev_configs
ENV["RAILS_ENV"] = previous_env
end

def test_establish_connection_using_two_level_configurations
config = { "development" => { "adapter" => "sqlite3", "database" => "db/primary.sqlite3" } }
@prev_configs, ActiveRecord::Base.configurations = ActiveRecord::Base.configurations, config

@handler.establish_connection(:development)

assert_not_nil pool = @handler.retrieve_connection_pool("development")
assert_equal "db/primary.sqlite3", pool.spec.config[:database]
ensure
ActiveRecord::Base.configurations = @prev_configs
end

def test_establish_connection_using_top_level_key_in_two_level_config
config = {
"development" => { "adapter" => "sqlite3", "database" => "db/primary.sqlite3" },
"development_readonly" => { "adapter" => "sqlite3", "database" => "db/readonly.sqlite3" }
}
@prev_configs, ActiveRecord::Base.configurations = ActiveRecord::Base.configurations, config

@handler.establish_connection(:development_readonly)

assert_not_nil pool = @handler.retrieve_connection_pool("development_readonly")
assert_equal "db/readonly.sqlite3", pool.spec.config[:database]
ensure
ActiveRecord::Base.configurations = @prev_configs
end

def test_retrieve_connection
assert @handler.retrieve_connection(@spec_name)
end
Expand Down

0 comments on commit 0a4f600

Please sign in to comment.