2017-06-22 22:59:18 -04:00
|
|
|
# frozen_string_literal: true
|
2016-08-06 13:16:09 -04:00
|
|
|
require "abstract_unit"
|
|
|
|
require "minitest/mock"
|
2016-09-18 13:17:12 -04:00
|
|
|
require "rails/command"
|
|
|
|
require "rails/commands/dbconsole/dbconsole_command"
|
2012-04-27 03:28:53 -04:00
|
|
|
|
|
|
|
class Rails::DBConsoleTest < ActiveSupport::TestCase
|
2013-12-15 01:07:34 -05:00
|
|
|
def setup
|
2016-08-06 13:16:09 -04:00
|
|
|
Rails::DBConsole.const_set("APP_PATH", "rails/all")
|
2013-12-15 01:07:34 -05:00
|
|
|
end
|
2012-05-04 10:40:32 -04:00
|
|
|
|
2013-12-15 01:07:34 -05:00
|
|
|
def teardown
|
2016-08-06 13:16:09 -04:00
|
|
|
Rails::DBConsole.send(:remove_const, "APP_PATH")
|
2016-08-16 03:30:11 -04:00
|
|
|
%w[PGUSER PGHOST PGPORT PGPASSWORD DATABASE_URL].each { |key| ENV.delete(key) }
|
2013-12-15 01:07:34 -05:00
|
|
|
end
|
|
|
|
|
|
|
|
def test_config_with_db_config_only
|
|
|
|
config_sample = {
|
2016-10-28 23:05:58 -04:00
|
|
|
"test" => {
|
|
|
|
"adapter" => "sqlite3",
|
|
|
|
"host" => "localhost",
|
|
|
|
"port" => "9000",
|
|
|
|
"database" => "foo_test",
|
|
|
|
"user" => "foo",
|
|
|
|
"password" => "bar",
|
|
|
|
"pool" => "5",
|
|
|
|
"timeout" => "3000"
|
2013-12-15 01:07:34 -05:00
|
|
|
}
|
|
|
|
}
|
2014-07-15 22:36:45 -04:00
|
|
|
app_db_config(config_sample) do
|
2014-08-26 11:53:19 -04:00
|
|
|
assert_equal config_sample["test"], Rails::DBConsole.new.config
|
2014-07-15 22:36:45 -04:00
|
|
|
end
|
2013-12-15 01:07:34 -05:00
|
|
|
end
|
|
|
|
|
|
|
|
def test_config_with_no_db_config
|
2014-07-15 22:36:45 -04:00
|
|
|
app_db_config(nil) do
|
|
|
|
assert_raise(ActiveRecord::AdapterNotSpecified) {
|
|
|
|
Rails::DBConsole.new.config
|
|
|
|
}
|
|
|
|
end
|
2013-12-15 01:07:34 -05:00
|
|
|
end
|
|
|
|
|
|
|
|
def test_config_with_database_url_only
|
2016-08-06 13:16:09 -04:00
|
|
|
ENV["DATABASE_URL"] = "postgresql://foo:bar@localhost:9000/foo_test?pool=5&timeout=3000"
|
2013-12-21 23:09:01 -05:00
|
|
|
expected = {
|
|
|
|
"adapter" => "postgresql",
|
|
|
|
"host" => "localhost",
|
|
|
|
"port" => 9000,
|
|
|
|
"database" => "foo_test",
|
|
|
|
"username" => "foo",
|
|
|
|
"password" => "bar",
|
|
|
|
"pool" => "5",
|
|
|
|
"timeout" => "3000"
|
2013-12-15 01:07:34 -05:00
|
|
|
}.sort
|
2014-07-15 22:36:45 -04:00
|
|
|
|
|
|
|
app_db_config(nil) do
|
|
|
|
assert_equal expected, Rails::DBConsole.new.config.sort
|
|
|
|
end
|
2013-12-15 01:07:34 -05:00
|
|
|
end
|
|
|
|
|
|
|
|
def test_config_choose_database_url_if_exists
|
2013-12-21 23:09:01 -05:00
|
|
|
host = "database-url-host.com"
|
2016-08-06 13:16:09 -04:00
|
|
|
ENV["DATABASE_URL"] = "postgresql://foo:bar@#{host}:9000/foo_test?pool=5&timeout=3000"
|
2013-12-15 01:07:34 -05:00
|
|
|
sample_config = {
|
|
|
|
"test" => {
|
2013-12-21 23:09:01 -05:00
|
|
|
"adapter" => "postgresql",
|
|
|
|
"host" => "not-the-#{host}",
|
|
|
|
"port" => 9000,
|
|
|
|
"database" => "foo_test",
|
|
|
|
"username" => "foo",
|
|
|
|
"password" => "bar",
|
|
|
|
"pool" => "5",
|
|
|
|
"timeout" => "3000"
|
2013-12-15 01:07:34 -05:00
|
|
|
}
|
|
|
|
}
|
2014-07-15 22:36:45 -04:00
|
|
|
app_db_config(sample_config) do
|
|
|
|
assert_equal host, Rails::DBConsole.new.config["host"]
|
|
|
|
end
|
2012-05-04 10:40:32 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
def test_env
|
2014-08-26 11:53:19 -04:00
|
|
|
assert_equal "test", Rails::DBConsole.new.environment
|
2012-05-11 17:19:58 -04:00
|
|
|
|
2016-08-06 13:16:09 -04:00
|
|
|
ENV["RAILS_ENV"] = nil
|
|
|
|
ENV["RACK_ENV"] = nil
|
2012-05-04 10:40:32 -04:00
|
|
|
|
2014-07-15 22:36:45 -04:00
|
|
|
Rails.stub(:respond_to?, false) do
|
2014-08-26 11:53:19 -04:00
|
|
|
assert_equal "development", Rails::DBConsole.new.environment
|
2012-05-04 10:40:32 -04:00
|
|
|
|
2016-08-06 13:16:09 -04:00
|
|
|
ENV["RACK_ENV"] = "rack_env"
|
2015-03-20 11:14:11 -04:00
|
|
|
assert_equal "rack_env", Rails::DBConsole.new.environment
|
|
|
|
|
2016-08-06 13:16:09 -04:00
|
|
|
ENV["RAILS_ENV"] = "rails_env"
|
2014-08-26 11:53:19 -04:00
|
|
|
assert_equal "rails_env", Rails::DBConsole.new.environment
|
2014-07-15 22:36:45 -04:00
|
|
|
end
|
2012-05-07 00:38:34 -04:00
|
|
|
ensure
|
2016-08-06 13:16:09 -04:00
|
|
|
ENV["RAILS_ENV"] = "test"
|
|
|
|
ENV["RACK_ENV"] = nil
|
2012-04-27 03:28:53 -04:00
|
|
|
end
|
|
|
|
|
2012-12-27 10:04:54 -05:00
|
|
|
def test_rails_env_is_development_when_argument_is_dev
|
2016-09-18 13:17:12 -04:00
|
|
|
stub_available_environments([ "development", "test" ]) do
|
|
|
|
assert_match("development", parse_arguments([ "dev" ])[:environment])
|
2014-07-15 22:36:45 -04:00
|
|
|
end
|
2012-12-27 10:04:54 -05:00
|
|
|
end
|
|
|
|
|
|
|
|
def test_rails_env_is_dev_when_argument_is_dev_and_dev_env_is_present
|
2016-09-18 13:17:12 -04:00
|
|
|
stub_available_environments([ "dev" ]) do
|
|
|
|
assert_match("dev", parse_arguments([ "dev" ])[:environment])
|
2014-07-15 22:36:45 -04:00
|
|
|
end
|
2012-12-27 10:04:54 -05:00
|
|
|
end
|
|
|
|
|
2012-04-27 03:28:53 -04:00
|
|
|
def test_mysql
|
2016-08-06 13:16:09 -04:00
|
|
|
start(adapter: "mysql2", database: "db")
|
2012-04-27 03:28:53 -04:00
|
|
|
assert !aborted
|
2016-08-06 13:16:09 -04:00
|
|
|
assert_equal [%w[mysql mysql5], "db"], dbconsole.find_cmd_and_exec_args
|
2012-04-27 03:28:53 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
def test_mysql_full
|
2016-08-06 13:16:09 -04:00
|
|
|
start(adapter: "mysql2", database: "db", host: "locahost", port: 1234, socket: "socket", username: "user", password: "qwerty", encoding: "UTF-8")
|
2012-04-27 03:28:53 -04:00
|
|
|
assert !aborted
|
2016-08-06 13:16:09 -04:00
|
|
|
assert_equal [%w[mysql mysql5], "--host=locahost", "--port=1234", "--socket=socket", "--user=user", "--default-character-set=UTF-8", "-p", "db"], dbconsole.find_cmd_and_exec_args
|
2012-04-27 03:28:53 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
def test_mysql_include_password
|
2016-08-16 03:30:11 -04:00
|
|
|
start({ adapter: "mysql2", database: "db", username: "user", password: "qwerty" }, ["-p"])
|
2012-04-27 03:28:53 -04:00
|
|
|
assert !aborted
|
2016-08-06 13:16:09 -04:00
|
|
|
assert_equal [%w[mysql mysql5], "--user=user", "--password=qwerty", "db"], dbconsole.find_cmd_and_exec_args
|
2012-04-27 03:28:53 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
def test_postgresql
|
2016-08-06 13:16:09 -04:00
|
|
|
start(adapter: "postgresql", database: "db")
|
2012-04-27 03:28:53 -04:00
|
|
|
assert !aborted
|
2016-08-06 13:16:09 -04:00
|
|
|
assert_equal ["psql", "db"], dbconsole.find_cmd_and_exec_args
|
2012-04-27 03:28:53 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
def test_postgresql_full
|
2016-08-06 13:16:09 -04:00
|
|
|
start(adapter: "postgresql", database: "db", username: "user", password: "q1w2e3", host: "host", port: 5432)
|
2012-04-27 03:28:53 -04:00
|
|
|
assert !aborted
|
2016-08-06 13:16:09 -04:00
|
|
|
assert_equal ["psql", "db"], dbconsole.find_cmd_and_exec_args
|
|
|
|
assert_equal "user", ENV["PGUSER"]
|
|
|
|
assert_equal "host", ENV["PGHOST"]
|
|
|
|
assert_equal "5432", ENV["PGPORT"]
|
|
|
|
assert_not_equal "q1w2e3", ENV["PGPASSWORD"]
|
2012-04-27 03:28:53 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
def test_postgresql_include_password
|
2016-08-16 03:30:11 -04:00
|
|
|
start({ adapter: "postgresql", database: "db", username: "user", password: "q1w2e3" }, ["-p"])
|
2012-04-27 03:28:53 -04:00
|
|
|
assert !aborted
|
2016-08-06 13:16:09 -04:00
|
|
|
assert_equal ["psql", "db"], dbconsole.find_cmd_and_exec_args
|
|
|
|
assert_equal "user", ENV["PGUSER"]
|
|
|
|
assert_equal "q1w2e3", ENV["PGPASSWORD"]
|
2012-04-27 03:28:53 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
def test_sqlite3
|
2016-08-06 13:16:09 -04:00
|
|
|
start(adapter: "sqlite3", database: "db.sqlite3")
|
2012-04-27 03:28:53 -04:00
|
|
|
assert !aborted
|
2016-08-06 13:16:09 -04:00
|
|
|
assert_equal ["sqlite3", Rails.root.join("db.sqlite3").to_s], dbconsole.find_cmd_and_exec_args
|
2012-04-27 03:28:53 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
def test_sqlite3_mode
|
2016-08-16 03:30:11 -04:00
|
|
|
start({ adapter: "sqlite3", database: "db.sqlite3" }, ["--mode", "html"])
|
2012-04-27 03:28:53 -04:00
|
|
|
assert !aborted
|
2016-08-06 13:16:09 -04:00
|
|
|
assert_equal ["sqlite3", "-html", Rails.root.join("db.sqlite3").to_s], dbconsole.find_cmd_and_exec_args
|
2012-04-27 03:28:53 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
def test_sqlite3_header
|
2016-08-16 03:30:11 -04:00
|
|
|
start({ adapter: "sqlite3", database: "db.sqlite3" }, ["--header"])
|
2016-08-06 13:16:09 -04:00
|
|
|
assert_equal ["sqlite3", "-header", Rails.root.join("db.sqlite3").to_s], dbconsole.find_cmd_and_exec_args
|
2012-05-04 04:54:20 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
def test_sqlite3_db_absolute_path
|
2016-08-06 13:16:09 -04:00
|
|
|
start(adapter: "sqlite3", database: "/tmp/db.sqlite3")
|
2012-04-27 03:28:53 -04:00
|
|
|
assert !aborted
|
2016-08-06 13:16:09 -04:00
|
|
|
assert_equal ["sqlite3", "/tmp/db.sqlite3"], dbconsole.find_cmd_and_exec_args
|
2012-04-27 03:28:53 -04:00
|
|
|
end
|
|
|
|
|
Fix rails db command with sqlite3 database
When using sqlite3 it was attempting to find the database file based on
Rails.root, the problem is that Rails.root is not always present because
we try to first manually load "config/database.yml" instead of loading
the entire app, to make "rails db" faster.
This means that when we're in the root path of the app, calling "rails db"
won't allow us to use Rails.root, making the command fail for sqlite3
with the error:
./rails/commands/dbconsole.rb:62:in `start':
undefined method `root' for Rails:Module (NoMethodError)
The fix is to simply not pass any dir string to File.expand_path, which
will make it use the current directory of the process as base, or the
root path of the app, which is what we want.
When we are in any other subdirectory, calling "rails db" should work
just fine, because "config/database.yml" won't be found, thus "rails db"
will fallback to loading the app, making Rails.root available.
Closes #8257.
2012-11-18 20:46:33 -05:00
|
|
|
def test_sqlite3_db_without_defined_rails_root
|
2014-07-15 22:36:45 -04:00
|
|
|
Rails.stub(:respond_to?, false) do
|
2016-08-06 13:16:09 -04:00
|
|
|
start(adapter: "sqlite3", database: "config/db.sqlite3")
|
2014-07-15 22:36:45 -04:00
|
|
|
assert !aborted
|
2016-08-06 13:16:09 -04:00
|
|
|
assert_equal ["sqlite3", Rails.root.join("../config/db.sqlite3").to_s], dbconsole.find_cmd_and_exec_args
|
2014-07-15 22:36:45 -04:00
|
|
|
end
|
Fix rails db command with sqlite3 database
When using sqlite3 it was attempting to find the database file based on
Rails.root, the problem is that Rails.root is not always present because
we try to first manually load "config/database.yml" instead of loading
the entire app, to make "rails db" faster.
This means that when we're in the root path of the app, calling "rails db"
won't allow us to use Rails.root, making the command fail for sqlite3
with the error:
./rails/commands/dbconsole.rb:62:in `start':
undefined method `root' for Rails:Module (NoMethodError)
The fix is to simply not pass any dir string to File.expand_path, which
will make it use the current directory of the process as base, or the
root path of the app, which is what we want.
When we are in any other subdirectory, calling "rails db" should work
just fine, because "config/database.yml" won't be found, thus "rails db"
will fallback to loading the app, making Rails.root available.
Closes #8257.
2012-11-18 20:46:33 -05:00
|
|
|
end
|
|
|
|
|
2012-04-27 03:28:53 -04:00
|
|
|
def test_oracle
|
2016-08-06 13:16:09 -04:00
|
|
|
start(adapter: "oracle", database: "db", username: "user", password: "secret")
|
2012-04-27 03:28:53 -04:00
|
|
|
assert !aborted
|
2016-08-06 13:16:09 -04:00
|
|
|
assert_equal ["sqlplus", "user@db"], dbconsole.find_cmd_and_exec_args
|
2012-04-27 03:28:53 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
def test_oracle_include_password
|
2016-08-16 03:30:11 -04:00
|
|
|
start({ adapter: "oracle", database: "db", username: "user", password: "secret" }, ["-p"])
|
2012-04-27 03:28:53 -04:00
|
|
|
assert !aborted
|
2016-08-06 13:16:09 -04:00
|
|
|
assert_equal ["sqlplus", "user/secret@db"], dbconsole.find_cmd_and_exec_args
|
2012-04-27 03:28:53 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
def test_unknown_command_line_client
|
2016-08-06 13:16:09 -04:00
|
|
|
start(adapter: "unknown", database: "db")
|
2012-04-27 03:28:53 -04:00
|
|
|
assert aborted
|
2012-05-30 05:08:56 -04:00
|
|
|
assert_match(/Unknown command-line client for db/, output)
|
2012-04-27 03:28:53 -04:00
|
|
|
end
|
|
|
|
|
2012-05-04 14:04:53 -04:00
|
|
|
def test_print_help_short
|
|
|
|
stdout = capture(:stdout) do
|
2016-09-18 13:17:12 -04:00
|
|
|
Rails::Command.invoke(:dbconsole, ["-h"])
|
2012-05-04 14:04:53 -04:00
|
|
|
end
|
2016-09-18 13:17:12 -04:00
|
|
|
assert_match(/bin\/rails dbconsole \[environment\]/, stdout)
|
2012-05-04 14:04:53 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
def test_print_help_long
|
|
|
|
stdout = capture(:stdout) do
|
2016-09-18 13:17:12 -04:00
|
|
|
Rails::Command.invoke(:dbconsole, ["--help"])
|
2012-05-04 14:04:53 -04:00
|
|
|
end
|
2016-09-18 13:17:12 -04:00
|
|
|
assert_match(/bin\/rails dbconsole \[environment\]/, stdout)
|
2012-05-04 14:04:53 -04:00
|
|
|
end
|
|
|
|
|
2012-04-27 03:28:53 -04:00
|
|
|
attr_reader :aborted, :output
|
2013-04-04 13:53:46 -04:00
|
|
|
private :aborted, :output
|
|
|
|
|
|
|
|
private
|
2012-04-27 03:28:53 -04:00
|
|
|
|
2016-08-06 13:55:02 -04:00
|
|
|
def app_db_config(results)
|
|
|
|
Rails.application.config.stub(:database_configuration, results || {}) do
|
|
|
|
yield
|
|
|
|
end
|
2014-07-15 22:36:45 -04:00
|
|
|
end
|
2013-12-15 01:07:34 -05:00
|
|
|
|
2016-09-18 13:17:12 -04:00
|
|
|
def make_dbconsole
|
|
|
|
Class.new(Rails::DBConsole) do
|
2016-08-06 13:55:02 -04:00
|
|
|
attr_reader :find_cmd_and_exec_args
|
2014-07-15 22:36:45 -04:00
|
|
|
|
2016-08-06 13:55:02 -04:00
|
|
|
def find_cmd_and_exec(*args)
|
|
|
|
@find_cmd_and_exec_args = args
|
|
|
|
end
|
2016-09-18 13:17:12 -04:00
|
|
|
end
|
2016-08-06 13:55:02 -04:00
|
|
|
end
|
2012-04-27 03:28:53 -04:00
|
|
|
|
2016-09-18 13:17:12 -04:00
|
|
|
attr_reader :dbconsole
|
|
|
|
|
2016-08-06 13:55:02 -04:00
|
|
|
def start(config = {}, argv = [])
|
2016-09-18 13:17:12 -04:00
|
|
|
@dbconsole = make_dbconsole.new(parse_arguments(argv))
|
|
|
|
@dbconsole.stub(:config, config.stringify_keys) do
|
|
|
|
capture_abort { @dbconsole.start }
|
2014-07-15 22:36:45 -04:00
|
|
|
end
|
|
|
|
end
|
2012-04-27 03:28:53 -04:00
|
|
|
|
2016-08-06 13:55:02 -04:00
|
|
|
def capture_abort
|
|
|
|
@aborted = false
|
|
|
|
@output = capture(:stderr) do
|
|
|
|
begin
|
|
|
|
yield
|
|
|
|
rescue SystemExit
|
|
|
|
@aborted = true
|
|
|
|
end
|
2012-04-27 03:28:53 -04:00
|
|
|
end
|
|
|
|
end
|
2016-09-18 13:17:12 -04:00
|
|
|
|
|
|
|
def stub_available_environments(environments)
|
|
|
|
Rails::Command::DbconsoleCommand.class_eval do
|
|
|
|
alias_method :old_environments, :available_environments
|
|
|
|
|
|
|
|
define_method :available_environments do
|
|
|
|
environments
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
yield
|
|
|
|
ensure
|
|
|
|
Rails::Command::DbconsoleCommand.class_eval do
|
|
|
|
undef_method :available_environments
|
|
|
|
alias_method :available_environments, :old_environments
|
|
|
|
undef_method :old_environments
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
def parse_arguments(args)
|
|
|
|
Rails::Command::DbconsoleCommand.class_eval do
|
|
|
|
alias_method :old_perform, :perform
|
|
|
|
define_method(:perform) do
|
|
|
|
extract_environment_option_from_argument
|
|
|
|
|
|
|
|
options
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
Rails::Command.invoke(:dbconsole, args)
|
|
|
|
ensure
|
|
|
|
Rails::Command::DbconsoleCommand.class_eval do
|
|
|
|
undef_method :perform
|
|
|
|
alias_method :perform, :old_perform
|
|
|
|
undef_method :old_perform
|
|
|
|
end
|
|
|
|
end
|
2012-04-27 03:28:53 -04:00
|
|
|
end
|