Skip to content

Commit bfaef20

Browse files
committed
Stub rails_command to prevent app:template command from being run
When #48269 was merged any gem installed during `rails new` which calls `app:template` would cause the install command to be executed and consequently `bundle install` would also run. We want to avoid running these commands in our tests because they are very expensive. It is up to the gem (importmap, etc) to test the behavior of the install command, not railties. Before ``` $ bin/test test/generators/plugin_generator_test.rb test/generators/app_generator_test.rb Finished in 320.803659s, 0.8541 runs/s, 7.1913 assertions/s. 274 runs, 2307 assertions, 14 failures, 0 errors, 0 skips ``` After ``` Finished in 70.316250s, 3.9251 runs/s, 34.3164 assertions/s. 276 runs, 2413 assertions, 0 failures, 0 errors, 0 skips ``` Change railties default log_level to :error The default of :info generates a ton of unnecessary noise in the railties logs. This change greatly reduces the amount of noise in the railties tests. **After** ``` $ bundle exec rake test >> railties_output_patched 2>&1 $ wc -l railties_output_patched 1491 railties_output_patched ``` **Before** ``` $ bundle exec rake test >> railties_output_unpatched 2>&1 $ wc -l railties_output_unpatched 19023 railties_output_unpatched ```
1 parent d135be2 commit bfaef20

File tree

4 files changed

+61
-75
lines changed

4 files changed

+61
-75
lines changed

railties/test/application/configuration_test.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,7 @@ def suppress_default_config
8989
def restore_default_config
9090
FileUtils.rm_rf("#{app_path}/config/environments")
9191
FileUtils.mv("#{app_path}/config/__environments__", "#{app_path}/config/environments")
92+
remove_from_env_config "production", "config.log_level = :error"
9293
end
9394

9495
test "Rails.env does not set the RAILS_ENV environment variable which would leak out into rake tasks" do

railties/test/generators/app_generator_test.rb

Lines changed: 52 additions & 73 deletions
Original file line numberDiff line numberDiff line change
@@ -653,6 +653,20 @@ def test_ci_files_are_skipped_if_required
653653
assert_no_file ".github/dependabot.yml"
654654
end
655655

656+
def test_inclusion_of_kamal_files
657+
run_generator_instance
658+
659+
assert_file "config/deploy.yml"
660+
assert_file ".env.erb"
661+
end
662+
663+
def test_kamal_files_are_skipped_if_required
664+
run_generator [destination_root, "--skip-kamal"]
665+
666+
assert_no_file "config/deploy.yml"
667+
assert_no_file ".env.erb"
668+
end
669+
656670
def test_usage_read_from_file
657671
assert_called(File, :read, returns: "USAGE FROM FILE") do
658672
assert_equal "USAGE FROM FILE", Rails::Generators::AppGenerator.desc
@@ -766,15 +780,10 @@ def test_skip_active_job_option
766780
def test_skip_javascript_option
767781
generator([destination_root], skip_javascript: true)
768782

769-
command_check = -> command, *_ do
770-
if command == "importmap:install"
771-
flunk "`importmap:install` expected to not be called."
772-
end
773-
end
783+
run_generator_instance
774784

775-
generator.stub(:rails_command, command_check) do
776-
run_generator_instance
777-
end
785+
assert_not_includes @rails_commands, "importmap:install", "`importmap:install` expected to not be called."
786+
assert_not_includes @rails_commands, "turbo:install stimulus:install", "`turbo:install stimulus:install` expected to not be called."
778787

779788
assert_no_gem "importmap-rails"
780789
assert_no_gem "jsbundling-rails"
@@ -792,39 +801,19 @@ def test_skip_javascript_option
792801
def test_webpack_option
793802
generator([destination_root], javascript: "webpack")
794803

795-
webpack_called = 0
796-
command_check = -> command, *_ do
797-
case command
798-
when "javascript:install:webpack"
799-
webpack_called += 1
800-
end
801-
end
802-
803-
generator.stub(:rails_command, command_check) do
804-
run_generator_instance
805-
end
804+
run_generator_instance
806805

807-
assert_equal 1, webpack_called, "`javascript:install:webpack` expected to be called once, but was called #{webpack_called} times."
806+
assert_includes @rails_commands, "javascript:install:webpack", "`javascript:install:webpack` expected to be called, but wasn't."
808807
assert_gem "jsbundling-rails"
809808
assert_node_files
810809
end
811810

812811
def test_esbuild_option
813812
generator([destination_root], javascript: "esbuild")
814813

815-
esbuild_called = 0
816-
command_check = -> command, *_ do
817-
case command
818-
when "javascript:install:esbuild"
819-
esbuild_called += 1
820-
end
821-
end
822-
823-
generator.stub(:rails_command, command_check) do
824-
run_generator_instance
825-
end
814+
run_generator_instance
826815

827-
assert_equal 1, esbuild_called, "`javascript:install:esbuild` expected to be called once, but was called #{esbuild_called} times."
816+
assert_includes @rails_commands, "javascript:install:esbuild", "`javascript:install:esbuild` expected to be called, but wasn't."
828817
assert_gem "jsbundling-rails"
829818
assert_node_files
830819
end
@@ -847,19 +836,9 @@ def test_esbuild_option_with_js_argument
847836
def test_bun_option
848837
generator([destination_root], javascript: "bun")
849838

850-
bun_called = 0
851-
command_check = -> command, *_ do
852-
case command
853-
when "javascript:install:bun"
854-
bun_called += 1
855-
end
856-
end
857-
858-
generator.stub(:rails_command, command_check) do
859-
run_generator_instance
860-
end
839+
run_generator_instance
861840

862-
assert_equal 1, bun_called, "`javascript:install:bun` expected to be called once, but was called #{bun_called} times."
841+
assert_includes @rails_commands, "javascript:install:bun", "`javascript:install:bun` expected to be called, but wasn't."
863842
assert_gem "jsbundling-rails"
864843
end
865844

@@ -900,20 +879,20 @@ def test_skip_javascript_option_with_skip_js_argument
900879
end
901880

902881
def test_hotwire
903-
run_generator_and_bundler [destination_root]
882+
generator [destination_root]
883+
run_generator_instance
884+
885+
assert_includes @rails_commands, "turbo:install stimulus:install", "`turbo:install stimulus:install` expected to be called, but wasn't."
904886
assert_gem "turbo-rails"
905887
assert_gem "stimulus-rails"
906888
assert_file "app/views/layouts/application.html.erb" do |content|
907889
assert_match(/data-turbo-track/, content)
908890
end
909-
assert_file "app/javascript/application.js" do |content|
910-
assert_match(/turbo/, content)
911-
assert_match(/controllers/, content)
912-
end
913891
end
914892

915893
def test_skip_hotwire
916-
run_generator [destination_root, "--skip-hotwire"]
894+
generator [destination_root], ["--skip-hotwire"]
895+
run_generator_instance
917896

918897
assert_no_gem "turbo-rails"
919898
assert_file "app/views/layouts/application.html.erb" do |content|
@@ -923,11 +902,11 @@ def test_skip_hotwire
923902
end
924903

925904
def test_css_option_with_asset_pipeline_tailwind
926-
run_generator_and_bundler [destination_root, "--css=tailwind"]
905+
generator [destination_root], ["--css=tailwind"]
906+
run_generator_instance
907+
908+
assert_includes @rails_commands, "tailwindcss:install", "`tailwindcss:install` expected to be called, but wasn't."
927909
assert_gem "tailwindcss-rails"
928-
assert_file "app/views/layouts/application.html.erb" do |content|
929-
assert_match(/tailwind/, content)
930-
end
931910
assert_no_node_files
932911
end
933912

@@ -938,9 +917,11 @@ def test_css_option_with_tailwind_uses_cssbundling_gem_when_using_node
938917
end
939918

940919
def test_css_option_with_asset_pipeline_sass
941-
run_generator_and_bundler [destination_root, "--css=sass"]
920+
generator [destination_root], ["--css=sass"]
921+
run_generator_instance
922+
923+
assert_includes @rails_commands, "dartsass:install", "`dartsass:install` expected to be called, but wasn't."
942924
assert_gem "dartsass-rails"
943-
assert_file "app/assets/stylesheets/application.scss"
944925
assert_no_node_files
945926
end
946927

@@ -951,9 +932,11 @@ def test_css_option_with_sass_uses_cssbundling_gem_when_using_node
951932
end
952933

953934
def test_css_option_with_cssbundling_gem
954-
run_generator_and_bundler [destination_root, "--css=postcss"]
935+
generator [destination_root], ["--css=postcss"]
936+
run_generator_instance
937+
938+
assert_includes @rails_commands, "css:install:postcss", "`css:install:postcss` expected to be called, but wasn't."
955939
assert_gem "cssbundling-rails"
956-
assert_file "app/assets/stylesheets/application.postcss.css"
957940
assert_node_files
958941
end
959942

@@ -963,6 +946,16 @@ def test_css_option_with_cssbundling_gem_does_not_force_jsbundling_gem
963946
assert_gem "importmap-rails"
964947
end
965948

949+
def test_default_generator_executes_all_rails_commands
950+
generator [destination_root]
951+
run_generator_instance
952+
953+
expected_commands = [
954+
"credentials:diff --enroll", "importmap:install", "turbo:install stimulus:install"
955+
]
956+
assert_equal expected_commands, @rails_commands
957+
end
958+
966959
def test_skip_dev_gems
967960
run_generator [destination_root, "--skip-dev-gems"]
968961
assert_no_gem "web-console"
@@ -1250,21 +1243,7 @@ def assert_no_node_files
12501243
end
12511244
end
12521245

1253-
def run_generator_and_bundler(args)
1254-
option_args, positional_args = args.partition { |arg| arg.start_with?("--") }
1255-
option_args << "--no-skip-bundle"
1256-
generator(positional_args, option_args)
1257-
1258-
# Stub `rails_gemfile_entry` so that Bundler resolves `gem "rails"` to the
1259-
# current repository instead of searching for an invalid version number
1260-
# (for a version that hasn't been released yet).
1261-
rails_gemfile_entry = Rails::Generators::AppBase::GemfileEntry.path("rails", Rails::Generators::RAILS_DEV_PATH)
1262-
generator.stub(:rails_gemfile_entry, -> { rails_gemfile_entry }) do
1263-
quietly { run_generator_instance }
1264-
end
1265-
end
1266-
1267-
def run_app_update(app_root = destination_root)
1246+
def run_app_update(app_root = destination_root, flags: "--force")
12681247
Dir.chdir(app_root) do
12691248
gemfile_contents = File.read("Gemfile")
12701249
gemfile_contents.sub!(/^(gem "rails").*/, "\\1, path: #{File.expand_path("../../..", __dir__).inspect}")

railties/test/generators/shared_generator_tests.rb

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -406,8 +406,13 @@ def run_generator_instance
406406
@bundle_commands = []
407407
@bundle_command_stub ||= -> (command, *) { @bundle_commands << command }
408408

409+
@rails_commands = []
410+
@rails_command_stub ||= -> (command, *_) { @rails_commands << command }
411+
409412
generator.stub(:bundle_command, @bundle_command_stub) do
410-
super
413+
generator.stub(:rails_command, @rails_command_stub) do
414+
super
415+
end
411416
end
412417
end
413418

railties/test/isolation/abstract_unit.rb

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,7 @@ def build_app(options = {})
146146
add_to_env_config :development, "config.action_view.annotate_rendered_view_with_filenames = false"
147147

148148
remove_from_env_config("development", "config.generators.apply_rubocop_autocorrect_after_generate!")
149+
add_to_env_config :production, "config.log_level = :error"
149150
end
150151

151152
def teardown_app
@@ -263,7 +264,7 @@ def self.name; "RailtiesTestApp"; end
263264
@app.config.eager_load = false
264265
@app.config.session_store :cookie_store, key: "_myapp_session"
265266
@app.config.active_support.deprecation = :log
266-
@app.config.log_level = :info
267+
@app.config.log_level = :error
267268
@app.config.secret_key_base = "b3c631c314c0bbca50c1b2843150fe33"
268269

269270
yield @app if block_given?

0 commit comments

Comments
 (0)