diff --git a/lib/rails3-jquery-autocomplete.rb b/lib/rails3-jquery-autocomplete.rb index 6c30b61e..2a93a1bf 100644 --- a/lib/rails3-jquery-autocomplete.rb +++ b/lib/rails3-jquery-autocomplete.rb @@ -3,6 +3,7 @@ require 'rails3-jquery-autocomplete/formtastic_plugin' require 'rails3-jquery-autocomplete/orm/active_record' require 'rails3-jquery-autocomplete/orm/mongoid' +require 'rails3-jquery-autocomplete/orm/mongo_mapper' class ActionController::Base include Rails3JQueryAutocomplete::Autocomplete diff --git a/lib/rails3-jquery-autocomplete/orm/mongo_mapper.rb b/lib/rails3-jquery-autocomplete/orm/mongo_mapper.rb new file mode 100644 index 00000000..7fc17000 --- /dev/null +++ b/lib/rails3-jquery-autocomplete/orm/mongo_mapper.rb @@ -0,0 +1,30 @@ +module Rails3JQueryAutocomplete + module Orm + module MongoMapper + def get_autocomplete_order(method, options, model=nil) + order = options[:order] + if order + order.split(',').collect do |fields| + sfields = fields.split + [sfields[0].downcase.to_sym, sfields[1].downcase.to_sym] + end + else + [[method.to_sym, :asc]] + end + end + + def get_autocomplete_items(parameters) + model = parameters[:model] + method = parameters[:method] + options = parameters[:options] + is_full_search = options[:full] + term = parameters[:term] + limit = get_autocomplete_limit(options) + order = get_autocomplete_order(method, options) + + search = (is_full_search ? '.*' : '^') + term + '.*' + items = model.where(method.to_sym => /#{search}/i).limit(limit).sort(order) + end + end + end +end diff --git a/test/lib/rails3-jquery-autocomplete/orm/mongo_mapper_test.rb b/test/lib/rails3-jquery-autocomplete/orm/mongo_mapper_test.rb new file mode 100644 index 00000000..7c6f866c --- /dev/null +++ b/test/lib/rails3-jquery-autocomplete/orm/mongo_mapper_test.rb @@ -0,0 +1,60 @@ +require 'test_helper' + +module Rails3JQueryAutocomplete + module Orm + class MongoMapperTest < Test::Unit::TestCase + include Rails3JQueryAutocomplete::Orm::MongoMapper + + context "#get_autocomplete_order" do + context "order is specified" do + should 'returns the parametrized order for Mongoid' do + assert_equal [[:field, :asc], [:state, :desc]], + get_autocomplete_order(:method, :order => 'field ASC, state DESC') + end + end + + context 'order is not specified' do + should 'return the method ordered ASC by default' do + assert_equal [[:method, :asc]], + get_autocomplete_order(:method, {}) + end + end + end + + context "#get_autocomplete_items" do + setup do + @model = mock(Object) + + @parameters = { + :model => @model, + :method => :field, + :term => 'query', + :options => {:full => false} + } + mock(self).get_autocomplete_limit(anything) { 10 } + mock(self).get_autocomplete_order(anything, anything) { [[:order, :asc]] } + end + + context 'not a full search' do + should 'do stuff' do + mock(@model).where({:field=>/^query.*/i}).mock!.limit(10). + mock!.sort([[:order, :asc]]) + + get_autocomplete_items(@parameters) + end + end + + context 'full search' do + should 'return a full search query' do + @parameters[:options] = {:full => true} + + mock(@model).where({:field => /.*query.*/i}).mock!.limit(10). + mock!.sort([[:order, :asc]]) + + get_autocomplete_items(@parameters) + end + end + end + end + end +end