diff options
author | Kasper Timm Hansen <kaspth@gmail.com> | 2017-01-15 20:15:45 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-01-15 20:15:45 +0100 |
commit | f8a3981beb4221c230a2dc366db5fcc5e276f035 (patch) | |
tree | cb22b2e410896c7a212744916f9a541a9ac6f444 /railties/test/engine/commands_test.rb | |
parent | 0bc8d0fb88101a7ea5f87df5f5b384746e3cf06e (diff) | |
parent | f5f834fb349c62efdb3db45b8ec392c9f70826f0 (diff) | |
download | rails-f8a3981beb4221c230a2dc366db5fcc5e276f035.tar.gz rails-f8a3981beb4221c230a2dc366db5fcc5e276f035.tar.bz2 rails-f8a3981beb4221c230a2dc366db5fcc5e276f035.zip |
Merge pull request #27601 from y-yagi/make_work_all_commands_from_engine
Make all rails commands work in engine
Diffstat (limited to 'railties/test/engine/commands_test.rb')
-rw-r--r-- | railties/test/engine/commands_test.rb | 96 |
1 files changed, 96 insertions, 0 deletions
diff --git a/railties/test/engine/commands_test.rb b/railties/test/engine/commands_test.rb new file mode 100644 index 0000000000..b1c937143f --- /dev/null +++ b/railties/test/engine/commands_test.rb @@ -0,0 +1,96 @@ +require "abstract_unit" +begin + require "pty" +rescue LoadError +end + +class Rails::Engine::CommandsTest < ActiveSupport::TestCase + def setup + @destination_root = Dir.mktmpdir("bukkits") + Dir.chdir(@destination_root) { `bundle exec rails plugin new bukkits --mountable` } + end + + def teardown + FileUtils.rm_rf(@destination_root) + end + + def test_help_command_work_inside_engine + output = capture(:stderr) do + Dir.chdir(plugin_path) { `bin/rails --help` } + end + assert_no_match "NameError", output + end + + def test_runner_command_work_inside_engine + output = capture(:stdout) do + Dir.chdir(plugin_path) { system("bin/rails runner 'puts Rails.env'") } + end + + assert_equal "test", output.strip + end + + def test_console_command_work_inside_engine + skip "PTY unavailable" unless available_pty? + + master, slave = PTY.open + spawn_command("console", slave) + assert_output(">", master) + ensure + master.puts "quit" + end + + def test_dbconsole_command_work_inside_engine + skip "PTY unavailable" unless available_pty? + + master, slave = PTY.open + spawn_command("dbconsole", slave) + assert_output("sqlite>", master) + ensure + master.puts ".exit" + end + + def test_server_command_work_inside_engine + skip "PTY unavailable" unless available_pty? + + master, slave = PTY.open + pid = spawn_command("server", slave) + assert_output("Listening on", master) + ensure + kill(pid) + end + + private + def plugin_path + "#{@destination_root}/bukkits" + end + + def assert_output(expected, io, timeout = 10) + 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 spawn_command(command, fd) + Process.spawn( + "#{plugin_path}/bin/rails #{command}", + in: fd, out: fd, err: fd + ) + end + + def available_pty? + defined?(PTY) && PTY.respond_to?(:open) + end + + def kill(pid) + Process.kill("TERM", pid) + Process.wait(pid) + rescue Errno::ESRCH + end +end |