Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Remove unneeded subdirectories in generator tests #45653

Merged
merged 1 commit into from
Jul 26, 2022
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
143 changes: 63 additions & 80 deletions railties/test/generators/app_generator_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -130,20 +130,18 @@ def test_application_new_exits_with_non_zero_code_on_invalid_application_name
end

def test_application_new_exits_with_message_and_non_zero_code_when_generating_inside_existing_rails_directory
app_root = File.join(destination_root, "myfirstapp")
run_generator [app_root]
run_generator
output = nil
Dir.chdir(app_root) do
Dir.chdir(destination_root) do
output = `#{File.expand_path("../../exe/rails", __dir__)} new mysecondapp`
end
assert_equal "Can't initialize a new Rails application within the directory of another, please change to a non-Rails directory first.\nType 'rails' for help.\n", output
assert_equal false, $?.success?
end

def test_application_new_show_help_message_inside_existing_rails_directory
app_root = File.join(destination_root, "myfirstapp")
run_generator [app_root]
output = Dir.chdir(app_root) do
run_generator
output = Dir.chdir(destination_root) do
`#{File.expand_path("../../exe/rails", __dir__)} new --help`
end
assert_match(/rails new APP_PATH \[options\]/, output)
Expand Down Expand Up @@ -184,9 +182,8 @@ def test_new_application_doesnt_need_defaults
end

def test_new_application_load_defaults
app_root = File.join(destination_root, "myfirstapp")
run_generator [app_root]
assert_file "#{app_root}/config/application.rb", /\s+config\.load_defaults #{Rails::VERSION::STRING.to_f}/
run_generator
assert_file "config/application.rb", /\s+config\.load_defaults #{Rails::VERSION::STRING.to_f}/
end

def test_app_update_create_new_framework_defaults
Expand All @@ -205,96 +202,89 @@ def test_app_update_create_new_framework_defaults
end

def test_app_update_does_not_create_rack_cors
app_root = File.join(destination_root, "myapp")
run_generator [app_root]
run_generator

stub_rails_application(app_root) do
generator = Rails::Generators::AppGenerator.new ["rails"], [], destination_root: app_root, shell: @shell
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 "#{app_root}/config/initializers/cors.rb"
assert_no_file "config/initializers/cors.rb"
end
end

def test_app_update_does_not_remove_rack_cors_if_already_present
app_root = File.join(destination_root, "myapp")
run_generator [app_root]
run_generator

FileUtils.touch("#{app_root}/config/initializers/cors.rb")
FileUtils.touch("config/initializers/cors.rb")

stub_rails_application(app_root) do
generator = Rails::Generators::AppGenerator.new ["rails"], [], destination_root: app_root, shell: @shell
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 "#{app_root}/config/initializers/cors.rb"
assert_file "config/initializers/cors.rb"
end
end

def test_app_update_does_not_generate_assets_initializer_when_sprockets_and_propshaft_are_not_used
app_root = File.join(destination_root, "myapp")
run_generator [app_root, "-a", "none"]
run_generator [destination_root, "-a", "none"]

stub_rails_application(app_root) do
generator = Rails::Generators::AppGenerator.new ["rails"], { update: true, asset_pipeline: "none" }, { destination_root: app_root, shell: @shell }
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 "#{app_root}/config/initializers/assets.rb"
assert_no_file "#{app_root}/app/assets/config/manifest.js"
assert_no_file "config/initializers/assets.rb"
assert_no_file "app/assets/config/manifest.js"
end
end

def test_app_update_does_not_generate_manifest_config_when_propshaft_is_used
app_root = File.join(destination_root, "myapp")
run_generator [app_root, "-a", "propshaft"]
run_generator [destination_root, "-a", "propshaft"]

stub_rails_application(app_root) do
generator = Rails::Generators::AppGenerator.new ["rails"], { update: true, asset_pipeline: "propshaft" }, { destination_root: app_root, shell: @shell }
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 "#{app_root}/config/initializers/assets.rb"
assert_no_file "#{app_root}/app/assets/config/manifest.js"
assert_file "config/initializers/assets.rb"
assert_no_file "app/assets/config/manifest.js"
end
end

def test_app_update_does_not_generate_action_cable_contents_when_skip_action_cable_is_given
app_root = File.join(destination_root, "myapp")
run_generator [app_root, "--skip-action-cable"]
run_generator [destination_root, "--skip-action-cable"]

stub_rails_application(app_root) do
generator = Rails::Generators::AppGenerator.new ["rails"], { update: true, skip_action_cable: true }, { destination_root: app_root, shell: @shell }
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 "#{app_root}/config/cable.yml"
assert_file "#{app_root}/config/environments/production.rb" do |content|
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 "#{app_root}/test/channels/application_cable/connection_test.rb"
assert_no_file "test/channels/application_cable/connection_test.rb"
end
end

def test_app_update_does_not_generate_bootsnap_contents_when_skip_bootsnap_is_given
app_root = File.join(destination_root, "myapp")
run_generator [app_root, "--skip-bootsnap"]
run_generator [destination_root, "--skip-bootsnap"]

stub_rails_application(app_root) do
generator = Rails::Generators::AppGenerator.new ["rails"], { update: true, skip_bootsnap: true }, { destination_root: app_root, shell: @shell }
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 "#{app_root}/config/boot.rb" do |content|
assert_file "config/boot.rb" do |content|
assert_no_match(/require "bootsnap\/setup"/, content)
end
end
end

def test_app_update_preserves_skip_active_job
app_root = File.join(destination_root, "myapp")
run_generator [ app_root, "--skip-active-job" ]
run_generator [ destination_root, "--skip-active-job" ]

FileUtils.cd(app_root) do
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This test and the others like it are passing because the generator chdirs to its destination_root, rather than because setup does1. It would probably be better not to rely on that though.

If we want to clean up the cd blocks a bit, we could introduce an in_root helper method, like generators themselves have.

Alternatively, if we want to eliminate the cd blocks, we could introduce run_app_update and read_file helper methods (and maybe write_file for test_app_update_does_not_change_config_target_version). run_app_update would chdir as necessary, and read_file would simply File.expand_path with destination_root. That could be a follow-up PR, though.

Footnotes

  1. setup actually calls ensure_current_path, which chdirs to File.expand_path(Dir.pwd).

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") }
Expand All @@ -303,10 +293,9 @@ def test_app_update_preserves_skip_active_job
end

def test_app_update_preserves_skip_action_mailbox
app_root = File.join(destination_root, "myapp")
run_generator [ app_root, "--skip-action-mailbox" ]
run_generator [ destination_root, "--skip-action-mailbox" ]

FileUtils.cd(app_root) do
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") }
Expand All @@ -315,10 +304,9 @@ def test_app_update_preserves_skip_action_mailbox
end

def test_app_update_preserves_skip_action_text
app_root = File.join(destination_root, "myapp")
run_generator [ app_root, "--skip-action-text" ]
run_generator [ destination_root, "--skip-action-text" ]

FileUtils.cd(app_root) do
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") }
Expand All @@ -327,10 +315,9 @@ def test_app_update_preserves_skip_action_text
end

def test_app_update_preserves_skip_test
app_root = File.join(destination_root, "myapp")
run_generator [ app_root, "--skip-test" ]
run_generator [ destination_root, "--skip-test" ]

FileUtils.cd(app_root) do
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") }
Expand All @@ -339,12 +326,11 @@ def test_app_update_preserves_skip_test
end

def test_app_update_preserves_skip_system_test
app_root = File.join(destination_root, "myapp")
run_generator [ app_root, "--skip-system-test" ]
run_generator [ destination_root, "--skip-system-test" ]

FileUtils.cd(app_root) do
FileUtils.cd(destination_root) do
config = "config/application.rb"
assert_file "myapp/#{config}", /generators\.system_tests/
assert_file config, /generators\.system_tests/
assert_no_changes -> { File.readlines(config).grep(/generators\.system_tests/) } do
quietly { system("yes | bin/rails app:update") }
end
Expand All @@ -363,52 +349,50 @@ def test_gem_for_active_storage_when_skip_active_storage_is_given
end

def test_app_update_does_not_generate_active_storage_contents_when_skip_active_storage_is_given
app_root = File.join(destination_root, "myapp")
run_generator [app_root, "--skip-active-storage"]
run_generator [destination_root, "--skip-active-storage"]

stub_rails_application(app_root) do
generator = Rails::Generators::AppGenerator.new ["rails"], { update: true, skip_active_storage: true }, { destination_root: app_root, shell: @shell }
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 "#{app_root}/config/environments/development.rb" do |content|
assert_file "config/environments/development.rb" do |content|
assert_no_match(/config\.active_storage/, content)
end

assert_file "#{app_root}/config/environments/production.rb" do |content|
assert_file "config/environments/production.rb" do |content|
assert_no_match(/config\.active_storage/, content)
end

assert_file "#{app_root}/config/environments/test.rb" do |content|
assert_file "config/environments/test.rb" do |content|
assert_no_match(/config\.active_storage/, content)
end

assert_no_file "#{app_root}/config/storage.yml"
assert_no_file "config/storage.yml"
end
end

def test_app_update_does_not_generate_active_storage_contents_when_skip_active_record_is_given
app_root = File.join(destination_root, "myapp")
run_generator [app_root, "--skip-active-record"]
run_generator [destination_root, "--skip-active-record"]

stub_rails_application(app_root) do
generator = Rails::Generators::AppGenerator.new ["rails"], { update: true, skip_active_record: true }, { destination_root: app_root, shell: @shell }
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 "#{app_root}/config/environments/development.rb" do |content|
assert_file "config/environments/development.rb" do |content|
assert_no_match(/config\.active_storage/, content)
end

assert_file "#{app_root}/config/environments/production.rb" do |content|
assert_file "config/environments/production.rb" do |content|
assert_no_match(/config\.active_storage/, content)
end

assert_file "#{app_root}/config/environments/test.rb" do |content|
assert_file "config/environments/test.rb" do |content|
assert_no_match(/config\.active_storage/, content)
end

assert_no_file "#{app_root}/config/storage.yml"
assert_no_file "config/storage.yml"
end
end

Expand Down Expand Up @@ -443,17 +427,16 @@ def test_generator_skips_action_text_when_skip_active_storage_is_given
end

def test_app_update_does_not_change_config_target_version
app_root = File.join(destination_root, "myapp")
run_generator [ app_root ]
run_generator

FileUtils.cd(app_root) do
FileUtils.cd(destination_root) do
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

assert_file "#{app_root}/config/application.rb", /\s+config\.load_defaults 5\.1/
assert_file "config/application.rb", /\s+config\.load_defaults 5\.1/
end

def test_app_update_does_not_change_app_name_when_app_name_is_hyphenated_name
Expand Down