diff --git a/lib/active_interaction/filters/abstract_date_time_filter.rb b/lib/active_interaction/filters/abstract_date_time_filter.rb index 5a678d58..df897d48 100644 --- a/lib/active_interaction/filters/abstract_date_time_filter.rb +++ b/lib/active_interaction/filters/abstract_date_time_filter.rb @@ -51,7 +51,7 @@ def convert_string(value) else klass.parse(value) || value end - rescue ArgumentError + rescue ArgumentError, TypeError value end diff --git a/lib/active_interaction/filters/abstract_numeric_filter.rb b/lib/active_interaction/filters/abstract_numeric_filter.rb index b1965984..5173255d 100644 --- a/lib/active_interaction/filters/abstract_numeric_filter.rb +++ b/lib/active_interaction/filters/abstract_numeric_filter.rb @@ -44,7 +44,7 @@ def converter(value) def safe_converter(value) converter(value) - rescue ArgumentError + rescue ArgumentError, TypeError value end end diff --git a/spec/active_interaction/filters/date_filter_spec.rb b/spec/active_interaction/filters/date_filter_spec.rb index 20e92882..4dbfd0ff 100644 --- a/spec/active_interaction/filters/date_filter_spec.rb +++ b/spec/active_interaction/filters/date_filter_spec.rb @@ -75,6 +75,22 @@ def to_str end end + context 'with a #to_str that returns a non-String' do + let(:value) do + Class.new do + def to_str + :not_a_string + end + end.new + end + + it 'returns a filter error instead of raising TypeError' do + expect { result }.not_to raise_error + expect(result.errors.first).to be_an_instance_of ActiveInteraction::Filter::Error + expect(result.errors.first.type).to be :invalid_type + end + end + context 'with a blank String' do let(:value) do Class.new do diff --git a/spec/active_interaction/filters/integer_filter_spec.rb b/spec/active_interaction/filters/integer_filter_spec.rb index 49428ffc..c32019c3 100644 --- a/spec/active_interaction/filters/integer_filter_spec.rb +++ b/spec/active_interaction/filters/integer_filter_spec.rb @@ -54,6 +54,22 @@ def to_str end end + context 'with a #to_str that returns a non-String' do + let(:value) do + Class.new do + def to_str + :not_a_string + end + end.new + end + + it 'returns a filter error instead of raising TypeError' do + expect { result }.not_to raise_error + expect(result.errors.first).to be_an_instance_of ActiveInteraction::Filter::Error + expect(result.errors.first.type).to be :invalid_type + end + end + context 'with a blank String' do let(:value) do Class.new do