aboutsummaryrefslogtreecommitdiffstats
path: root/railties
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
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')
-rw-r--r--railties/CHANGELOG.md6
-rw-r--r--railties/lib/rails/commands/dbconsole/dbconsole_command.rb1
-rw-r--r--railties/test/application/dbconsole_test.rb66
3 files changed, 73 insertions, 0 deletions
diff --git a/railties/CHANGELOG.md b/railties/CHANGELOG.md
index e837a07623..d793405da1 100644
--- a/railties/CHANGELOG.md
+++ b/railties/CHANGELOG.md
@@ -1,3 +1,9 @@
+* Load environment file in `dbconsole` command.
+
+ Fixes #29717
+
+ *Yuji Yaginuma*
+
* Add `rails secrets:show` command.
*Yuji Yaginuma*
diff --git a/railties/lib/rails/commands/dbconsole/dbconsole_command.rb b/railties/lib/rails/commands/dbconsole/dbconsole_command.rb
index 5db588b66a..b3df5191c6 100644
--- a/railties/lib/rails/commands/dbconsole/dbconsole_command.rb
+++ b/railties/lib/rails/commands/dbconsole/dbconsole_command.rb
@@ -148,6 +148,7 @@ module Rails
def perform
extract_environment_option_from_argument
+ require_application_and_environment!
Rails::DBConsole.start(options)
end
end
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