1
0
Fork 0
mirror of https://github.com/rails/rails.git synced 2022-11-09 12:12:34 -05:00
rails--rails/railties/test/application/generators_test.rb
yuuji.yaginuma 6fec4c3a0a Add skip-collision-check option to generator
Until Rails 5.2, generators can run same name multi times without destroying.
But Rails 6.0(with Zeitwerk) can't this. In Rails 6.0, an error occurs
due to class name collision check.

The check uses `const_defined?`, which assumes that the autoload object
is also defined.
https://ruby-doc.org/core-2.6.3/Module.html#method-i-const_defined-3F

It did not work until Rails 5.2, but Zeitwerk seems to be able to
correctly check this against the application's code.

However, this is a little inconvenient if want to run the generator
again like mistake an attribute name(need to run `destoy` before).

In order to solve this, this PR adds an option to skip the collision check.
With this option, you can overwrite files just as did until Rails 5.2.
2019-07-05 18:55:47 +09:00

212 lines
6.8 KiB
Ruby

# frozen_string_literal: true
require "isolation/abstract_unit"
module ApplicationTests
class GeneratorsTest < ActiveSupport::TestCase
include ActiveSupport::Testing::Isolation
def setup
build_app
end
def teardown
teardown_app
end
def app_const
@app_const ||= Class.new(Rails::Application)
end
def with_config
require "rails/all"
require "rails/generators"
yield app_const.config
end
def with_bare_config
require "rails"
require "rails/generators"
yield app_const.config
end
test "allow running plugin new generator inside Rails app directory" do
rails "plugin", "new", "vendor/plugins/bukkits"
assert File.exist?(File.join(rails_root, "vendor/plugins/bukkits/test/dummy/config/application.rb"))
end
test "generators default values" do
with_bare_config do |c|
assert_equal(true, c.generators.colorize_logging)
assert_equal({}, c.generators.aliases)
assert_equal({}, c.generators.options)
assert_equal({}, c.generators.fallbacks)
end
end
test "generators set rails options" do
with_bare_config do |c|
c.generators.orm = :data_mapper
c.generators.test_framework = :rspec
c.generators.helper = false
expected = { rails: { orm: :data_mapper, test_framework: :rspec, helper: false } }
assert_equal(expected, c.generators.options)
end
end
test "generators set rails aliases" do
with_config do |c|
c.generators.aliases = { rails: { test_framework: "-w" } }
expected = { rails: { test_framework: "-w" } }
assert_equal expected, c.generators.aliases
end
end
test "generators aliases, options, templates and fallbacks on initialization" do
add_to_config <<-RUBY
config.generators.rails aliases: { test_framework: "-w" }
config.generators.orm :data_mapper
config.generators.test_framework :rspec
config.generators.fallbacks[:shoulda] = :test_unit
config.generators.templates << "some/where"
RUBY
# Initialize the application
require "#{app_path}/config/environment"
Rails.application.load_generators
assert_equal :rspec, Rails::Generators.options[:rails][:test_framework]
assert_equal "-w", Rails::Generators.aliases[:rails][:test_framework]
assert_equal Hash[shoulda: :test_unit], Rails::Generators.fallbacks
assert_equal ["some/where"], Rails::Generators.templates_path
end
test "generators no color on initialization" do
add_to_config <<-RUBY
config.generators.colorize_logging = false
RUBY
# Initialize the application
require "#{app_path}/config/environment"
Rails.application.load_generators
assert_equal Thor::Base.shell, Thor::Shell::Basic
end
test "generators with hashes for options and aliases" do
with_bare_config do |c|
c.generators do |g|
g.orm :data_mapper, migration: false
g.plugin aliases: { generator: "-g" },
generator: true
end
expected = {
rails: { orm: :data_mapper },
plugin: { generator: true },
data_mapper: { migration: false }
}
assert_equal expected, c.generators.options
assert_equal({ plugin: { generator: "-g" } }, c.generators.aliases)
end
end
test "generators with string and hash for options should generate symbol keys" do
with_bare_config do |c|
c.generators do |g|
g.orm "data_mapper", migration: false
end
expected = {
rails: { orm: :data_mapper },
data_mapper: { migration: false }
}
assert_equal expected, c.generators.options
end
end
test "api only generators hide assets, helper, js and css namespaces and set api option" do
add_to_config <<-RUBY
config.api_only = true
RUBY
# Initialize the application
require "#{app_path}/config/environment"
Rails.application.load_generators
assert_includes Rails::Generators.hidden_namespaces, "assets"
assert_includes Rails::Generators.hidden_namespaces, "helper"
assert_includes Rails::Generators.hidden_namespaces, "js"
assert_includes Rails::Generators.hidden_namespaces, "css"
assert Rails::Generators.options[:rails][:api]
assert_equal false, Rails::Generators.options[:rails][:assets]
assert_equal false, Rails::Generators.options[:rails][:helper]
assert_nil Rails::Generators.options[:rails][:template_engine]
end
test "api only generators allow overriding generator options" do
add_to_config <<-RUBY
config.generators.helper = true
config.api_only = true
config.generators.template_engine = :my_template
RUBY
# Initialize the application
require "#{app_path}/config/environment"
Rails.application.load_generators
assert Rails::Generators.options[:rails][:api]
assert Rails::Generators.options[:rails][:helper]
assert_equal :my_template, Rails::Generators.options[:rails][:template_engine]
end
test "api only generator generate mailer views" do
add_to_config <<-RUBY
config.api_only = true
RUBY
rails "generate", "mailer", "notifier", "foo"
assert File.exist?(File.join(rails_root, "app/views/notifier_mailer/foo.text.erb"))
assert File.exist?(File.join(rails_root, "app/views/notifier_mailer/foo.html.erb"))
end
test "ARGV is mutated as expected" do
require "#{app_path}/config/environment"
require "rails/command"
Rails::Command.const_set("APP_PATH", "rails/all")
FileUtils.cd(rails_root) do
ARGV = ["mailer", "notifier", "foo"]
Rails::Command.const_set("ARGV", ARGV)
quietly { Rails::Command.invoke :generate, ARGV }
assert_equal ["notifier", "foo"], ARGV
end
Rails::Command.send(:remove_const, "APP_PATH")
end
test "help does not show hidden namespaces and hidden commands" do
FileUtils.cd(rails_root) do
output = rails("generate", "--help")
assert_no_match "active_record:migration", output
assert_no_match "credentials", output
output = rails("destroy", "--help")
assert_no_match "active_record:migration", output
end
end
test "skip collision check" do
rails("generate", "model", "post", "title:string")
output = rails("generate", "model", "post", "title:string", "body:string")
assert_match(/The name 'Post' is either already used in your application or reserved/, output)
output = rails("generate", "model", "post", "title:string", "body:string", "--skip-collision-check")
assert_no_match(/The name 'Post' is either already used in your application or reserved/, output)
end
end
end