From d256aeb26e5d8ae61eeea0eca321211b48d6898f Mon Sep 17 00:00:00 2001 From: Mani Tadayon Date: Thu, 14 Oct 2010 17:39:19 -0700 Subject: [PATCH] Fix bug with CanDefinition#tableized_conditions being used with Mongoid documents and add more specs for accesible_by with Mongoid. --- lib/cancan/mongoid_additions.rb | 5 +++-- spec/cancan/mongoid_additions_spec.rb | 27 +++++++++++++++++++++------ 2 files changed, 24 insertions(+), 8 deletions(-) diff --git a/lib/cancan/mongoid_additions.rb b/lib/cancan/mongoid_additions.rb index 31eb7d6..c49aa90 100644 --- a/lib/cancan/mongoid_additions.rb +++ b/lib/cancan/mongoid_additions.rb @@ -22,7 +22,7 @@ module CanCan end def conditions - @can_definitions.first.try(:tableized_conditions) + @can_definitions.first.instance_variable_get(:@conditions) end end @@ -82,7 +82,8 @@ module CanCan # Here only the articles which the user can update are returned. This # internally uses Ability#conditions method, see that for more information. def accessible_by(ability, action = :read) - query = ability.query(action, self) + query = ability.query(action, self) + if query.conditions.blank? # this query is sure to return no results # we need this so there is a Mongoid::Criteria object to return, since an empty array would cause problems diff --git a/spec/cancan/mongoid_additions_spec.rb b/spec/cancan/mongoid_additions_spec.rb index 9f8e423..5259567 100644 --- a/spec/cancan/mongoid_additions_spec.rb +++ b/spec/cancan/mongoid_additions_spec.rb @@ -58,11 +58,21 @@ describe CanCan::MongoidAdditions do @model_class.accessible_by(@ability, :read).should == [] end + it "should return the correct records based on the defined ability" do + @ability.can :read, @model_class, :title => "Sir" + sir = @model_class.create :title => 'Sir' + lord = @model_class.create :title => 'Lord' + dude = @model_class.create :title => 'Dude' + + @model_class.accessible_by(@ability, :read).should == [sir] + end + describe "Mongoid::Criteria where clause Symbol extensions using MongoDB expressions" do it "should handle :field.in" do obj = @model_class.create :title => 'Sir' @ability.can :read, @model_class, :title.in => ["Sir", "Madam"] @ability.can?(:read, obj).should == true + @model_class.accessible_by(@ability, :read).should == [obj] obj2 = @model_class.create :title => 'Lord' @ability.can?(:read, obj2).should == false @@ -72,7 +82,8 @@ describe CanCan::MongoidAdditions do obj = @model_class.create :title => 'Sir' @ability.can :read, @model_class, :title.nin => ["Lord", "Madam"] @ability.can?(:read, obj).should == true - + @model_class.accessible_by(@ability, :read).should == [obj] + obj2 = @model_class.create :title => 'Lord' @ability.can?(:read, obj2).should == false end @@ -81,7 +92,8 @@ describe CanCan::MongoidAdditions do obj = @model_class.create :titles => ['Palatin', 'Margrave'] @ability.can :read, @model_class, :titles.size => 2 @ability.can?(:read, obj).should == true - + @model_class.accessible_by(@ability, :read).should == [obj] + obj2 = @model_class.create :titles => ['Palatin', 'Margrave', 'Marquis'] @ability.can?(:read, obj2).should == false end @@ -90,7 +102,8 @@ describe CanCan::MongoidAdditions do obj = @model_class.create :titles => ['Palatin', 'Margrave'] @ability.can :read, @model_class, :titles.exists => true @ability.can?(:read, obj).should == true - + @model_class.accessible_by(@ability, :read).should == [obj] + obj2 = @model_class.create @ability.can?(:read, obj2).should == false end @@ -99,15 +112,17 @@ describe CanCan::MongoidAdditions do obj = @model_class.create :age => 50 @ability.can :read, @model_class, :age.gt => 45 @ability.can?(:read, obj).should == true - + @model_class.accessible_by(@ability, :read).should == [obj] + obj2 = @model_class.create :age => 40 @ability.can?(:read, obj2).should == false end end it "should call where with matching ability conditions" do - @ability.can :read, @model_class, :foo => {:bar => 1} - @model_class.accessible_by(@ability, :read).should == @model_class.where(:foos => { :bar => 1 }) + obj = @model_class.create :foo => {:bar => 1} + @ability.can :read, @model_class, :foo => {:bar => 1} + @model_class.accessible_by(@ability, :read).entries.first.should == obj end it "should not allow to fetch records when ability with just block present" do