diff options
author | yuuji.yaginuma <yuuji.yaginuma@gmail.com> | 2017-07-09 10:13:11 +0900 |
---|---|---|
committer | yuuji.yaginuma <yuuji.yaginuma@gmail.com> | 2017-07-09 13:18:56 +0900 |
commit | e12715bfd55831a84e9398280fb294d9136ede2e (patch) | |
tree | e268d9b721d436291a5b7278368a60ddb1cb1cee /railties/test | |
parent | 650ea5e5cf50d8a7242499463cf1762922d330a8 (diff) | |
download | rails-e12715bfd55831a84e9398280fb294d9136ede2e.tar.gz rails-e12715bfd55831a84e9398280fb294d9136ede2e.tar.bz2 rails-e12715bfd55831a84e9398280fb294d9136ede2e.zip |
Load environment file in `dbconsole` command
Currently the environment file is not loaded in `dbconsole` command.
Therefore, for example, if use encrypted secrets values in database.yml,
`read_encrypted_secrets` will not be true, so the value can not be
used correctly.
Fixes #29717
Diffstat (limited to 'railties/test')
-rw-r--r-- | railties/test/application/dbconsole_test.rb | 66 |
1 files changed, 66 insertions, 0 deletions
diff --git a/railties/test/application/dbconsole_test.rb b/railties/test/application/dbconsole_test.rb new file mode 100644 index 0000000000..7e5e9ea8aa --- /dev/null +++ b/railties/test/application/dbconsole_test.rb @@ -0,0 +1,66 @@ +require "isolation/abstract_unit" +begin + require "pty" +rescue LoadError +end + +module ApplicationTests + class DBConsoleTest < ActiveSupport::TestCase + include ActiveSupport::Testing::Isolation + + def setup + build_app + end + + def teardown + teardown_app + end + + def test_use_value_defined_in_environment_file_in_database_yml + skip "PTY unavailable" unless available_pty? + Dir.chdir(app_path) do + app_file "config/database.yml", <<-YAML + development: + database: <%= Rails.application.config.database %> + adapter: sqlite3 + pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %> + timeout: 5000 + YAML + + app_file "config/environments/development.rb", <<-RUBY + Rails.application.configure do + config.database = "db/development.sqlite3" + end + RUBY + end + + master, slave = PTY.open + spawn_dbconsole(slave) + assert_output("sqlite>", master) + ensure + master.puts ".exit" + end + + private + def spawn_dbconsole(fd) + Process.spawn("#{app_path}/bin/rails dbconsole", in: fd, out: fd, err: fd) + end + + def assert_output(expected, io, timeout = 5) + timeout = Time.now + timeout + + output = "" + until output.include?(expected) || Time.now > timeout + if IO.select([io], [], [], 0.1) + output << io.read(1) + end + end + + assert_includes output, expected, "#{expected.inspect} expected, but got:\n\n#{output}" + end + + def available_pty? + defined?(PTY) && PTY.respond_to?(:open) + end + end +end |