feat: Add function addPoliciesWithAffected

Signed-off-by: Edmond <edomondja@gmail.com>
diff --git a/src/model/Policy.lua b/src/model/Policy.lua
index e9f7592..69f7fd7 100644
--- a/src/model/Policy.lua
+++ b/src/model/Policy.lua
@@ -239,19 +239,25 @@
     * @return succeeds or not.
 ]]
 function Policy:addPolicies(sec, ptype, rules)
-    local size = #self.model[sec][ptype].policy
+    return self:addPoliciesWithAffected(sec, ptype, rules)~=0
+end
+
+--[[
+    * addPoliciesWithAffected adds policy rules to the model.
+    * @param sec the section, "p" or "g".
+    * @param ptype the policy type, "p", "p2", .. or "g", "g2", ..
+    * @param rules the policy rules.
+    * @return effected.
+]]
+function Policy:addPoliciesWithAffected(sec, ptype, rules)
+    local effected={}
     for _, rule in pairs(rules) do
-        if not self:hasPolicy(sec, ptype, rule) then
-            table.insert(self.model[sec][ptype].policy, rule)
-            self.model[sec][ptype].policyMap[table.concat(rule,",")]=#self.model[sec][ptype].policy
+        if self:addPolicy(sec, ptype, rule) then
+            table.insert(effected, rule)
+
         end
     end
-
-    if size < #self.model[sec][ptype].policy then
-        return true
-    else
-        return false
-    end
+    return effected
 end
 
 --[[
@@ -332,9 +338,8 @@
 function Policy:removePoliciesWithEffected(sec, ptype, rules)
     local effected={}
     for _,rule in pairs(rules) do
-        if self:hasPolicy(sec, ptype, rule) then
+        if self:removePolicy(sec,ptype,rule) then
             table.insert(effected,rule)
-            self:removePolicy(sec,ptype,rule)
         end
     end
     return effected
diff --git a/tests/model/model_spec.lua b/tests/model/model_spec.lua
index 82843c0..a5162a5 100644
--- a/tests/model/model_spec.lua
+++ b/tests/model/model_spec.lua
@@ -59,7 +59,6 @@
         assert.is.False(m:hasPolicies("p", "p", rulesnotmatched))
     end)
 
-
     it("test addPolicy", function ()
         local m = Model:new()
         m:loadModel(basic_path)
@@ -72,6 +71,25 @@
         assert.is.True(m:hasPolicy("p", "p", rule))
     end)
 
+    it("test addPoliciesWithAffected", function ()
+        local m = Model:new()
+        m:loadModel(basic_path)
+
+        local rules = {{'admin', 'domain1', 'data1', 'read'},{'admin', 'domain2', 'data2', 'read'},{'admin', 'domain1', 'data1', 'write'}}
+        assert.is.False(m:hasPolicies("p", "p", rules))
+
+        assert.are.same(rules,m:addPoliciesWithAffected("p", "p", rules))
+        assert.is.True(m:hasPolicies("p", "p", rules))
+
+        local rules1 = {{'Alice', 'domain1', 'data1', 'read'},{'Bob', 'domain2', 'data2', 'read'},{'admin', 'domain1', 'data1', 'write'}}
+        assert.is.True(m:hasPolicies("p", "p", rules1))
+
+        assert.are.same({{'Alice', 'domain1', 'data1', 'read'},{'Bob', 'domain2', 'data2', 'read'}},m:addPoliciesWithAffected("p", "p", rules1))
+        assert.is.True(m:hasPolicy("p", "p", {'Alice', 'domain1', 'data1', 'read'}))
+        assert.is.True(m:hasPolicy("p", "p", {'Bob', 'domain2', 'data2', 'read'}))
+
+    end)
+
     it("test removePolicy", function ()
         local m = Model:new()
         m:loadModel(basic_path)
@@ -100,6 +118,16 @@
         assert.are.same(rules,m:removePoliciesWithEffected("p", "p", rules))
         assert.is.False(m:hasPolicies("p", "p", rules))
         assert.is.False(m:removePolicy("p", "p", rules[1]))
+
+        m:addPolicies("p", "p", rules)
+        assert.is.True(m:hasPolicies("p", "p", rules))
+
+        local removeList={{'Alice', 'domain1', 'data1', 'read'},{'admin', 'domain2', 'data2', 'read'},{'admin', 'domain1', 'data1', 'write'}}
+        assert.is.False(m:hasPolicy("p", "p", {'Alice', 'domain1', 'data1', 'read'}))
+
+        assert.are.same({{'admin', 'domain2', 'data2', 'read'},{'admin', 'domain1', 'data1', 'write'}},m:removePoliciesWithEffected("p", "p", removeList))
+        assert.is.False(m:hasPolicy("p", "p", removeList[2]))
+        assert.is.False(m:removePolicy("p", "p", removeList[3]))
     end)
 
     it("test addRolePolicy", function ()