2014-01-23 18:07:36 +00:00
|
|
|
module Shoulda
|
2013-05-10 18:10:46 +00:00
|
|
|
module Matchers
|
2014-01-23 18:07:36 +00:00
|
|
|
# @private
|
2017-09-18 00:51:41 +00:00
|
|
|
module RailsShim
|
2017-09-17 19:33:33 +00:00
|
|
|
class << self
|
|
|
|
def action_pack_gte_4_1?
|
|
|
|
Gem::Requirement.new('>= 4.1').satisfied_by?(action_pack_version)
|
2014-04-20 02:48:43 +00:00
|
|
|
end
|
|
|
|
|
2017-01-09 12:31:46 +00:00
|
|
|
def action_pack_gte_5?
|
|
|
|
Gem::Requirement.new('>= 5').satisfied_by?(action_pack_version)
|
|
|
|
end
|
|
|
|
|
2017-09-18 00:51:41 +00:00
|
|
|
def action_pack_lt_5?
|
|
|
|
Gem::Requirement.new('< 5').satisfied_by?(action_pack_version)
|
|
|
|
end
|
|
|
|
|
2017-09-17 19:33:33 +00:00
|
|
|
def action_pack_version
|
|
|
|
Gem::Version.new(::ActionPack::VERSION::STRING)
|
2017-09-18 00:51:41 +00:00
|
|
|
rescue NameError
|
|
|
|
Gem::Version.new('0')
|
2017-09-17 19:33:33 +00:00
|
|
|
end
|
|
|
|
|
2017-10-02 05:19:03 +00:00
|
|
|
def active_record_gte_5?
|
|
|
|
Gem::Requirement.new('>= 5').satisfied_by?(active_record_version)
|
|
|
|
end
|
|
|
|
|
|
|
|
def active_record_version
|
|
|
|
Gem::Version.new(::ActiveRecord::VERSION::STRING)
|
2017-09-18 00:51:41 +00:00
|
|
|
rescue NameError
|
|
|
|
Gem::Version.new('0')
|
2014-12-24 21:46:49 +00:00
|
|
|
end
|
|
|
|
|
2017-09-17 19:33:33 +00:00
|
|
|
def generate_validation_message(
|
|
|
|
record,
|
|
|
|
attribute,
|
|
|
|
type,
|
|
|
|
model_name,
|
|
|
|
options
|
|
|
|
)
|
|
|
|
if record && record.errors.respond_to?(:generate_message)
|
|
|
|
record.errors.generate_message(attribute.to_sym, type, options)
|
|
|
|
else
|
|
|
|
simply_generate_validation_message(
|
|
|
|
attribute,
|
|
|
|
type,
|
|
|
|
model_name,
|
|
|
|
options,
|
2016-10-18 00:02:20 +00:00
|
|
|
)
|
2014-12-24 21:46:49 +00:00
|
|
|
end
|
2017-09-17 19:33:33 +00:00
|
|
|
rescue RangeError
|
|
|
|
simply_generate_validation_message(
|
|
|
|
attribute,
|
|
|
|
type,
|
|
|
|
model_name,
|
|
|
|
options,
|
|
|
|
)
|
2014-12-24 21:46:49 +00:00
|
|
|
end
|
|
|
|
|
2017-09-17 19:33:33 +00:00
|
|
|
def make_controller_request(context, verb, action, request_params)
|
|
|
|
params =
|
2017-01-09 12:31:46 +00:00
|
|
|
if action_pack_gte_5?
|
2017-09-17 19:33:33 +00:00
|
|
|
{ params: request_params }
|
|
|
|
else
|
|
|
|
request_params
|
|
|
|
end
|
|
|
|
|
|
|
|
context.__send__(verb, action, params)
|
2015-01-21 22:46:26 +00:00
|
|
|
end
|
|
|
|
|
2017-09-17 19:33:33 +00:00
|
|
|
def serialized_attributes_for(model)
|
|
|
|
if defined?(::ActiveRecord::Type::Serialized)
|
|
|
|
# Rails 5+
|
|
|
|
serialized_columns = model.columns.select do |column|
|
|
|
|
model.type_for_attribute(column.name).is_a?(
|
|
|
|
::ActiveRecord::Type::Serialized,
|
|
|
|
)
|
|
|
|
end
|
2015-01-21 22:46:26 +00:00
|
|
|
|
2017-09-17 19:33:33 +00:00
|
|
|
serialized_columns.inject({}) do |hash, column|
|
|
|
|
hash[column.name.to_s] = model.type_for_attribute(column.name).coder
|
|
|
|
hash
|
|
|
|
end
|
|
|
|
else
|
|
|
|
model.serialized_attributes
|
|
|
|
end
|
2016-06-28 15:43:41 +00:00
|
|
|
end
|
|
|
|
|
2017-09-17 19:33:33 +00:00
|
|
|
def type_cast_default_for(model, column)
|
|
|
|
if model.respond_to?(:column_defaults)
|
|
|
|
# Rails 4.2
|
|
|
|
model.column_defaults[column.name]
|
|
|
|
else
|
|
|
|
column.default
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
def tables_and_views(connection)
|
2017-10-02 05:19:03 +00:00
|
|
|
if active_record_gte_5?
|
2017-09-17 19:33:33 +00:00
|
|
|
connection.data_sources
|
|
|
|
else
|
|
|
|
connection.tables
|
|
|
|
end
|
|
|
|
end
|
2013-12-16 17:33:19 +00:00
|
|
|
|
2017-09-17 19:33:33 +00:00
|
|
|
def verb_for_update
|
|
|
|
if action_pack_gte_4_1?
|
|
|
|
:patch
|
|
|
|
else
|
|
|
|
:put
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2017-10-02 05:19:03 +00:00
|
|
|
def validation_message_key_for_association_required_option
|
|
|
|
if active_record_gte_5?
|
|
|
|
:required
|
|
|
|
else
|
|
|
|
:blank
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2019-03-21 05:24:02 +00:00
|
|
|
def parent_of(mod)
|
|
|
|
if mod.respond_to?(:module_parent)
|
|
|
|
mod.module_parent
|
|
|
|
else
|
|
|
|
mod.parent
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
def has_secure_password?(record, attribute_name)
|
|
|
|
if secure_password_module
|
|
|
|
attribute_name == :password &&
|
|
|
|
record.class.ancestors.include?(secure_password_module)
|
|
|
|
else
|
|
|
|
record.respond_to?("authenticate_#{attribute_name}")
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
def digestible_attributes_in(record)
|
|
|
|
record.methods.inject([]) do |array, method_name|
|
|
|
|
match = method_name.to_s.match(
|
|
|
|
/\A(\w+)_(?:confirmation|digest)=\Z/,
|
|
|
|
)
|
|
|
|
|
|
|
|
if match
|
|
|
|
array.concat([match[1].to_sym])
|
|
|
|
else
|
|
|
|
array
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
def secure_password_module
|
|
|
|
::ActiveModel::SecurePassword::InstanceMethodsOnActivation
|
|
|
|
rescue NameError
|
|
|
|
nil
|
|
|
|
end
|
|
|
|
|
2017-09-17 19:33:33 +00:00
|
|
|
private
|
|
|
|
|
|
|
|
def simply_generate_validation_message(
|
|
|
|
attribute,
|
|
|
|
type,
|
|
|
|
model_name,
|
|
|
|
options
|
|
|
|
)
|
|
|
|
default_translation_keys = [
|
2019-01-30 05:58:03 +00:00
|
|
|
:"activemodel.errors.models.#{model_name}.attributes.#{attribute}.#{type}",
|
|
|
|
:"activemodel.errors.models.#{model_name}.#{type}",
|
|
|
|
:"activemodel.errors.messages.#{type}",
|
|
|
|
:"activerecord.errors.models.#{model_name}.attributes.#{attribute}.#{type}",
|
2017-09-17 19:33:33 +00:00
|
|
|
:"activerecord.errors.models.#{model_name}.#{type}",
|
|
|
|
:"activerecord.errors.messages.#{type}",
|
|
|
|
:"errors.attributes.#{attribute}.#{type}",
|
|
|
|
:"errors.messages.#{type}",
|
|
|
|
]
|
2019-01-30 05:58:03 +00:00
|
|
|
primary_translation_key = default_translation_keys.shift
|
2017-09-17 19:33:33 +00:00
|
|
|
translate_options =
|
|
|
|
{ default: default_translation_keys }.merge(options)
|
|
|
|
I18n.translate(primary_translation_key, translate_options)
|
|
|
|
end
|
2014-04-20 02:48:43 +00:00
|
|
|
end
|
2013-05-10 18:10:46 +00:00
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|