aboutsummaryrefslogtreecommitdiffstats
path: root/railties/test/application/console_test.rb
diff options
context:
space:
mode:
Diffstat (limited to 'railties/test/application/console_test.rb')
-rw-r--r--railties/test/application/console_test.rb78
1 files changed, 58 insertions, 20 deletions
diff --git a/railties/test/application/console_test.rb b/railties/test/application/console_test.rb
index f372afa51c..31bc003dcb 100644
--- a/railties/test/application/console_test.rb
+++ b/railties/test/application/console_test.rb
@@ -81,35 +81,73 @@ class ConsoleTest < ActiveSupport::TestCase
assert_equal 'Once upon a time in a world...',
helper.truncate('Once upon a time in a world far far away')
end
+end
+
+begin
+ require "pty"
+rescue LoadError
+end
- def test_with_sandbox
- require 'rails/all'
- value = false
+class FullStackConsoleTest < ActiveSupport::TestCase
+ def setup
+ skip "PTY unavailable" unless defined?(PTY) && PTY.respond_to?(:open)
- Class.new(Rails::Railtie) do
- console do |app|
- value = app.sandbox?
+ build_app
+ app_file 'app/models/post.rb', <<-CODE
+ class Post < ActiveRecord::Base
end
- end
+ CODE
+ system "#{app_path}/bin/rails runner 'Post.connection.create_table :posts'"
- load_environment(true)
- assert value
+ @master, @slave = PTY.open
end
- def test_active_record_does_not_panic_when_referencing_an_observed_constant
- add_to_config "config.active_record.observers = :user_observer"
+ def teardown
+ teardown_app
+ end
- app_file "app/models/user.rb", <<-MODEL
- class User < ActiveRecord::Base
- end
- MODEL
+ def assert_output(expected, timeout = 1)
+ timeout = Time.now + timeout
- app_file "app/models/user_observer.rb", <<-MODEL
- class UserObserver < ActiveRecord::Observer
+ output = ""
+ until output.include?(expected) || Time.now > timeout
+ if IO.select([@master], [], [], 0.1)
+ output << @master.read(1)
end
- MODEL
+ end
- load_environment
- assert_nothing_raised { User }
+ assert output.include?(expected), "#{expected.inspect} expected, but got:\n\n#{output}"
+ end
+
+ def write_prompt(command, expected_output = nil)
+ @master.puts command
+ assert_output command
+ assert_output expected_output if expected_output
+ assert_output "> "
+ end
+
+ def spawn_console
+ Process.spawn(
+ "#{app_path}/bin/rails console --sandbox",
+ in: @slave, out: @slave, err: @slave
+ )
+
+ assert_output "> ", 30
+ end
+
+ def test_sandbox
+ spawn_console
+
+ write_prompt "Post.count", "=> 0"
+ write_prompt "Post.create"
+ write_prompt "Post.count", "=> 1"
+ @master.puts "quit"
+
+ spawn_console
+
+ write_prompt "Post.count", "=> 0"
+ write_prompt "Post.transaction { Post.create; raise }"
+ write_prompt "Post.count", "=> 0"
+ @master.puts "quit"
end
end