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/generators/generated_attribute_test.rb
Petrik 76f9b7531f Generators should raise an error if an attribute has an invalid index type
When passing an invalid index type to a generator, the index is silently
ignored. For example when misspelling the index:

    bin/rails g model post title:string:indxe

Instead of silently ignoring the invalid index, the generator should
raise an error.

This continues the work in d163fcd620
where we started raising errors if the attribute types are invalid.
2021-07-04 19:13:24 +02:00

199 lines
6.1 KiB
Ruby

# frozen_string_literal: true
require "generators/generators_test_helper"
require "rails/generators/generated_attribute"
require "rails/generators/base"
class GeneratedAttributeTest < Rails::Generators::TestCase
include GeneratorsTestHelper
def setup
@old_belongs_to_required_by_default = Rails.application.config.active_record.belongs_to_required_by_default
Rails.application.config.active_record.belongs_to_required_by_default = true
ActiveRecord::Base.establish_connection(adapter: "sqlite3", database: ":memory:")
end
def teardown
Rails.application.config.active_record.belongs_to_required_by_default = @old_belongs_to_required_by_default
end
def test_field_type_returns_number_field
assert_field_type :integer, :number_field
end
def test_field_type_returns_text_field
%w(float decimal string).each do |attribute_type|
assert_field_type attribute_type, :text_field
end
end
def test_field_type_returns_datetime_select
%w(datetime timestamp).each do |attribute_type|
assert_field_type attribute_type, :datetime_select
end
end
def test_field_type_returns_time_select
assert_field_type :time, :time_select
end
def test_field_type_returns_date_select
assert_field_type :date, :date_select
end
def test_field_type_returns_text_area
assert_field_type :text, :text_area
end
def test_field_type_returns_check_box
assert_field_type :boolean, :check_box
end
def test_field_type_returns_rich_text_area
assert_field_type :rich_text, :rich_text_area
end
def test_field_type_returns_file_field
%w(attachment attachments).each do |attribute_type|
assert_field_type attribute_type, :file_field
end
end
def test_field_type_with_unknown_type_raises_error
field_type = :unknown
e = assert_raise Rails::Generators::Error do
create_generated_attribute field_type
end
message = "Could not generate field 'test' with unknown type 'unknown'"
assert_match message, e.message
end
def test_field_type_with_unknown_index_type_raises_error
index_type = :unknown
e = assert_raise Rails::Generators::Error do
create_generated_attribute "string", "name", index_type
end
message = "Could not generate field 'name' with unknown index 'unknown'"
assert_match message, e.message
end
def test_default_value_is_integer
assert_field_default_value :integer, 1
end
def test_default_value_is_float
assert_field_default_value :float, 1.5
end
def test_default_value_is_decimal
assert_field_default_value :decimal, "9.99"
end
def test_default_value_is_datetime
%w(datetime timestamp time).each do |attribute_type|
assert_field_default_value attribute_type, Time.now.to_s(:db)
end
end
def test_default_value_is_date
assert_field_default_value :date, Date.today.to_s(:db)
end
def test_default_value_is_string
assert_field_default_value :string, "MyString"
end
def test_default_value_for_type
att = Rails::Generators::GeneratedAttribute.parse("type:string")
assert_equal("", att.default)
end
def test_default_value_is_text
assert_field_default_value :text, "MyText"
end
def test_default_value_is_boolean
assert_field_default_value :boolean, false
end
def test_default_value_is_nil
%w(references belongs_to rich_text attachment attachments).each do |attribute_type|
assert_field_default_value attribute_type, nil
end
end
def test_default_value_is_empty_string
%w(digest token).each do |attribute_type|
assert_field_default_value attribute_type, ""
end
end
def test_human_name
assert_equal(
"Full name",
create_generated_attribute(:string, "full_name").human_name
)
end
def test_reference_is_true
%w(references belongs_to).each do |attribute_type|
assert_predicate create_generated_attribute(attribute_type), :reference?
end
end
def test_reference_is_false
%w(string text float).each do |attribute_type|
assert_not_predicate create_generated_attribute(attribute_type), :reference?
end
end
def test_polymorphic_reference_is_true
%w(references belongs_to).each do |attribute_type|
assert_predicate create_generated_attribute("#{attribute_type}{polymorphic}"), :polymorphic?
end
end
def test_polymorphic_reference_is_false
%w(references belongs_to).each do |attribute_type|
assert_not_predicate create_generated_attribute(attribute_type), :polymorphic?
end
end
def test_blank_type_defaults_to_string
assert_equal :string, create_generated_attribute(nil, "title").type
assert_equal :string, create_generated_attribute("", "title").type
end
def test_handles_index_names_for_references
assert_equal "post", create_generated_attribute("string", "post").index_name
assert_equal "post_id", create_generated_attribute("references", "post").index_name
assert_equal "post_id", create_generated_attribute("belongs_to", "post").index_name
assert_equal ["post_id", "post_type"], create_generated_attribute("references{polymorphic}", "post").index_name
end
def test_handles_column_names_for_references
assert_equal "post", create_generated_attribute("string", "post").column_name
assert_equal "post_id", create_generated_attribute("references", "post").column_name
assert_equal "post_id", create_generated_attribute("belongs_to", "post").column_name
end
def test_parse_works_with_adapter_specific_types
att = Rails::Generators::GeneratedAttribute.parse("document:json")
assert_equal "document", att.name
assert_equal :json, att.type
end
def test_parse_required_attribute_with_index
att = Rails::Generators::GeneratedAttribute.parse("supplier:references:index")
assert_equal "supplier", att.name
assert_equal :references, att.type
assert_predicate att, :has_index?
assert_predicate att, :required?
end
def test_parse_required_attribute_with_index_false_when_belongs_to_required_by_default_global_config_is_false
Rails.application.config.active_record.belongs_to_required_by_default = false
att = Rails::Generators::GeneratedAttribute.parse("supplier:references:index")
assert_not_predicate att, :required?
end
end