module Mongoid module Matchers class HaveIndexForMatcher # :nodoc: def initialize(index_fields) @index_fields = index_fields.symbolize_keys! end def with_options(options = { }) @options = options self end def matches?(klass) @klass = klass.is_a?(Class) ? klass : klass.class @errors = [] unless @klass.index_options[@index_fields] @errors.push "no index for #{@index_fields}" else if !@options.nil? && !@options.empty? @options.each do |option, option_value| if denormalising_options(@klass.index_options[@index_fields])[option] != option_value @errors.push "index for #{@index_fields.inspect} with options of #{@klass.index_options[@index_fields].inspect}" end end end end @errors.empty? end def failure_message_for_should "Expected #{@klass.inspect} to #{description}, got #{@errors.to_sentence}" end def failure_message_for_should_not "Expected #{@klass.inspect} to not #{description}, got #{@klass.inspect} to #{description}" end alias :failure_message :failure_message_for_should alias :failure_message_when_negated :failure_message_for_should_not def description desc = "have an index for #{@index_fields.inspect}" desc << " with options of #{@options.inspect}" if @options desc end private MAPPINGS = { dropDups: :drop_dups } def denormalising_options(opts) options = {} opts.each_pair do |option, value| options[MAPPINGS[option] || option] = value end options end end def have_index_for(index_fields) HaveIndexForMatcher.new(index_fields) end end end