aboutsummaryrefslogtreecommitdiffstats
path: root/railties/test
diff options
context:
space:
mode:
authoryuuji.yaginuma <yuuji.yaginuma@gmail.com>2017-07-09 10:13:11 +0900
committeryuuji.yaginuma <yuuji.yaginuma@gmail.com>2017-07-09 13:18:56 +0900
commite12715bfd55831a84e9398280fb294d9136ede2e (patch)
treee268d9b721d436291a5b7278368a60ddb1cb1cee /railties/test
parent650ea5e5cf50d8a7242499463cf1762922d330a8 (diff)
downloadrails-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.rb66
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