diff --git a/docs/docs/going-further/other-notes.md b/docs/docs/going-further/other-notes.md index 68785bcb..a07441d2 100644 --- a/docs/docs/going-further/other-notes.md +++ b/docs/docs/going-further/other-notes.md @@ -266,7 +266,7 @@ end ```ruby Article.ransack(unknown_attr_eq: 'Ernie') -# ArgumentError (Invalid search term unknown_attr_eq) +# Ransack::InvalidSearchError (Invalid search term unknown_attr_eq) ``` As an alternative to setting a global configuration option, the `.ransack!` @@ -274,7 +274,7 @@ class method also raises an error if passed an unknown condition: ```ruby Article.ransack!(unknown_attr_eq: 'Ernie') -# ArgumentError: Invalid search term unknown_attr_eq +# Ransack::InvalidSearchError: Invalid search term unknown_attr_eq ``` This is equivalent to the `ignore_unknown_conditions` configuration option, diff --git a/lib/ransack/invalid_search_error.rb b/lib/ransack/invalid_search_error.rb new file mode 100644 index 00000000..dc57960c --- /dev/null +++ b/lib/ransack/invalid_search_error.rb @@ -0,0 +1,3 @@ +module Ransack + class InvalidSearchError < ArgumentError; end +end diff --git a/lib/ransack/nodes/condition.rb b/lib/ransack/nodes/condition.rb index af69c037..44e946a7 100644 --- a/lib/ransack/nodes/condition.rb +++ b/lib/ransack/nodes/condition.rb @@ -1,3 +1,5 @@ +require 'ransack/invalid_search_error' + module Ransack module Nodes class Condition < Node @@ -38,7 +40,7 @@ def extract_values_for_condition(key, context = nil) predicate = Predicate.named(name) unless predicate || Ransack.options[:ignore_unknown_conditions] - raise ArgumentError, "No valid predicate for #{key}" + raise InvalidSearchError, "No valid predicate for #{key}" end if context.present? diff --git a/lib/ransack/search.rb b/lib/ransack/search.rb index a8bf95f8..89634bb5 100644 --- a/lib/ransack/search.rb +++ b/lib/ransack/search.rb @@ -7,6 +7,7 @@ require 'ransack/nodes/grouping' require 'ransack/context' require 'ransack/naming' +require 'ransack/invalid_search_error' module Ransack class Search @@ -53,7 +54,7 @@ def build(params) elsif base.attribute_method?(key) base.send("#{key}=", value) elsif !Ransack.options[:ignore_unknown_conditions] || !@ignore_unknown_conditions - raise ArgumentError, "Invalid search term #{key}" + raise InvalidSearchError, "Invalid search term #{key}" end end self @@ -78,7 +79,7 @@ def sorts=(args) when String self.sorts = [args] else - raise ArgumentError, + raise InvalidSearchError, "Invalid argument (#{args.class}) supplied to sorts=" end end diff --git a/spec/ransack/adapters/active_record/base_spec.rb b/spec/ransack/adapters/active_record/base_spec.rb index d41cd6d0..a6b10cfa 100644 --- a/spec/ransack/adapters/active_record/base_spec.rb +++ b/spec/ransack/adapters/active_record/base_spec.rb @@ -131,10 +131,14 @@ module ActiveRecord expect { Person.ransack('') }.to_not raise_error end - it 'raises exception if ransack! called with unknown condition' do + it 'raises ArgumentError exception if ransack! called with unknown condition' do expect { Person.ransack!(unknown_attr_eq: 'Ernie') }.to raise_error(ArgumentError) end + it 'raises InvalidSearchError exception if ransack! called with unknown condition' do + expect { Person.ransack!(unknown_attr_eq: 'Ernie') }.to raise_error(InvalidSearchError) + end + it 'does not modify the parameters' do params = { name_eq: '' } expect { Person.ransack(params) }.not_to change { params } diff --git a/spec/ransack/nodes/condition_spec.rb b/spec/ransack/nodes/condition_spec.rb index 29596cac..e693dacb 100644 --- a/spec/ransack/nodes/condition_spec.rb +++ b/spec/ransack/nodes/condition_spec.rb @@ -64,6 +64,7 @@ module Nodes end specify { expect { subject }.to raise_error ArgumentError } + specify { expect { subject }.to raise_error InvalidSearchError } end context "when ignore_unknown_conditions is true" do diff --git a/spec/ransack/search_spec.rb b/spec/ransack/search_spec.rb index 6426a20a..ed3c4c50 100644 --- a/spec/ransack/search_spec.rb +++ b/spec/ransack/search_spec.rb @@ -270,6 +270,7 @@ module Ransack end specify { expect { subject }.to raise_error ArgumentError } + specify { expect { subject }.to raise_error InvalidSearchError } end context 'when ignore_unknown_conditions configuration option is true' do @@ -300,6 +301,7 @@ module Ransack context 'when ignore_unknown_conditions search parameter is false' do specify { expect { with_ignore_unknown_conditions_false }.to raise_error ArgumentError } + specify { expect { with_ignore_unknown_conditions_false }.to raise_error InvalidSearchError } end context 'when ignore_unknown_conditions search parameter is true' do @@ -614,6 +616,18 @@ def remove_quotes_and_backticks(str) expect(@s.result.first.id).to eq 1 end + it 'raises ArgumentError when an invalid argument is sent' do + expect do + @s.sorts = 1234 + end.to raise_error(ArgumentError, "Invalid argument (Integer) supplied to sorts=") + end + + it 'raises InvalidSearchError when an invalid argument is sent' do + expect do + @s.sorts = 1234 + end.to raise_error(Ransack::InvalidSearchError, "Invalid argument (Integer) supplied to sorts=") + end + it "PG's sort option", if: ::ActiveRecord::Base.connection.adapter_name == "PostgreSQL" do default = Ransack.options.clone