Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
# Mongoid association matchers for RSpec 2.x and 1.x
#
# Save this file to your spec/support directory
#
# Usage:
#
# describe User do
# it { should reference_one :profile }
# end
#
# describe Profile do
# it { should be_referenced_in :user }
# end
module Matchers
module Mongoid
module Associations
def reference_one(attr)
AssociationMatcher.new(attr, ::Mongoid::Associations::ReferencesOne)
end
def reference_many(attr)
AssociationMatcher.new(attr, ::Mongoid::Associations::ReferencesMany)
end
def be_referenced_in(attr)
AssociationMatcher.new(attr, ::Mongoid::Associations::ReferencedIn)
end
def embed_one(attr)
AssociationMatcher.new(attr, ::Mongoid::Associations::EmbedsOne)
end
def embed_many(attr)
AssociationMatcher.new(attr, ::Mongoid::Associations::EmbedMany)
end
def be_embedded_in(attr)
AssociationMatcher.new(attr, ::Mongoid::Associations::EmbeddedIn)
end
class AssociationMatcher
attr_accessor :attr, :association_type
def initialize(attr, association_type)
self.attr = attr.to_s
self.association_type = association_type
end
def matches?(subject)
@subject = subject
a = @subject.associations.select { |k,v| v.association == association_type }
a.detect { |k| k.first == attr } != nil
end
def description
"has #{humanized_association} association :#{attr}"
end
def failure_message_for_should
"\n#{humanized_association} association failure\nExpected: '#{attr}'"
end
private
def humanized_association
association_type.to_s.split('::').last
end
end
end
end
end
if defined?(RSpec) # RSpec 2.x
RSpec.configure do |config|
config.include(Matchers::Mongoid::Associations)
end
elsif defined?(Spec) # RSpec 1.x
Spec::Runner.configure do |config|
config.include(Matchers::Mongoid::Associations)
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment