diff --git a/app/models/concerns/caber/object.rb b/app/models/concerns/caber/object.rb index e2154a2..e1c93af 100644 --- a/app/models/concerns/caber/object.rb +++ b/app/models/concerns/caber/object.rb @@ -2,7 +2,7 @@ module Caber::Object extend ActiveSupport::Concern included do - has_many :caber_relations, as: :object, class_name: "Caber::Relation" + has_many :caber_relations, as: :object, class_name: "Caber::Relation", dependent: :destroy scope :with_permission, ->(permission) { where("caber_relations.permission": permission) } def self.can_grant_permissions_to(model) @@ -25,5 +25,4 @@ def revoke_permission(permission, subject) def revoke_all_permissions(subject) Caber::Relation.where(object: self, subject: subject).destroy_all end - end diff --git a/app/models/concerns/caber/subject.rb b/app/models/concerns/caber/subject.rb index 30822da..9fd575d 100644 --- a/app/models/concerns/caber/subject.rb +++ b/app/models/concerns/caber/subject.rb @@ -2,7 +2,7 @@ module Caber::Subject extend ActiveSupport::Concern included do - has_many :caber_relations, as: :subject, class_name: "Caber::Relation" + has_many :caber_relations, as: :subject, class_name: "Caber::Relation", dependent: :destroy scope :with_permission, ->(permission) { where("caber_relations.permission": permission) } def self.can_have_permissions_on(model) diff --git a/spec/models/caber/relation_spec.rb b/spec/models/caber/relation_spec.rb index 086259e..7421dbe 100644 --- a/spec/models/caber/relation_spec.rb +++ b/spec/models/caber/relation_spec.rb @@ -117,15 +117,27 @@ end it "removes a specific permission" do - expect{object.revoke_permission("viewer", alice)}. - to change { alice.has_permission_on?("viewer", object) }.from(true).to(false) + expect { object.revoke_permission("viewer", alice) } + .to change { alice.has_permission_on?("viewer", object) }.from(true).to(false) end it "removes all permissions" do - expect{object.revoke_all_permissions(alice)}. - to change { alice.has_permission_on?("viewer", object) }.from(true).to(false) + expect { object.revoke_all_permissions(alice) } + .to change { alice.has_permission_on?("viewer", object) }.from(true).to(false) end - end + context "removing permissions on object/subject removal" do + before do + object.grant_permission_to "viewer", alice + end + + it "removes permission when subject is removed" do + expect { alice.destroy }.to change { Caber::Relation.count }.by(-1) + end + + it "removes permission when object is removed" do + expect { object.destroy }.to change { Caber::Relation.count }.by(-1) + end + end end