diff --git a/Gemfile b/Gemfile index 84c04cbd7ad..7227d68d5bd 100644 --- a/Gemfile +++ b/Gemfile @@ -62,6 +62,8 @@ gem "rexml", require: false # for railties gem "bootsnap", ">= 1.4.4", require: false gem "webrick", require: false +gem "jbuilder", require: false +gem "web-console", require: false # Active Job group :job do diff --git a/Gemfile.lock b/Gemfile.lock index 9f1ea51b878..ccbd3007eae 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -140,6 +140,7 @@ GEM bcrypt (3.1.16) beaneater (1.1.1) benchmark-ips (2.9.2) + bindex (0.8.1) blade (0.7.3) activesupport (>= 3.0.0) blade-qunit_adapter (>= 2.0.1) @@ -298,6 +299,9 @@ GEM io-console (0.5.11) irb (1.4.1) reline (>= 0.3.0) + jbuilder (2.11.5) + actionview (>= 5.0.0) + activesupport (>= 5.0.0) jmespath (1.4.0) jsbundling-rails (1.0.2) railties (>= 6.0.0) @@ -531,6 +535,11 @@ GEM json (>= 1.8) nokogiri (~> 1.6) rexml (~> 3.2) + web-console (4.2.0) + actionview (>= 6.0.0) + activemodel (>= 6.0.0) + bindex (>= 0.4.0) + railties (>= 6.0.0) webdrivers (5.0.0) nokogiri (~> 1.6) rubyzip (>= 1.3.0) @@ -576,6 +585,7 @@ DEPENDENCIES google-cloud-storage (~> 1.11) image_processing (~> 1.2) importmap-rails + jbuilder jsbundling-rails json (>= 2.0.0) libxml-ruby @@ -624,6 +634,7 @@ DEPENDENCIES tzinfo-data w3c_validators (~> 1.3.6) wdm (>= 0.1.0) + web-console webdrivers webmock webrick diff --git a/railties/test/generators/app_generator_test.rb b/railties/test/generators/app_generator_test.rb index e0f7e3a8796..d45bfbc7182 100644 --- a/railties/test/generators/app_generator_test.rb +++ b/railties/test/generators/app_generator_test.rb @@ -153,21 +153,10 @@ class AppGeneratorTest < Rails::Generators::TestCase app_moved_root = File.join(destination_root, "myapp_moved") run_generator [app_root] + FileUtils.mv(app_root, app_moved_root) + run_app_update(app_moved_root) - stub_rails_application(app_moved_root) do - Rails.application.stub(:is_a?, -> *args { Rails::Application }) do - FileUtils.mv(app_root, app_moved_root) - - # make sure we are in correct dir - FileUtils.cd(app_moved_root) - - generator = Rails::Generators::AppGenerator.new ["rails"], [], - destination_root: app_moved_root, shell: @shell - generator.send(:app_const) - quietly { generator.update_config_files } - assert_file "myapp_moved/config/environment.rb", /Rails\.application\.initialize!/ - end - end + assert_file "#{app_moved_root}/config/environment.rb", /Rails\.application\.initialize!/ end def test_new_application_not_include_api_initializers @@ -187,97 +176,63 @@ class AppGeneratorTest < Rails::Generators::TestCase end def test_app_update_create_new_framework_defaults - run_generator defaults_path = "config/initializers/new_framework_defaults_#{Rails::VERSION::MAJOR}_#{Rails::VERSION::MINOR}.rb" + run_generator assert_no_file defaults_path - stub_rails_application do - generator = Rails::Generators::AppGenerator.new ["rails"], { update: true }, { destination_root: destination_root, shell: @shell } - generator.send(:app_const) - quietly { generator.update_config_files } - - assert_file defaults_path - end + run_app_update + assert_file defaults_path end def test_app_update_does_not_create_rack_cors run_generator + run_app_update - stub_rails_application do - generator = Rails::Generators::AppGenerator.new ["rails"], [], destination_root: destination_root, shell: @shell - generator.send(:app_const) - quietly { generator.update_config_files } - assert_no_file "config/initializers/cors.rb" - end + assert_no_file "config/initializers/cors.rb" end def test_app_update_does_not_remove_rack_cors_if_already_present run_generator + FileUtils.touch("#{destination_root}/config/initializers/cors.rb") + run_app_update - FileUtils.touch("config/initializers/cors.rb") - - stub_rails_application do - generator = Rails::Generators::AppGenerator.new ["rails"], [], destination_root: destination_root, shell: @shell - generator.send(:app_const) - quietly { generator.update_config_files } - assert_file "config/initializers/cors.rb" - end + assert_file "config/initializers/cors.rb" end def test_app_update_does_not_generate_assets_initializer_when_sprockets_and_propshaft_are_not_used run_generator [destination_root, "-a", "none"] + run_app_update - stub_rails_application do - generator = Rails::Generators::AppGenerator.new ["rails"], { update: true, asset_pipeline: "none" }, { destination_root: destination_root, shell: @shell } - generator.send(:app_const) - quietly { generator.update_config_files } - - assert_no_file "config/initializers/assets.rb" - assert_no_file "app/assets/config/manifest.js" - end + assert_no_file "config/initializers/assets.rb" + assert_no_file "app/assets/config/manifest.js" end def test_app_update_does_not_generate_manifest_config_when_propshaft_is_used run_generator [destination_root, "-a", "propshaft"] + run_app_update - stub_rails_application do - generator = Rails::Generators::AppGenerator.new ["rails"], { update: true, asset_pipeline: "propshaft" }, { destination_root: destination_root, shell: @shell } - generator.send(:app_const) - quietly { generator.update_config_files } - - assert_file "config/initializers/assets.rb" - assert_no_file "app/assets/config/manifest.js" - end + assert_file "config/initializers/assets.rb" + assert_no_file "app/assets/config/manifest.js" end def test_app_update_does_not_generate_action_cable_contents_when_skip_action_cable_is_given run_generator [destination_root, "--skip-action-cable"] + run_app_update - stub_rails_application do - generator = Rails::Generators::AppGenerator.new ["rails"], { update: true, skip_action_cable: true }, { destination_root: destination_root, shell: @shell } - generator.send(:app_const) - quietly { generator.update_config_files } - - assert_no_file "config/cable.yml" - assert_file "config/environments/production.rb" do |content| - assert_no_match(/config\.action_cable/, content) - end - assert_no_file "test/channels/application_cable/connection_test.rb" + assert_no_file "config/cable.yml" + assert_file "config/environments/production.rb" do |content| + assert_no_match(/config\.action_cable/, content) end + assert_no_file "test/channels/application_cable/connection_test.rb" end def test_app_update_does_not_generate_bootsnap_contents_when_skip_bootsnap_is_given run_generator [destination_root, "--skip-bootsnap"] + run_app_update - stub_rails_application do - generator = Rails::Generators::AppGenerator.new ["rails"], { update: true, skip_bootsnap: true }, { destination_root: destination_root, shell: @shell } - generator.send(:app_const) - quietly { generator.update_config_files } - - assert_file "config/boot.rb" do |content| - assert_no_match(/require "bootsnap\/setup"/, content) - end + assert_file "config/boot.rb" do |content| + assert_no_match(/require "bootsnap\/setup"/, content) end end @@ -287,7 +242,7 @@ class AppGeneratorTest < Rails::Generators::TestCase FileUtils.cd(destination_root) do config = "config/application.rb" assert_no_changes -> { File.readlines(config).grep(/require /) } do - quietly { system("yes | bin/rails app:update") } + run_app_update end end end @@ -298,7 +253,7 @@ class AppGeneratorTest < Rails::Generators::TestCase FileUtils.cd(destination_root) do config = "config/application.rb" assert_no_changes -> { File.readlines(config).grep(/require /) } do - quietly { system("yes | bin/rails app:update") } + run_app_update end end end @@ -309,7 +264,7 @@ class AppGeneratorTest < Rails::Generators::TestCase FileUtils.cd(destination_root) do config = "config/application.rb" assert_no_changes -> { File.readlines(config).grep(/require /) } do - quietly { system("yes | bin/rails app:update") } + run_app_update end end end @@ -320,7 +275,7 @@ class AppGeneratorTest < Rails::Generators::TestCase FileUtils.cd(destination_root) do config = "config/application.rb" assert_no_changes -> { File.readlines(config).grep(/require /) } do - quietly { system("yes | bin/rails app:update") } + run_app_update end end end @@ -332,7 +287,7 @@ class AppGeneratorTest < Rails::Generators::TestCase config = "config/application.rb" assert_file config, /generators\.system_tests/ assert_no_changes -> { File.readlines(config).grep(/generators\.system_tests/) } do - quietly { system("yes | bin/rails app:update") } + run_app_update end end end @@ -350,50 +305,40 @@ class AppGeneratorTest < Rails::Generators::TestCase def test_app_update_does_not_generate_active_storage_contents_when_skip_active_storage_is_given run_generator [destination_root, "--skip-active-storage"] + run_app_update - stub_rails_application do - generator = Rails::Generators::AppGenerator.new ["rails"], { update: true, skip_active_storage: true }, { destination_root: destination_root, shell: @shell } - generator.send(:app_const) - quietly { generator.update_config_files } - - assert_file "config/environments/development.rb" do |content| - assert_no_match(/config\.active_storage/, content) - end - - assert_file "config/environments/production.rb" do |content| - assert_no_match(/config\.active_storage/, content) - end - - assert_file "config/environments/test.rb" do |content| - assert_no_match(/config\.active_storage/, content) - end - - assert_no_file "config/storage.yml" + assert_file "config/environments/development.rb" do |content| + assert_no_match(/config\.active_storage/, content) end + + assert_file "config/environments/production.rb" do |content| + assert_no_match(/config\.active_storage/, content) + end + + assert_file "config/environments/test.rb" do |content| + assert_no_match(/config\.active_storage/, content) + end + + assert_no_file "config/storage.yml" end def test_app_update_does_not_generate_active_storage_contents_when_skip_active_record_is_given run_generator [destination_root, "--skip-active-record"] + run_app_update - stub_rails_application do - generator = Rails::Generators::AppGenerator.new ["rails"], { update: true, skip_active_record: true }, { destination_root: destination_root, shell: @shell } - generator.send(:app_const) - quietly { generator.update_config_files } - - assert_file "config/environments/development.rb" do |content| - assert_no_match(/config\.active_storage/, content) - end - - assert_file "config/environments/production.rb" do |content| - assert_no_match(/config\.active_storage/, content) - end - - assert_file "config/environments/test.rb" do |content| - assert_no_match(/config\.active_storage/, content) - end - - assert_no_file "config/storage.yml" + assert_file "config/environments/development.rb" do |content| + assert_no_match(/config\.active_storage/, content) end + + assert_file "config/environments/production.rb" do |content| + assert_no_match(/config\.active_storage/, content) + end + + assert_file "config/environments/test.rb" do |content| + assert_no_match(/config\.active_storage/, content) + end + + assert_no_file "config/storage.yml" end def test_generator_skips_action_mailbox_when_skip_action_mailbox_is_given @@ -433,9 +378,10 @@ class AppGeneratorTest < Rails::Generators::TestCase config = "config/application.rb" content = File.read(config) File.write(config, content.gsub(/config\.load_defaults #{Rails::VERSION::STRING.to_f}/, "config.load_defaults 5.1")) - quietly { system("bin/rails app:update") } end + run_app_update + assert_file "config/application.rb", /\s+config\.load_defaults 5\.1/ end @@ -453,15 +399,11 @@ class AppGeneratorTest < Rails::Generators::TestCase assert_no_match(/hyphenated-app/, content) end - stub_rails_application(app_root) do - generator = Rails::Generators::AppGenerator.new ["rails"], { update: true }, { destination_root: app_root, shell: @shell } - generator.send(:app_const) - quietly { generator.update_config_files } + run_app_update(app_root) - assert_file "#{app_root}/config/cable.yml" do |content| - assert_match(/hyphenated_app/, content) - assert_no_match(/hyphenated-app/, content) - end + assert_file "#{app_root}/config/cable.yml" do |content| + assert_match(/hyphenated_app/, content) + assert_no_match(/hyphenated-app/, content) end end @@ -1126,9 +1068,14 @@ class AppGeneratorTest < Rails::Generators::TestCase end private - def stub_rails_application(root = destination_root, &block) - Rails.application.config.root = root - Rails.application.class.stub(:name, "Myapp", &block) + def run_app_update(app_root = destination_root) + Dir.chdir(app_root) do + gemfile_contents = File.read("Gemfile") + gemfile_contents.sub!(/^(gem "rails").*/, "\\1, path: #{File.expand_path("../../..", __dir__).inspect}") + File.write("Gemfile", gemfile_contents) + + quietly { system({ "BUNDLE_GEMFILE" => "Gemfile" }, "yes | bin/rails app:update", exception: true) } + end end def action(*args, &block)