$:.unshift File.join(File.dirname(__FILE__), "..", "lib") require 'permissionable_attributes' require 'rubygems' require 'active_support' require 'bit_accessor' class ParentWithPermissionAccessors attr_accessor :first_name_permissions, :last_name_permissions, :email_permissions, :age_permissions end class TestModelWithIndividualPermissionAccessors < ParentWithPermissionAccessors include PermissionableAttributes has_attributes_with_permissions do |config| config.attributes = %w[first_name last_name email age] config.permissions = [:public, :private, :restricted] config.permission_defaults = {:first_name => 2, :all => 1} end end class ParentWithPermissionsBitMaskAccessor attr_accessor :attributes_permissions end class TestModelWithPermissionsBitMask < ParentWithPermissionsBitMaskAccessor include PermissionableAttributes has_attributes_with_permissions do |config| config.attributes = %w[first_name last_name email age] config.permissions = [:public, :private, :restricted] config.permission_defaults = {:first_name => :restricted, :all => :private} config.use_bitmask end end describe "An object with permissionable attributes", :shared => true do it "should have the appropriate attributes permissionable" do attributes_that_should_be_permissionable = %w[first_name last_name email age] @model_class::ATTRIBUTES_WITH_PERMISSIONS.should == attributes_that_should_be_permissionable end it "should only allow a permission level of 0 to designate public for permissionable attributes" do @test_model.first_name_permissions = "0" @test_model.first_name_permissions.should == 0 @test_model.first_name_public?.should == true end it "should only allow a permission level of 3 to designate restricted for permissionable attributes" do @test_model.last_name_permissions = "2" @test_model.last_name_permissions.should == 2 @test_model.last_name_restricted?.should == true end it "should be able to give a list of it's permissions in humanized format for attributes with the corresponding permission values" do @model_class.attribute_permissions.should == [["Public",0], ["Private",1], ["Restricted",2]] end it "should have a constant set of it's permissions" do @model_class::ATTRIBUTE_PERMISSIONS.should == {:restricted=>2, :public=>0, :private=>1} end it "should allow the use of permission symbols when setting the attributes" do @test_model.last_name_permissions = :restricted @test_model.first_name_permissions = :public @test_model.age_permissions = :private @test_model.last_name_restricted?.should == true @test_model.first_name_public?.should == true @test_model.age_private?.should == true end it "should provide the permission values as symbols" do @test_model.last_name_permissions = :restricted @test_model.first_name_permissions = :public @test_model.age_permissions = :private @test_model.last_name_permissions_as_sym.should == :restricted @test_model.first_name_permissions_as_sym.should == :public @test_model.age_permissions_as_sym.should == :private end it "should raise an error if an undefined permission is passed in to a permissions setter" do lambda {@test_model.last_name_permissions = :blah}.should raise_error end it "should keep the state of multiple attributes" do @test_model.first_name_permissions = "0" @test_model.last_name_permissions = "2" @test_model.first_name_permissions.should == 0 @test_model.last_name_permissions.should == 2 end it "should default to the permission default for that permissionable attribute when an invalid permission level is provided" do @test_model.first_name_permissions = 31232 @test_model.first_name_permissions.should == @model_class.default_permission_for(:first_name) @test_model.first_name_permissions = -1 @test_model.first_name_permissions.should == @model_class.default_permission_for(:first_name) end it "should default to the permission default for all attributes when an invalid permission level is provided and the attribute has no defined default" do @test_model.age_permissions = 3 @test_model.age_permissions.should == @model_class.default_permission_for(:all) @test_model.age_permissions = -1 @test_model.age_permissions.should == @model_class.default_permission_for(:all) end it "should only allow a permission level of 1 to designate private for permissionable attributes" do @test_model.age_permissions = 1 @test_model.age_private?.should == true end end describe TestModelWithIndividualPermissionAccessors do before(:each) do @model_class = TestModelWithIndividualPermissionAccessors @test_model = @model_class.new end it_should_behave_like "An object with permissionable attributes" end describe TestModelWithPermissionsBitMask do before(:each) do @model_class = TestModelWithPermissionsBitMask @test_model = @model_class.new end it_should_behave_like "An object with permissionable attributes" it "should be able to provide a default permissions value based off of the defaults provided" do #config.attributes = %w[first_name last_name email age] #config.permission_defaults = {:first_name => 2, :all => 1} defaults = BitAccessor.new(TestModelWithPermissionsBitMask.default_permissions, 2) defaults[0].should == 2 defaults[1].should == 1 defaults[2].should == 1 defaults[3].should == 1 end it "should update the permissions number as permissions are set" do @test_model.attributes_permissions = 20 lambda { @test_model.age_permissions = 2 }.should change(@test_model, :attributes_permissions) end end