1
0
Fork 0
mirror of https://github.com/rails/rails.git synced 2022-11-09 12:12:34 -05:00

Add GeneratorsTestHelper#run_generator_instance

This commit adds `run_generator_instance` as a (private) counterpart to
`run_generator` for generator instances configured via
`Rails::Generators::Testing::Behaviour#generator`.
This commit is contained in:
Jonathan Hefner 2020-11-22 11:50:24 -06:00
parent 8c3beff9a2
commit 945347f97c
4 changed files with 71 additions and 77 deletions

View file

@ -107,12 +107,12 @@ class AppGeneratorTest < Rails::Generators::TestCase
end
def test_skip_bundle
assert_not_called(generator([destination_root], skip_bundle: true, skip_webpack_install: true), :bundle_command) do
quietly { generator.invoke_all }
# skip_bundle is only about running bundle install, ensure the Gemfile is still
# generated.
assert_file "Gemfile"
end
generator([destination_root], skip_bundle: true, skip_webpack_install: true)
run_generator_instance
assert_empty @bundle_commands
# skip_bundle is only about running bundle install so ensure the Gemfile is still generated
assert_file "Gemfile"
end
def test_assets
@ -811,8 +811,9 @@ class AppGeneratorTest < Rails::Generators::TestCase
def test_generation_runs_bundle_install
generator([destination_root], skip_webpack_install: true)
run_generator_instance
assert_bundler_command_called("install")
assert_equal 1, @bundle_commands.count("install")
end
def test_generation_use_original_bundle_environment
@ -835,23 +836,26 @@ class AppGeneratorTest < Rails::Generators::TestCase
def test_dev_option
generator([destination_root], dev: true, skip_webpack_install: true)
run_generator_instance
assert_bundler_command_called("install")
assert_equal 1, @bundle_commands.count("install")
rails_path = File.expand_path("../../..", Rails.root)
assert_file "Gemfile", /^gem\s+["']rails["'],\s+path:\s+["']#{Regexp.escape(rails_path)}["']$/
end
def test_edge_option
generator([destination_root], edge: true, skip_webpack_install: true)
run_generator_instance
assert_bundler_command_called("install")
assert_equal 1, @bundle_commands.count("install")
assert_file "Gemfile", %r{^gem\s+["']rails["'],\s+github:\s+["']#{Regexp.escape("rails/rails")}["']$}
end
def test_master_option
generator([destination_root], master: true, skip_webpack_install: true)
run_generator_instance
assert_bundler_command_called("install")
assert_equal 1, @bundle_commands.count("install")
assert_file "Gemfile", %r{^gem\s+["']rails["'],\s+github:\s+["']#{Regexp.escape("rails/rails")}["'],\s+branch:\s+["']master["']$}
end
@ -871,8 +875,9 @@ class AppGeneratorTest < Rails::Generators::TestCase
def test_bundler_binstub
generator([destination_root], skip_webpack_install: true)
run_generator_instance
assert_bundler_command_called("binstubs bundler")
assert_equal 1, @bundle_commands.count("binstubs bundler")
end
def test_spring_no_fork
@ -913,19 +918,20 @@ class AppGeneratorTest < Rails::Generators::TestCase
end
def test_skip_javascript_option
generator([destination_root], skip_javascript: true)
command_check = -> command, *_ do
if command == "webpacker:install"
flunk "`webpacker:install` expected to not be called."
end
end
generator([destination_root], skip_javascript: true).stub(:rails_command, command_check) do
generator.stub :bundle_command, nil do
quietly { generator.invoke_all }
end
generator.stub(:rails_command, command_check) do
run_generator_instance
end
assert_no_gem "webpacker"
assert_file "config/initializers/content_security_policy.rb" do |content|
assert_no_match(/policy\.connect_src/, content)
end
@ -936,9 +942,10 @@ class AppGeneratorTest < Rails::Generators::TestCase
end
def test_webpack_option_with_js_framework
generator([destination_root], webpack: "react")
webpacker_called = 0
react_called = 0
command_check = -> command, *_ do
case command
when "webpacker:install"
@ -948,10 +955,8 @@ class AppGeneratorTest < Rails::Generators::TestCase
end
end
generator([destination_root], webpack: "react").stub(:rails_command, command_check) do
generator.stub :bundle_command, nil do
quietly { generator.invoke_all }
end
generator.stub(:rails_command, command_check) do
run_generator_instance
end
assert_equal 1, webpacker_called, "`webpacker:install` expected to be called once, but was called #{webpacker_called} times."
@ -960,16 +965,16 @@ class AppGeneratorTest < Rails::Generators::TestCase
end
def test_skip_webpack_install
generator([destination_root], skip_webpack_install: true)
command_check = -> command do
if command == "webpacker:install"
flunk "`webpacker:install` expected to not be called."
end
end
generator([destination_root], skip_webpack_install: true).stub(:rails_command, command_check) do
generator.stub :bundle_command, nil do
quietly { generator.invoke_all }
end
generator.stub(:rails_command, command_check) do
run_generator_instance
end
assert_gem "webpacker"
@ -1097,22 +1102,14 @@ class AppGeneratorTest < Rails::Generators::TestCase
end
def test_after_bundle_callback
sequence = []
bundle_command_stub = -> *args do
sequence << [:bundle_command, *args]
end
generator([destination_root], skip_webpack_install: true).send(:after_bundle) do
sequence << [:after_bundle_callback]
@bundle_commands_before_callback = @bundle_commands.dup
end
generator.stub(:bundle_command, bundle_command_stub) do
quietly { generator.invoke_all }
end
run_generator_instance
assert_operator sequence.length, :>, 1
assert_equal [:after_bundle_callback], sequence.last
assert_not_empty @bundle_commands_before_callback
assert_equal @bundle_commands_before_callback, @bundle_commands
end
def test_gitignore
@ -1220,20 +1217,4 @@ class AppGeneratorTest < Rails::Generators::TestCase
assert_match(/^\s*# config\.file_watcher = ActiveSupport::EventedFileUpdateChecker/, content)
end
end
def assert_bundler_command_called(target_command)
called = 0
command_check = -> (command, env = {}) do
if command == target_command
called += 1
end
end
generator.stub :bundle_command, command_check do
quietly { generator.invoke_all }
end
assert_equal 1, called, "`#{target_command}` expected to be called once, but was called #{called} times."
end
end

View file

@ -48,6 +48,12 @@ module GeneratorsTestHelper
end
end
def run_generator_instance
capture(:stdout) do
generator.invoke_all
end
end
def with_database_configuration(database_name = "secondary")
original_configurations = ActiveRecord::Base.configurations
ActiveRecord::Base.configurations = {

View file

@ -205,22 +205,34 @@ class PluginGeneratorTest < Rails::Generators::TestCase
end
def test_generation_runs_bundle_install
assert_generates_without_bundler
generator([destination_root])
run_generator_instance
assert_empty @bundle_commands
end
def test_dev_option
assert_generates_without_bundler(dev: true)
generator([destination_root], dev: true)
run_generator_instance
assert_empty @bundle_commands
rails_path = File.expand_path("../../..", Rails.root)
assert_file "Gemfile", /^gem\s+["']rails["'],\s+path:\s+["']#{Regexp.escape(rails_path)}["']$/
end
def test_edge_option
assert_generates_without_bundler(edge: true)
generator([destination_root], edge: true)
run_generator_instance
assert_empty @bundle_commands
assert_file "Gemfile", %r{^gem\s+["']rails["'],\s+github:\s+["']#{Regexp.escape("rails/rails")}["']$}
end
def test_generation_does_not_run_bundle_install_with_full_and_mountable
assert_generates_without_bundler(mountable: true, full: true, dev: true)
generator([destination_root], mountable: true, full: true, dev: true)
run_generator_instance
assert_empty @bundle_commands
assert_no_file "#{destination_root}/Gemfile.lock"
end
@ -781,18 +793,4 @@ class PluginGeneratorTest < Rails::Generators::TestCase
assert_match(/group :development do\n gem 'sqlite3'\nend/, contents)
end
end
def assert_generates_without_bundler(options = {})
generator([destination_root], options)
command_check = -> command do
if command == "install"
flunk "`install` expected to not be called."
end
end
generator.stub :bundle_command, command_check do
quietly { generator.invoke_all }
end
end
end

View file

@ -92,17 +92,16 @@ module SharedGeneratorTests
end
generator([destination_root], template: path, skip_webpack_install: true).stub(:open, check_open, template) do
generator.stub :bundle_command, nil do
quietly { assert_match(/It works!/, capture(:stdout) { generator.invoke_all }) }
end
assert_match(/It works!/, run_generator_instance)
end
end
def test_skip_gemfile
assert_not_called(generator([destination_root], skip_gemfile: true, skip_webpack_install: true), :bundle_command) do
quietly { generator.invoke_all }
assert_no_file "Gemfile"
end
generator([destination_root], skip_gemfile: true, skip_webpack_install: true)
run_generator_instance
assert_empty @bundle_commands
assert_no_file "Gemfile"
end
def test_skip_git
@ -356,4 +355,14 @@ module SharedGeneratorTests
assert_no_match(/node_modules/, content)
end
end
private
def run_generator_instance
@bundle_commands = []
bundle_command_stub = -> (command, *) { @bundle_commands << command }
generator.stub(:bundle_command, bundle_command_stub) do
super
end
end
end