diff --git a/lib/valkyrie/persistence/custom_query_container.rb b/lib/valkyrie/persistence/custom_query_container.rb index cbfe85e0..35173ab6 100644 --- a/lib/valkyrie/persistence/custom_query_container.rb +++ b/lib/valkyrie/persistence/custom_query_container.rb @@ -47,7 +47,11 @@ def register_query_handler(query_handler) end def method_missing(meth_name, *args, &block) - query_handler = find_query_handler(meth_name).new(query_service: query_service) + handler_class = + find_query_handler(meth_name) || + raise(NoMethodError, "Custom query #{meth_name} is not registered. The registered queries are: #{queries}") + + query_handler = handler_class.new(query_service: query_service) return super unless query_handler query_handler.__send__(meth_name, *args, &block) end @@ -59,5 +63,11 @@ def find_query_handler(method) def respond_to_missing?(meth_name, _args) find_query_handler(meth_name).present? end + + private + + def queries + query_handlers.map(&:queries).flatten + end end end diff --git a/lib/valkyrie/specs/shared_specs/queries.rb b/lib/valkyrie/specs/shared_specs/queries.rb index c86e3a36..ac1ca76b 100644 --- a/lib/valkyrie/specs/shared_specs/queries.rb +++ b/lib/valkyrie/specs/shared_specs/queries.rb @@ -464,6 +464,13 @@ class Valkyrie::Specs::ChildWithOrderedParents < Valkyrie::Resource end end + describe ".custom_queries" do + it "raises NoMethodError when the custom query does not exist" do + expect(query_service.custom_queries).not_to respond_to :very_fake_query + expect { query_service.custom_queries.very_fake_query }.to raise_error(NoMethodError) + end + end + describe ".register_query_handler" do it "can register a query handler" do class QueryHandler