thoughtbot--shoulda-matchers/spec/support/unit/change_value.rb

112 lines
2.0 KiB
Ruby

module UnitTests
class ChangeValue
def self.call(column_type, value, value_changer)
new(column_type, value, value_changer).call
end
def initialize(column_type, value, value_changer)
@column_type = column_type
@value = value
@value_changer = value_changer
end
def call
if value_changer.is_a?(Proc)
value_changer.call(value)
elsif respond_to?(value_changer, true)
send(value_changer)
else
value.public_send(value_changer)
end
end
protected
attr_reader :column_type, :value, :value_changer
private
def previous_value
if value.is_a?(String)
value[0..-2] + (value[-1].ord - 1).chr
else
value - 1
end
end
def next_value
if value.is_a?(Array)
value + [value.first.class.new]
elsif value.respond_to?(:next)
value.next
else
value + 1
end
end
def next_next_value
change_value(change_value(value, :next_value), :next_value)
end
def next_value_or_numeric_value
if value
change_value(value, :next_value)
else
change_value(value, :numeric_value)
end
end
def next_value_or_non_numeric_value
if value
change_value(value, :next_value)
else
change_value(value, :non_numeric_value)
end
end
def never_falsy
value || dummy_value_for_column
end
def truthy_or_numeric
value || 1
end
def never_blank
value.presence || dummy_value_for_column
end
def nil_to_blank
value || ''
end
def always_nil
nil
end
def add_character
"#{value}a"
end
def remove_character
value.chop
end
def numeric_value
'1'
end
def non_numeric_value
'a'
end
def change_value(value, value_changer)
self.class.call(column_type, value, value_changer)
end
def dummy_value_for_column
Shoulda::Matchers::Util.dummy_value_for(column_type)
end
end
end