浏览代码

Fixed group_join user existence test

Yentl Van Tendeloo 7 年之前
父节点
当前提交
1fd9d1e6a0
共有 5 个文件被更改,包括 82 次插入14 次删除
  1. 4 2
      bootstrap/core_algorithm.alc
  2. 46 1
      unit/test_all.py
  3. 7 0
      wrappers/classes/modelverse.xml
  4. 3 0
      wrappers/modelverse.py
  5. 22 11
      wrappers/modelverse_SCCD.py

+ 4 - 2
bootstrap/core_algorithm.alc

@@ -2240,11 +2240,13 @@ String function cmd_group_join(group_name : String, other_user_name : String):
 		if (allow_group_modify(current_user_id, group_id)):
 			other_user_id = get_user_id(other_user_name)
 			if (other_user_id != ""):
-				if (bool_not(set_in(allOutgoingAssociationInstances(core, other_user_id, "belongsTo"), group_id))):
+				log("allOutgoing: " + set_to_string(allAssociationDestinations(core, other_user_id, "belongsTo")))
+				log("Searching for group ID: " + group_id)
+				if (bool_not(set_in(allAssociationDestinations(core, other_user_id, "belongsTo"), group_id))):
 					instantiate_link(core, "belongsTo", "", other_user_id, group_id)
 					return "Success"!
 				else:
-					return "User is already a member of the group!"!
+					return "User exists: " + other_user_name!
 			else:
 				return "Unknown user: " + other_user_name!
 		else:

+ 46 - 1
unit/test_all.py

@@ -2548,30 +2548,36 @@ class TestModelverse(unittest.TestCase):
         # Test for group join of group where we are no admin
         try:
             group_join(group_name_2, "user2") == None
+            self.fail()
         except GroupPermissionDenied:
             assert self.do_as_user("user2", group_list, []) == set([(group_name_1, False)])
 
         # Test for group join of group where we are not even a member
         try:
             group_join(group_name_3, "user2") == None
+            self.fail()
         except GroupPermissionDenied:
             assert self.do_as_user("user2", group_list, []) == set([(group_name_1, False)])
 
         # Test for group join of group that already has user as member
+        assert self.do_as_user("user2", group_list, []) == set([(group_name_1, False)])
         try:
             group_join(group_name_1, "user2") == None
+            self.fail()
         except UserExists:
             assert self.do_as_user("user2", group_list, []) == set([(group_name_1, False)])
 
         # Test for group join of non-existing user
         try:
             group_join(group_name_1, "user123") == None
+            self.fail()
         except UnknownUser:
             pass
 
         # Test for group join of non-existing group
         try:
             group_join(group_name_4, "user2") == None
+            self.fail()
         except UnknownGroup:
             pass
 
@@ -2580,6 +2586,45 @@ class TestModelverse(unittest.TestCase):
         self.do_as_user("admin", group_delete, [group_name_2])
         self.do_as_user("admin", group_delete, [group_name_3])
 
+    def test_op_group_kick(self):
+        model_add("users/user/test/a", "formalisms/SimpleClassDiagrams")
+
+        group_name_1 = "new_group"      # Group with admin permissions
+        group_name_2 = "group2"         # Group without permissions
+        group_name_3 = "other_group"    # No member
+        group_name_4 = "second_group"   # Non-existing group
+
+        # Ensure user2 exists
+        self.do_as_user("user2", lambda : 1, [])
+
+        # Create some groups first
+        group_create(group_name_1)
+        self.do_as_user("admin", group_create, [group_name_2])
+        self.do_as_user("admin", group_join, [group_name_2, "user"])
+        self.do_as_user("admin", group_create, [group_name_3])
+
+        # Kick user from group
+        assert group_list() == set(["users", group_name_2])
+        self.do_as_user("admin", group_join, [group_name_2, "user"])
+        assert group_list() == set(["users"])
+
+        # Kick self (owner) from group
+        assert group_list() == set(["users"])
+        group_create(group_name_3)
+        assert group_list() == set(["users", group_name_3])
+        assert group_kick(group_name_3, "user") == None
+        assert group_list() == set(["users"])
+
+        # Empty groups are not deleted
+        self.do_as_user("admin", group_join(group_name_3, "user"))
+
+        # Kick user not in group
+        try:
+            self.do_as_user("admin", group_kick, [group_name_2, "user2"])
+            self.fail()
+        except UserNotInGroup:
+            pass
+
     def do_create_user(self, name):
         self.do_as_user(name, lambda : 1, [])
 
@@ -2754,6 +2799,7 @@ class TestModelverse(unittest.TestCase):
         except UnknownLocation:
             pass
 
+
     """
     def test_op_model_render(self):
     def test_op_transformation_between(self):
@@ -2769,7 +2815,6 @@ class TestModelverse(unittest.TestCase):
     def test_op_permission_owner(self):
     def test_op_group_owner_add(self):
     def test_op_group_owner_delete(self):
-    def test_op_group_kick(self):
     def test_op_conformance_delete(self):
     def test_op_conformance_add(self):
     """

+ 7 - 0
wrappers/classes/modelverse.xml

@@ -1496,6 +1496,13 @@
                         </raise>
                     </transition>
 
+                    <transition cond="self.expect_response_partial('User is not a member of the group!', pop=True)" target="../wait_for_action/history">
+                        <raise event="exception">
+                            <parameter expr="'UserNotInGroup'"/>
+                            <parameter expr="''"/>
+                        </raise>
+                    </transition>
+
                     <transition cond="self.expect_response_partial('Admin permission denied', pop=True)" target="../wait_for_action/history">
                         <raise event="exception">
                             <parameter expr="'AdminPermissionDenied'"/>

+ 3 - 0
wrappers/modelverse.py

@@ -21,6 +21,9 @@ class ModelverseException(Exception):
 class SuperclassAttribute(ModelverseException):
     pass
 
+class UserNotInGroup(ModelverseException):
+    pass
+
 class UnknownError(ModelverseException):
     pass
 

+ 22 - 11
wrappers/modelverse_SCCD.py

@@ -1826,6 +1826,11 @@ class Modelverse(RuntimeClassBase):
         _initialized_behaviour_operations_26.setTrigger(None)
         _initialized_behaviour_operations_26.setGuard(self._initialized_behaviour_operations_26_guard)
         self.states["/initialized/behaviour/operations"].addTransition(_initialized_behaviour_operations_26)
+        _initialized_behaviour_operations_27 = Transition(self, self.states["/initialized/behaviour/operations"], [self.states["/initialized/behaviour/wait_for_action/history"]])
+        _initialized_behaviour_operations_27.setAction(self._initialized_behaviour_operations_27_exec)
+        _initialized_behaviour_operations_27.setTrigger(None)
+        _initialized_behaviour_operations_27.setGuard(self._initialized_behaviour_operations_27_guard)
+        self.states["/initialized/behaviour/operations"].addTransition(_initialized_behaviour_operations_27)
         
         # transition /initialized/behaviour/wait_for_action
         _initialized_behaviour_wait_for_action_0 = Transition(self, self.states["/initialized/behaviour/wait_for_action"], [self.states["/initialized/behaviour/wait_for_action/history"]])
@@ -2327,41 +2332,47 @@ class Modelverse(RuntimeClassBase):
         return self.expect_response_partial('User permission denied to: ', pop=False)
     
     def _initialized_behaviour_operations_21_exec(self, parameters):
-        self.raiseInternalEvent(Event("exception", None, ['AdminPermissionDenied', 'Admin permissions are required for this operation!']))
+        self.raiseInternalEvent(Event("exception", None, ['UserNotInGroup', '']))
     
     def _initialized_behaviour_operations_21_guard(self, parameters):
-        return self.expect_response_partial('Admin permission denied', pop=True)
+        return self.expect_response_partial('User is not a member of the group!', pop=True)
     
     def _initialized_behaviour_operations_22_exec(self, parameters):
-        self.raiseInternalEvent(Event("exception", None, ['InterfaceMismatch', self.split_response(self.responses.pop(0))[0]]))
+        self.raiseInternalEvent(Event("exception", None, ['AdminPermissionDenied', 'Admin permissions are required for this operation!']))
     
     def _initialized_behaviour_operations_22_guard(self, parameters):
-        return self.expect_response_partial('Incorrect format: ', pop=False)
+        return self.expect_response_partial('Admin permission denied', pop=True)
     
     def _initialized_behaviour_operations_23_exec(self, parameters):
-        self.raiseInternalEvent(Event("exception", None, ['UnknownElement', self.split_response(self.responses.pop(0))[0]]))
+        self.raiseInternalEvent(Event("exception", None, ['InterfaceMismatch', self.split_response(self.responses.pop(0))[0]]))
     
     def _initialized_behaviour_operations_23_guard(self, parameters):
-        return self.expect_response_partial('Element not found: ', pop=False)
+        return self.expect_response_partial('Incorrect format: ', pop=False)
     
     def _initialized_behaviour_operations_24_exec(self, parameters):
-        self.raiseInternalEvent(Event("exception", None, ['UnknownModel', self.split_response(self.responses.pop(0))[0]]))
+        self.raiseInternalEvent(Event("exception", None, ['UnknownElement', self.split_response(self.responses.pop(0))[0]]))
     
     def _initialized_behaviour_operations_24_guard(self, parameters):
-        return self.expect_response_partial('Model not found: ', pop=False)
+        return self.expect_response_partial('Element not found: ', pop=False)
     
     def _initialized_behaviour_operations_25_exec(self, parameters):
-        self.raiseInternalEvent(Event("exception", None, ['UnknownMetamodellingHierarchy', 'Metamodelling hierarchy could not be resolved or automatically inferred: there is no typing relation between your specified model and metamodel (%s)' % self.responses.pop(0)]))
+        self.raiseInternalEvent(Event("exception", None, ['UnknownModel', self.split_response(self.responses.pop(0))[0]]))
     
     def _initialized_behaviour_operations_25_guard(self, parameters):
-        return self.expect_response_partial('Conformance hierarchy unknown for: ', pop=False)
+        return self.expect_response_partial('Model not found: ', pop=False)
     
     def _initialized_behaviour_operations_26_exec(self, parameters):
+        self.raiseInternalEvent(Event("exception", None, ['UnknownMetamodellingHierarchy', 'Metamodelling hierarchy could not be resolved or automatically inferred: there is no typing relation between your specified model and metamodel (%s)' % self.responses.pop(0)]))
+    
+    def _initialized_behaviour_operations_26_guard(self, parameters):
+        return self.expect_response_partial('Conformance hierarchy unknown for: ', pop=False)
+    
+    def _initialized_behaviour_operations_27_exec(self, parameters):
         print("Unknown Error: " + self.responses[0])
         pass
         self.raiseInternalEvent(Event("exception", None, ['UnknownError', 'Error: %s' % self.responses.pop(0)]))
     
-    def _initialized_behaviour_operations_26_guard(self, parameters):
+    def _initialized_behaviour_operations_27_guard(self, parameters):
         return self.expect_response_partial('', pop=False)
     
     def _initialized_behaviour_wait_for_action_0_exec(self, parameters):