spec/proxy_spec.rb in heimdallr-1.0.0.RC2 vs spec/proxy_spec.rb in heimdallr-1.0.0

- old
+ new

@@ -1,5 +1,125 @@ require 'spec_helper' +class User < ActiveRecord::Base; end + +class Article < ActiveRecord::Base + include Heimdallr::Model + + belongs_to :owner, :class_name => 'User' + + restrict do |user, record| + if user.admin? + # Administrator or owner can do everything + scope :fetch + scope :delete + can [:view, :create, :update] + else + # Other users can view only their own or non-classified articles... + scope :fetch, -> { where('owner_id = ? or secrecy_level < ?', user.id, 5) } + scope :delete, -> { where('owner_id = ?', user.id) } + + # ... and see all fields except the actual security level + # (through owners can see everything)... + if record.try(:owner) == user + can :view + can :update, { + secrecy_level: { inclusion: { in: 0..4 } } + } + else + can :view + cannot :view, [:secrecy_level] + end + + # ... and can create them with certain restrictions. + can :create, %w(content) + can :create, { + owner_id: user.id, + secrecy_level: { inclusion: { in: 0..4 } } + } + end + end +end + describe Heimdallr::Proxy do - pending "write it" + before(:all) do + @john = User.create! :admin => false + Article.create! :owner_id => @john.id, :content => 'test', :secrecy_level => 10 + Article.create! :owner_id => @john.id, :content => 'test', :secrecy_level => 3 + end + + before(:each) do + @admin = User.new :admin => true + @looser = User.new :admin => false + end + + it "should apply restrictions" do + proxy = Article.restrict(@admin) + proxy.should be_a_kind_of Heimdallr::Proxy::Collection + + proxy = Article.restrict(@looser) + proxy.should be_a_kind_of Heimdallr::Proxy::Collection + end + + it "should handle fetch scope" do + Article.restrict(@admin).all.count.should == 2 + Article.restrict(@looser).all.count.should == 1 + Article.restrict(@john).all.count.should == 2 + end + + it "should handle destroy scope" do + article = Article.create! :owner_id => @john.id, :content => 'test', :secrecy_level => 0 + expect { article.restrict(@looser).destroy }.should raise_error + expect { article.restrict(@john).destroy }.should_not raise_error + + article = Article.create! :owner_id => @john.id, :content => 'test', :secrecy_level => 0 + expect { article.restrict(@admin).destroy }.should_not raise_error + end + + it "should handle list of fields to view" do + article = Article.create! :owner_id => @john.id, :content => 'test', :secrecy_level => 0 + expect { article.restrict(@looser).secrecy_level }.should raise_error + expect { article.restrict(@admin).secrecy_level }.should_not raise_error + expect { article.restrict(@john).secrecy_level }.should_not raise_error + article.restrict(@looser).content.should == 'test' + end + + it "should handle entities creation" do + expect { Article.restrict(@looser).create! :content => 'test', :secrecy_level => 10 }.should raise_error + + article = Article.restrict(@john).create! :content => 'test', :secrecy_level => 3 + article.owner_id.should == @john.id + end + + it "should handle entities update" do + article = Article.create! :owner_id => @john.id, :content => 'test', :secrecy_level => 10 + expect { + article.restrict(@john).update_attributes! :secrecy_level => 8 + }.should raise_error + expect { + article.restrict(@looser).update_attributes! :secrecy_level => 3 + }.should raise_error + expect { + article.restrict(@admin).update_attributes! :secrecy_level => 10 + }.should_not raise_error + end + + it "should handle implicit strategy" do + article = Article.create! :owner_id => @john.id, :content => 'test', :secrecy_level => 4 + expect { article.restrict(@looser).secrecy_level }.should raise_error + article.restrict(@looser).implicit.secrecy_level.should == nil + end + + it "should answer if object is modifiable" do + article = Article.create! :owner_id => @john.id, :content => 'test', :secrecy_level => 4 + article.restrict(@john).modifiable?.should == true + article.restrict(@admin).modifiable?.should == true + article.restrict(@looser).modifiable?.should == false + end + + it "should answer if object is destroyable" do + article = Article.create! :owner_id => @john.id, :content => 'test', :secrecy_level => 4 + article.restrict(@john).destroyable?.should == true + article.restrict(@admin).destroyable?.should == true + article.restrict(@looser).destroyable?.should == false + end end \ No newline at end of file