moving model adapter specs into their own directory with MODEL_ADAPTER environment variable for choosing which one to run
This commit is contained in:
		
							parent
							
								
									5183113d2d
								
							
						
					
					
						commit
						f9a498d2fc
					
				@ -1,75 +0,0 @@
 | 
				
			|||||||
require "spec_helper"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
describe CanCan::ActiveRecordAdditions do
 | 
					 | 
				
			||||||
  before(:each) do
 | 
					 | 
				
			||||||
    @model_class = Class.new(Project)
 | 
					 | 
				
			||||||
    stub(@model_class).scoped { :scoped_stub }
 | 
					 | 
				
			||||||
    @model_class.send(:include, CanCan::ActiveRecordAdditions)
 | 
					 | 
				
			||||||
    @ability = Object.new
 | 
					 | 
				
			||||||
    @ability.extend(CanCan::Ability)
 | 
					 | 
				
			||||||
  end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  it "should call where('true=false') when no ability is defined so no records are found" do
 | 
					 | 
				
			||||||
    stub(@model_class).joins { true } # just so it responds to .joins as well
 | 
					 | 
				
			||||||
    stub(@model_class).where('true=false').stub!.joins(nil) { :no_match }
 | 
					 | 
				
			||||||
    @model_class.accessible_by(@ability, :read).should == :no_match
 | 
					 | 
				
			||||||
  end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  it "should call where with matching ability conditions" do
 | 
					 | 
				
			||||||
    @ability.can :read, @model_class, :foo => {:bar => 1}
 | 
					 | 
				
			||||||
    stub(@model_class).joins { true } # just so it responds to .joins as well
 | 
					 | 
				
			||||||
    stub(@model_class).where(:foos => { :bar => 1 }).stub!.joins([:foo]) { :found_records }
 | 
					 | 
				
			||||||
    @model_class.accessible_by(@ability, :read).should == :found_records
 | 
					 | 
				
			||||||
  end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  it "should default to :read ability and use scoped when where isn't available" do
 | 
					 | 
				
			||||||
    @ability.can :read, @model_class, :foo => {:bar => 1}
 | 
					 | 
				
			||||||
    stub(@model_class).scoped(:conditions => {:foos => {:bar => 1}}, :joins => [:foo]) { :found_records }
 | 
					 | 
				
			||||||
    @model_class.accessible_by(@ability).should == :found_records
 | 
					 | 
				
			||||||
  end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  it "should merge association joins and sanitize conditions" do
 | 
					 | 
				
			||||||
    @ability.can :read, @model_class, :foo => {:bar => 1}
 | 
					 | 
				
			||||||
    @ability.can :read, @model_class, :too => {:car => 1, :far => {:bar => 1}}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    condition_variants = [
 | 
					 | 
				
			||||||
        '(toos.fars.bar=1 AND toos.car=1) OR (foos.bar=1)', # faked sql sanitizer is stupid ;-)
 | 
					 | 
				
			||||||
        '(toos.car=1 AND toos.fars.bar=1) OR (foos.bar=1)'
 | 
					 | 
				
			||||||
    ]
 | 
					 | 
				
			||||||
    joins_variants = [
 | 
					 | 
				
			||||||
        [:foo, {:too => [:far]}],
 | 
					 | 
				
			||||||
        [{:too => [:far]}, :foo]
 | 
					 | 
				
			||||||
    ]
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    condition_variants.each do |condition|
 | 
					 | 
				
			||||||
      joins_variants.each do |joins|
 | 
					 | 
				
			||||||
        stub(@model_class).scoped( :conditions => condition, :joins => joins ) { :found_records }
 | 
					 | 
				
			||||||
      end
 | 
					 | 
				
			||||||
    end
 | 
					 | 
				
			||||||
    # @ability.conditions(:read, @model_class).should == '(too.car=1 AND too.far.bar=1) OR (foo.bar=1)'
 | 
					 | 
				
			||||||
    # @ability.associations_hash(:read, @model_class).should == [{:too => [:far]}, :foo]
 | 
					 | 
				
			||||||
    @model_class.accessible_by(@ability).should == :found_records
 | 
					 | 
				
			||||||
  end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  it "should allow to define sql conditions by not hash" do
 | 
					 | 
				
			||||||
    @ability.can :read, @model_class, :foo => 1
 | 
					 | 
				
			||||||
    @ability.can :read, @model_class, ['bar = ?', 1]
 | 
					 | 
				
			||||||
    stub(@model_class).scoped( :conditions => '(bar = 1) OR (foo=1)', :joins => nil ) { :found_records }
 | 
					 | 
				
			||||||
    stub(@model_class).scoped{|*args| args.inspect}
 | 
					 | 
				
			||||||
    @model_class.accessible_by(@ability).should == :found_records
 | 
					 | 
				
			||||||
  end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  it "should not allow to fetch records when ability with just block present" do
 | 
					 | 
				
			||||||
    @ability.can :read, @model_class do false end
 | 
					 | 
				
			||||||
    lambda {
 | 
					 | 
				
			||||||
      @model_class.accessible_by(@ability)
 | 
					 | 
				
			||||||
    }.should raise_error(CanCan::Error)
 | 
					 | 
				
			||||||
  end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  it "should not allow to check ability on object when nonhash sql ability definition without block present" do
 | 
					 | 
				
			||||||
    @ability.can :read, @model_class, ['bar = ?', 1]
 | 
					 | 
				
			||||||
    lambda {
 | 
					 | 
				
			||||||
      @ability.can? :read, @model_class.new
 | 
					 | 
				
			||||||
    }.should raise_error(CanCan::Error)
 | 
					 | 
				
			||||||
  end
 | 
					 | 
				
			||||||
end
 | 
					 | 
				
			||||||
@ -1,59 +0,0 @@
 | 
				
			|||||||
require "spec_helper"
 | 
					 | 
				
			||||||
require 'cancan/data_mapper_additions'
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
describe CanCan::DataMapperAdditions do
 | 
					 | 
				
			||||||
  before(:each) do
 | 
					 | 
				
			||||||
    @model_class = Class.new
 | 
					 | 
				
			||||||
    @model_class.class_eval do
 | 
					 | 
				
			||||||
      include DataMapper::Resource
 | 
					 | 
				
			||||||
    end
 | 
					 | 
				
			||||||
    stub(@model_class).all(:conditions => ['true=false']) { 'no-match:' }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    @ability = Object.new
 | 
					 | 
				
			||||||
    @ability.extend(CanCan::Ability)
 | 
					 | 
				
			||||||
  end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  it "should return no records when no ability is defined so no records are found" do
 | 
					 | 
				
			||||||
    @model_class.accessible_by(@ability, :read).should == 'no-match:'
 | 
					 | 
				
			||||||
  end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  it "should call all with matching ability conditions" do
 | 
					 | 
				
			||||||
    @ability.can :read, @model_class, :foo => {:bar => 1}
 | 
					 | 
				
			||||||
    stub(@model_class).all(:conditions => {:foo => {:bar => 1}}) { 'found-records:' }
 | 
					 | 
				
			||||||
    @model_class.accessible_by(@ability, :read).should == 'no-match:found-records:'
 | 
					 | 
				
			||||||
  end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  it "should merge association joins and sanitize conditions" do
 | 
					 | 
				
			||||||
    @ability.can :read, @model_class, :foo => {:bar => 1}
 | 
					 | 
				
			||||||
    @ability.can :read, @model_class, :too => {:car => 1, :far => {:bar => 1}}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    stub(@model_class).all(:conditions => {:foo => {:bar => 1}}) { 'foo:' }
 | 
					 | 
				
			||||||
    stub(@model_class).all(:conditions => {:too => {:car => 1, :far => {:bar => 1}}}) { 'too:' }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    @model_class.accessible_by(@ability).should == 'no-match:too:foo:'
 | 
					 | 
				
			||||||
  end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  it "should allow to define sql conditions by not hash" do
 | 
					 | 
				
			||||||
    @ability.can :read, @model_class, :foo => 1
 | 
					 | 
				
			||||||
    @ability.can :read, @model_class, ['bar = ?', 1]
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    stub(@model_class).all(:conditions => {:foo => 1}) { 'foo:' }
 | 
					 | 
				
			||||||
    stub(@model_class).all(:conditions => ['bar = ?', 1]) { 'bar:' }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    @model_class.accessible_by(@ability).should == 'no-match:bar:foo:'
 | 
					 | 
				
			||||||
  end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  it "should not allow to fetch records when ability with just block present" do
 | 
					 | 
				
			||||||
    @ability.can :read, @model_class do false end
 | 
					 | 
				
			||||||
    lambda {
 | 
					 | 
				
			||||||
      @model_class.accessible_by(@ability)
 | 
					 | 
				
			||||||
    }.should raise_error(CanCan::Error)
 | 
					 | 
				
			||||||
  end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  it "should not allow to check ability on object when nonhash sql ability definition without block present" do
 | 
					 | 
				
			||||||
    @ability.can :read, @model_class, ['bar = ?', 1]
 | 
					 | 
				
			||||||
    lambda {
 | 
					 | 
				
			||||||
      @ability.can? :read, @model_class.new
 | 
					 | 
				
			||||||
    }.should raise_error(CanCan::Error)
 | 
					 | 
				
			||||||
  end
 | 
					 | 
				
			||||||
end
 | 
					 | 
				
			||||||
							
								
								
									
										77
									
								
								spec/cancan/model_adapters/active_record_adapter_spec.rb
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										77
									
								
								spec/cancan/model_adapters/active_record_adapter_spec.rb
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,77 @@
 | 
				
			|||||||
 | 
					if ENV["MODEL_ADAPTER"].nil? || ENV["MODEL_ADAPTER"] == "active_record"
 | 
				
			||||||
 | 
					  require "spec_helper"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  describe CanCan::ActiveRecordAdditions do
 | 
				
			||||||
 | 
					    before(:each) do
 | 
				
			||||||
 | 
					      @model_class = Class.new(Project)
 | 
				
			||||||
 | 
					      stub(@model_class).scoped { :scoped_stub }
 | 
				
			||||||
 | 
					      @model_class.send(:include, CanCan::ActiveRecordAdditions)
 | 
				
			||||||
 | 
					      @ability = Object.new
 | 
				
			||||||
 | 
					      @ability.extend(CanCan::Ability)
 | 
				
			||||||
 | 
					    end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    it "should call where('true=false') when no ability is defined so no records are found" do
 | 
				
			||||||
 | 
					      stub(@model_class).joins { true } # just so it responds to .joins as well
 | 
				
			||||||
 | 
					      stub(@model_class).where('true=false').stub!.joins(nil) { :no_match }
 | 
				
			||||||
 | 
					      @model_class.accessible_by(@ability, :read).should == :no_match
 | 
				
			||||||
 | 
					    end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    it "should call where with matching ability conditions" do
 | 
				
			||||||
 | 
					      @ability.can :read, @model_class, :foo => {:bar => 1}
 | 
				
			||||||
 | 
					      stub(@model_class).joins { true } # just so it responds to .joins as well
 | 
				
			||||||
 | 
					      stub(@model_class).where(:foos => { :bar => 1 }).stub!.joins([:foo]) { :found_records }
 | 
				
			||||||
 | 
					      @model_class.accessible_by(@ability, :read).should == :found_records
 | 
				
			||||||
 | 
					    end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    it "should default to :read ability and use scoped when where isn't available" do
 | 
				
			||||||
 | 
					      @ability.can :read, @model_class, :foo => {:bar => 1}
 | 
				
			||||||
 | 
					      stub(@model_class).scoped(:conditions => {:foos => {:bar => 1}}, :joins => [:foo]) { :found_records }
 | 
				
			||||||
 | 
					      @model_class.accessible_by(@ability).should == :found_records
 | 
				
			||||||
 | 
					    end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    it "should merge association joins and sanitize conditions" do
 | 
				
			||||||
 | 
					      @ability.can :read, @model_class, :foo => {:bar => 1}
 | 
				
			||||||
 | 
					      @ability.can :read, @model_class, :too => {:car => 1, :far => {:bar => 1}}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      condition_variants = [
 | 
				
			||||||
 | 
					          '(toos.fars.bar=1 AND toos.car=1) OR (foos.bar=1)', # faked sql sanitizer is stupid ;-)
 | 
				
			||||||
 | 
					          '(toos.car=1 AND toos.fars.bar=1) OR (foos.bar=1)'
 | 
				
			||||||
 | 
					      ]
 | 
				
			||||||
 | 
					      joins_variants = [
 | 
				
			||||||
 | 
					          [:foo, {:too => [:far]}],
 | 
				
			||||||
 | 
					          [{:too => [:far]}, :foo]
 | 
				
			||||||
 | 
					      ]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      condition_variants.each do |condition|
 | 
				
			||||||
 | 
					        joins_variants.each do |joins|
 | 
				
			||||||
 | 
					          stub(@model_class).scoped( :conditions => condition, :joins => joins ) { :found_records }
 | 
				
			||||||
 | 
					        end
 | 
				
			||||||
 | 
					      end
 | 
				
			||||||
 | 
					      # @ability.conditions(:read, @model_class).should == '(too.car=1 AND too.far.bar=1) OR (foo.bar=1)'
 | 
				
			||||||
 | 
					      # @ability.associations_hash(:read, @model_class).should == [{:too => [:far]}, :foo]
 | 
				
			||||||
 | 
					      @model_class.accessible_by(@ability).should == :found_records
 | 
				
			||||||
 | 
					    end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    it "should allow to define sql conditions by not hash" do
 | 
				
			||||||
 | 
					      @ability.can :read, @model_class, :foo => 1
 | 
				
			||||||
 | 
					      @ability.can :read, @model_class, ['bar = ?', 1]
 | 
				
			||||||
 | 
					      stub(@model_class).scoped( :conditions => '(bar = 1) OR (foo=1)', :joins => nil ) { :found_records }
 | 
				
			||||||
 | 
					      stub(@model_class).scoped{|*args| args.inspect}
 | 
				
			||||||
 | 
					      @model_class.accessible_by(@ability).should == :found_records
 | 
				
			||||||
 | 
					    end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    it "should not allow to fetch records when ability with just block present" do
 | 
				
			||||||
 | 
					      @ability.can :read, @model_class do false end
 | 
				
			||||||
 | 
					      lambda {
 | 
				
			||||||
 | 
					        @model_class.accessible_by(@ability)
 | 
				
			||||||
 | 
					      }.should raise_error(CanCan::Error)
 | 
				
			||||||
 | 
					    end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    it "should not allow to check ability on object when nonhash sql ability definition without block present" do
 | 
				
			||||||
 | 
					      @ability.can :read, @model_class, ['bar = ?', 1]
 | 
				
			||||||
 | 
					      lambda {
 | 
				
			||||||
 | 
					        @ability.can? :read, @model_class.new
 | 
				
			||||||
 | 
					      }.should raise_error(CanCan::Error)
 | 
				
			||||||
 | 
					    end
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
 | 
					end
 | 
				
			||||||
							
								
								
									
										61
									
								
								spec/cancan/model_adapters/data_mapper_adapter_spec.rb
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										61
									
								
								spec/cancan/model_adapters/data_mapper_adapter_spec.rb
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,61 @@
 | 
				
			|||||||
 | 
					if ENV["MODEL_ADAPTER"] == "data_mapper"
 | 
				
			||||||
 | 
					  require "spec_helper"
 | 
				
			||||||
 | 
					  require 'cancan/data_mapper_additions'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  describe CanCan::DataMapperAdditions do
 | 
				
			||||||
 | 
					    before(:each) do
 | 
				
			||||||
 | 
					      @model_class = Class.new
 | 
				
			||||||
 | 
					      @model_class.class_eval do
 | 
				
			||||||
 | 
					        include DataMapper::Resource
 | 
				
			||||||
 | 
					      end
 | 
				
			||||||
 | 
					      stub(@model_class).all(:conditions => ['true=false']) { 'no-match:' }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      @ability = Object.new
 | 
				
			||||||
 | 
					      @ability.extend(CanCan::Ability)
 | 
				
			||||||
 | 
					    end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    it "should return no records when no ability is defined so no records are found" do
 | 
				
			||||||
 | 
					      @model_class.accessible_by(@ability, :read).should == 'no-match:'
 | 
				
			||||||
 | 
					    end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    it "should call all with matching ability conditions" do
 | 
				
			||||||
 | 
					      @ability.can :read, @model_class, :foo => {:bar => 1}
 | 
				
			||||||
 | 
					      stub(@model_class).all(:conditions => {:foo => {:bar => 1}}) { 'found-records:' }
 | 
				
			||||||
 | 
					      @model_class.accessible_by(@ability, :read).should == 'no-match:found-records:'
 | 
				
			||||||
 | 
					    end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    it "should merge association joins and sanitize conditions" do
 | 
				
			||||||
 | 
					      @ability.can :read, @model_class, :foo => {:bar => 1}
 | 
				
			||||||
 | 
					      @ability.can :read, @model_class, :too => {:car => 1, :far => {:bar => 1}}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      stub(@model_class).all(:conditions => {:foo => {:bar => 1}}) { 'foo:' }
 | 
				
			||||||
 | 
					      stub(@model_class).all(:conditions => {:too => {:car => 1, :far => {:bar => 1}}}) { 'too:' }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      @model_class.accessible_by(@ability).should == 'no-match:too:foo:'
 | 
				
			||||||
 | 
					    end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    it "should allow to define sql conditions by not hash" do
 | 
				
			||||||
 | 
					      @ability.can :read, @model_class, :foo => 1
 | 
				
			||||||
 | 
					      @ability.can :read, @model_class, ['bar = ?', 1]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      stub(@model_class).all(:conditions => {:foo => 1}) { 'foo:' }
 | 
				
			||||||
 | 
					      stub(@model_class).all(:conditions => ['bar = ?', 1]) { 'bar:' }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      @model_class.accessible_by(@ability).should == 'no-match:bar:foo:'
 | 
				
			||||||
 | 
					    end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    it "should not allow to fetch records when ability with just block present" do
 | 
				
			||||||
 | 
					      @ability.can :read, @model_class do false end
 | 
				
			||||||
 | 
					      lambda {
 | 
				
			||||||
 | 
					        @model_class.accessible_by(@ability)
 | 
				
			||||||
 | 
					      }.should raise_error(CanCan::Error)
 | 
				
			||||||
 | 
					    end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    it "should not allow to check ability on object when nonhash sql ability definition without block present" do
 | 
				
			||||||
 | 
					      @ability.can :read, @model_class, ['bar = ?', 1]
 | 
				
			||||||
 | 
					      lambda {
 | 
				
			||||||
 | 
					        @ability.can? :read, @model_class.new
 | 
				
			||||||
 | 
					      }.should raise_error(CanCan::Error)
 | 
				
			||||||
 | 
					    end
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
 | 
					end
 | 
				
			||||||
							
								
								
									
										192
									
								
								spec/cancan/model_adapters/mongoid_adapter_spec.rb
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										192
									
								
								spec/cancan/model_adapters/mongoid_adapter_spec.rb
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,192 @@
 | 
				
			|||||||
 | 
					if ENV["MODEL_ADAPTER"] == "mongoid"
 | 
				
			||||||
 | 
					  require 'mongoid' # require mongoid first so MongoidAdditions are loaded
 | 
				
			||||||
 | 
					  require "spec_helper"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  class MongoidCategory
 | 
				
			||||||
 | 
					    include Mongoid::Document
 | 
				
			||||||
 | 
					    include CanCan::MongoidAdditions
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    references_many :mongoid_projects
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  class MongoidProject
 | 
				
			||||||
 | 
					    include Mongoid::Document
 | 
				
			||||||
 | 
					    include CanCan::MongoidAdditions
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					    referenced_in :mongoid_category
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    class << self
 | 
				
			||||||
 | 
					      protected
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      def sanitize_sql(hash_cond)
 | 
				
			||||||
 | 
					        hash_cond
 | 
				
			||||||
 | 
					      end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      def sanitize_hash(hash)
 | 
				
			||||||
 | 
					        hash.map do |name, value|
 | 
				
			||||||
 | 
					          if Hash === value
 | 
				
			||||||
 | 
					            sanitize_hash(value).map{|cond| "#{name}.#{cond}"}
 | 
				
			||||||
 | 
					          else
 | 
				
			||||||
 | 
					            "#{name}=#{value}"
 | 
				
			||||||
 | 
					          end
 | 
				
			||||||
 | 
					        end.flatten
 | 
				
			||||||
 | 
					      end
 | 
				
			||||||
 | 
					    end
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  Mongoid.configure do |config|
 | 
				
			||||||
 | 
					    config.master = Mongo::Connection.new('127.0.0.1', 27017).db("cancan_mongoid_additions_spec")
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  describe CanCan::MongoidAdditions do
 | 
				
			||||||
 | 
					    context "Mongoid not defined" do
 | 
				
			||||||
 | 
					      before(:all) do
 | 
				
			||||||
 | 
					        @mongoid_class = Object.send(:remove_const, :Mongoid)
 | 
				
			||||||
 | 
					      end
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					      after(:all) do
 | 
				
			||||||
 | 
					        Object.const_set(:Mongoid, @mongoid_class)
 | 
				
			||||||
 | 
					      end
 | 
				
			||||||
 | 
					      it "should not raise an error for ActiveRecord models" do
 | 
				
			||||||
 | 
					        @model_class = Class.new(Project)
 | 
				
			||||||
 | 
					        stub(@model_class).scoped { :scoped_stub }
 | 
				
			||||||
 | 
					        @model_class.send(:include, CanCan::ActiveRecordAdditions)
 | 
				
			||||||
 | 
					        @ability = Object.new
 | 
				
			||||||
 | 
					        @ability.extend(CanCan::Ability)
 | 
				
			||||||
 | 
					          
 | 
				
			||||||
 | 
					        @ability.can :read, @model_class
 | 
				
			||||||
 | 
					        lambda {    
 | 
				
			||||||
 | 
					          @ability.can? :read, @model_class.new 
 | 
				
			||||||
 | 
					        }.should_not raise_error
 | 
				
			||||||
 | 
					      end    
 | 
				
			||||||
 | 
					    end
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					    context "Mongoid defined" do
 | 
				
			||||||
 | 
					      before(:each) do
 | 
				
			||||||
 | 
					        @model_class = MongoidProject
 | 
				
			||||||
 | 
					        @ability = Object.new
 | 
				
			||||||
 | 
					        @ability.extend(CanCan::Ability)
 | 
				
			||||||
 | 
					      end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      after(:each) do
 | 
				
			||||||
 | 
					        Mongoid.master.collections.select do |collection|
 | 
				
			||||||
 | 
					          collection.name !~ /system/
 | 
				
			||||||
 | 
					        end.each(&:drop)    
 | 
				
			||||||
 | 
					      end    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      it "should compare properties on mongoid documents with the conditions hash" do
 | 
				
			||||||
 | 
					        model = @model_class.new
 | 
				
			||||||
 | 
					        @ability.can :read, @model_class, :id => model.id
 | 
				
			||||||
 | 
					        @ability.should be_able_to :read, model
 | 
				
			||||||
 | 
					      end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      it "should return [] when no ability is defined so no records are found" do
 | 
				
			||||||
 | 
					        @model_class.create :title  => 'Sir'
 | 
				
			||||||
 | 
					        @model_class.create :title  => 'Lord'
 | 
				
			||||||
 | 
					        @model_class.create :title  => 'Dude'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        @model_class.accessible_by(@ability, :read).entries.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  
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      it "should return everything when the defined ability is manage all" do
 | 
				
			||||||
 | 
					        @ability.can :manage, :all
 | 
				
			||||||
 | 
					        sir   = @model_class.create :title  => 'Sir'
 | 
				
			||||||
 | 
					        lord  = @model_class.create :title  => 'Lord'
 | 
				
			||||||
 | 
					        dude  = @model_class.create :title  => 'Dude'  
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        @model_class.accessible_by(@ability, :read).entries.should == [sir, lord, dude]
 | 
				
			||||||
 | 
					      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
 | 
				
			||||||
 | 
					        end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        describe "activates only when there are Criteria in the hash" do
 | 
				
			||||||
 | 
					          it "Calls where on the model class when there are criteria" do
 | 
				
			||||||
 | 
					            obj = @model_class.create :title  => 'Bird'
 | 
				
			||||||
 | 
					            @conditions = {:title.nin => ["Fork", "Spoon"]}      
 | 
				
			||||||
 | 
					            mock(@model_class).where(@conditions) {[obj]}
 | 
				
			||||||
 | 
					            @ability.can :read, @model_class, @conditions
 | 
				
			||||||
 | 
					            @ability.should be_able_to(:read, obj)
 | 
				
			||||||
 | 
					          end
 | 
				
			||||||
 | 
					          it "Calls the base version if there are no mongoid criteria" do
 | 
				
			||||||
 | 
					            obj = @model_class.new :title  => 'Bird'
 | 
				
			||||||
 | 
					            @conditions = {:id => obj.id}
 | 
				
			||||||
 | 
					            @ability.can :read, @model_class, @conditions
 | 
				
			||||||
 | 
					            @ability.should be_able_to(:read, obj)
 | 
				
			||||||
 | 
					          end
 | 
				
			||||||
 | 
					        end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        it "should handle :field.nin" 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
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        it "should handle :field.size" 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    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        it "should handle :field.exists" 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
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        it "should handle :field.gt" 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
 | 
				
			||||||
 | 
					        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
 | 
				
			||||||
 | 
					        @ability.can :read, @model_class do false end
 | 
				
			||||||
 | 
					        lambda {
 | 
				
			||||||
 | 
					          @model_class.accessible_by(@ability)
 | 
				
			||||||
 | 
					        }.should raise_error(CanCan::Error)
 | 
				
			||||||
 | 
					      end
 | 
				
			||||||
 | 
					    end
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
 | 
					end
 | 
				
			||||||
@ -1,190 +0,0 @@
 | 
				
			|||||||
require 'mongoid' # require mongoid first so MongoidAdditions are loaded
 | 
					 | 
				
			||||||
require "spec_helper"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
class MongoidCategory
 | 
					 | 
				
			||||||
  include Mongoid::Document
 | 
					 | 
				
			||||||
  include CanCan::MongoidAdditions
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  references_many :mongoid_projects
 | 
					 | 
				
			||||||
end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
class MongoidProject
 | 
					 | 
				
			||||||
  include Mongoid::Document
 | 
					 | 
				
			||||||
  include CanCan::MongoidAdditions
 | 
					 | 
				
			||||||
  
 | 
					 | 
				
			||||||
  referenced_in :mongoid_category
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  class << self
 | 
					 | 
				
			||||||
    protected
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    def sanitize_sql(hash_cond)
 | 
					 | 
				
			||||||
      hash_cond
 | 
					 | 
				
			||||||
    end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    def sanitize_hash(hash)
 | 
					 | 
				
			||||||
      hash.map do |name, value|
 | 
					 | 
				
			||||||
        if Hash === value
 | 
					 | 
				
			||||||
          sanitize_hash(value).map{|cond| "#{name}.#{cond}"}
 | 
					 | 
				
			||||||
        else
 | 
					 | 
				
			||||||
          "#{name}=#{value}"
 | 
					 | 
				
			||||||
        end
 | 
					 | 
				
			||||||
      end.flatten
 | 
					 | 
				
			||||||
    end
 | 
					 | 
				
			||||||
  end
 | 
					 | 
				
			||||||
end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Mongoid.configure do |config|
 | 
					 | 
				
			||||||
  config.master = Mongo::Connection.new('127.0.0.1', 27017).db("cancan_mongoid_additions_spec")
 | 
					 | 
				
			||||||
end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
describe CanCan::MongoidAdditions do
 | 
					 | 
				
			||||||
  context "Mongoid not defined" do
 | 
					 | 
				
			||||||
    before(:all) do
 | 
					 | 
				
			||||||
      @mongoid_class = Object.send(:remove_const, :Mongoid)
 | 
					 | 
				
			||||||
    end
 | 
					 | 
				
			||||||
    
 | 
					 | 
				
			||||||
    after(:all) do
 | 
					 | 
				
			||||||
      Object.const_set(:Mongoid, @mongoid_class)
 | 
					 | 
				
			||||||
    end
 | 
					 | 
				
			||||||
    it "should not raise an error for ActiveRecord models" do
 | 
					 | 
				
			||||||
      @model_class = Class.new(Project)
 | 
					 | 
				
			||||||
      stub(@model_class).scoped { :scoped_stub }
 | 
					 | 
				
			||||||
      @model_class.send(:include, CanCan::ActiveRecordAdditions)
 | 
					 | 
				
			||||||
      @ability = Object.new
 | 
					 | 
				
			||||||
      @ability.extend(CanCan::Ability)
 | 
					 | 
				
			||||||
          
 | 
					 | 
				
			||||||
      @ability.can :read, @model_class
 | 
					 | 
				
			||||||
      lambda {    
 | 
					 | 
				
			||||||
        @ability.can? :read, @model_class.new 
 | 
					 | 
				
			||||||
      }.should_not raise_error
 | 
					 | 
				
			||||||
    end    
 | 
					 | 
				
			||||||
  end
 | 
					 | 
				
			||||||
  
 | 
					 | 
				
			||||||
  context "Mongoid defined" do
 | 
					 | 
				
			||||||
    before(:each) do
 | 
					 | 
				
			||||||
      @model_class = MongoidProject
 | 
					 | 
				
			||||||
      @ability = Object.new
 | 
					 | 
				
			||||||
      @ability.extend(CanCan::Ability)
 | 
					 | 
				
			||||||
    end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    after(:each) do
 | 
					 | 
				
			||||||
      Mongoid.master.collections.select do |collection|
 | 
					 | 
				
			||||||
        collection.name !~ /system/
 | 
					 | 
				
			||||||
      end.each(&:drop)    
 | 
					 | 
				
			||||||
    end    
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    it "should compare properties on mongoid documents with the conditions hash" do
 | 
					 | 
				
			||||||
      model = @model_class.new
 | 
					 | 
				
			||||||
      @ability.can :read, @model_class, :id => model.id
 | 
					 | 
				
			||||||
      @ability.should be_able_to :read, model
 | 
					 | 
				
			||||||
    end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    it "should return [] when no ability is defined so no records are found" do
 | 
					 | 
				
			||||||
      @model_class.create :title  => 'Sir'
 | 
					 | 
				
			||||||
      @model_class.create :title  => 'Lord'
 | 
					 | 
				
			||||||
      @model_class.create :title  => 'Dude'
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      @model_class.accessible_by(@ability, :read).entries.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  
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    it "should return everything when the defined ability is manage all" do
 | 
					 | 
				
			||||||
      @ability.can :manage, :all
 | 
					 | 
				
			||||||
      sir   = @model_class.create :title  => 'Sir'
 | 
					 | 
				
			||||||
      lord  = @model_class.create :title  => 'Lord'
 | 
					 | 
				
			||||||
      dude  = @model_class.create :title  => 'Dude'  
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      @model_class.accessible_by(@ability, :read).entries.should == [sir, lord, dude]
 | 
					 | 
				
			||||||
    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
 | 
					 | 
				
			||||||
      end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      describe "activates only when there are Criteria in the hash" do
 | 
					 | 
				
			||||||
        it "Calls where on the model class when there are criteria" do
 | 
					 | 
				
			||||||
          obj = @model_class.create :title  => 'Bird'
 | 
					 | 
				
			||||||
          @conditions = {:title.nin => ["Fork", "Spoon"]}      
 | 
					 | 
				
			||||||
          mock(@model_class).where(@conditions) {[obj]}
 | 
					 | 
				
			||||||
          @ability.can :read, @model_class, @conditions
 | 
					 | 
				
			||||||
          @ability.should be_able_to(:read, obj)
 | 
					 | 
				
			||||||
        end
 | 
					 | 
				
			||||||
        it "Calls the base version if there are no mongoid criteria" do
 | 
					 | 
				
			||||||
          obj = @model_class.new :title  => 'Bird'
 | 
					 | 
				
			||||||
          @conditions = {:id => obj.id}
 | 
					 | 
				
			||||||
          @ability.can :read, @model_class, @conditions
 | 
					 | 
				
			||||||
          @ability.should be_able_to(:read, obj)
 | 
					 | 
				
			||||||
        end
 | 
					 | 
				
			||||||
      end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      it "should handle :field.nin" 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
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      it "should handle :field.size" 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    
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      it "should handle :field.exists" 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
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      it "should handle :field.gt" 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
 | 
					 | 
				
			||||||
      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
 | 
					 | 
				
			||||||
      @ability.can :read, @model_class do false end
 | 
					 | 
				
			||||||
      lambda {
 | 
					 | 
				
			||||||
        @model_class.accessible_by(@ability)
 | 
					 | 
				
			||||||
      }.should raise_error(CanCan::Error)
 | 
					 | 
				
			||||||
    end
 | 
					 | 
				
			||||||
  end
 | 
					 | 
				
			||||||
end
 | 
					 | 
				
			||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user