ソースを参照

Test for group_delete

Yentl Van Tendeloo 7 年 前
コミット
1b717d119e

+ 8 - 12
bootstrap/core_algorithm.alc

@@ -2163,7 +2163,7 @@ String function cmd_group_delete(group_name : String):
 		else:
 			return "Group permission denied to: " + group_name!
 	else:
-		return "Group not found: " + group_name!
+		return "Unknown group: " + group_name!
 
 String function cmd_group_owner_add(group_name : String, other_user_name : String):
 	// Add an owner to your group
@@ -2189,7 +2189,7 @@ String function cmd_group_owner_add(group_name : String, other_user_name : Strin
 		else:
 			return "Group permission denied to: " + group_name!
 	else:
-		return "Group not found: " + group_name!
+		return "Unknown group: " + group_name!
 
 String function cmd_group_owner_delete(group_name : String, other_user_name : String):
 	// Remove an owner from your group
@@ -2216,7 +2216,7 @@ String function cmd_group_owner_delete(group_name : String, other_user_name : St
 		else:
 			return "Group permission denied to: " + group_name!
 	else:
-		return "Group not found: " + group_name!
+		return "Unknown group: " + group_name!
 
 String function cmd_group_join(group_name : String, other_user_name : String):
 	// Add someone to your group
@@ -2227,10 +2227,6 @@ String function cmd_group_join(group_name : String, other_user_name : String):
 	if (group_id != ""):
 		if (allow_group_modify(current_user_id, group_id)):
 			other_user_id = get_user_id(other_user_name)
-			log("Got other user ID: " + other_user_id)
-			log("other use name: " + other_user_name)
-			log("Own user ID: " + current_user_id)
-			log("Outgoing associations: " + set_to_string(allOutgoingAssociationInstances(core, other_user_id, "belongsTo")))
 			if (other_user_id != ""):
 				if (bool_not(set_in(allOutgoingAssociationInstances(core, other_user_id, "belongsTo"), group_id))):
 					instantiate_link(core, "belongsTo", "", other_user_id, group_id)
@@ -2242,7 +2238,7 @@ String function cmd_group_join(group_name : String, other_user_name : String):
 		else:
 			return "Group permission denied to: " + group_name!
 	else:
-		return "Group not found: " + group_name!
+		return "Unknown group: " + group_name!
 
 String function cmd_group_kick(group_name : String, other_user_name : String):
 	// Remove someone from your group
@@ -2268,11 +2264,11 @@ String function cmd_group_kick(group_name : String, other_user_name : String):
 				else:
 					return "User is not a member of the group!"!
 			else:
-				return "User not found: " + other_user_name!
+				return "Unknown user: " + other_user_name!
 		else:
 			return "Group permission denied to: " + group_name!
 	else:
-		return "Group not found: " + group_name!
+		return "Unknown group: " + group_name!
 
 String function cmd_group_list():
 	// List all groups you are a member of (and whether you are admin or not!)
@@ -2305,7 +2301,7 @@ String function cmd_admin_promote(other_user_name : String):
 			instantiate_attribute(core, other_user_id, "admin", True)
 			return "Success"!
 		else:
-			return "User not found: " + other_user_name!
+			return "Unknown user: " + other_user_name!
 	else:
 		return "Admin permission denied"!
 
@@ -2320,7 +2316,7 @@ String function cmd_admin_demote(other_user_name : String):
 			instantiate_attribute(core, other_user_id, "admin", False)
 			return "Success"!
 		else:
-			return "User not found: " + other_user_name!
+			return "Unknown user: " + other_user_name!
 	else:
 		return "Admin permission denied"!
 

+ 88 - 15
unit/test_all.py

@@ -2387,38 +2387,42 @@ class TestModelverse(unittest.TestCase):
             pass
 
     def test_op_group_create(self):
-
         # Test normal operation
+        group_name_1 = "new_group"
+        group_name_2 = "group2"
+        group_name_3 = "other_group"
+        group_name_4 = "second_group"
+
         assert group_list() == set([])
-        group_create("new_group")
-        assert group_list() == set([("new_group", True)])
+        group_create(group_name_1)
+        assert group_list() == set([(group_name_1, True)])
 
         # Test second group
-        assert group_list() == set([("new_group", True)])
-        group_create("group2")
-        assert group_list() == set([("new_group", True), ("group2", True)])
+        assert group_list() == set([(group_name_1, True)])
+        group_create(group_name_2)
+        assert group_list() == set([(group_name_1, True), (group_name_2, True)])
 
         # Test other groups
         user_logout()
         login("user2", "user2")
-        group_create("other_group")
-        group_create("second_group")
+        group_create(group_name_3)
+        group_create(group_name_4)
         user_logout()
         login("user", "user")
-        assert group_list() == set([("new_group", True), ("group2", True)])
+        assert group_list() == set([(group_name_1, True), (group_name_2, True)])
 
         # Test non-admin groups
         user_logout()
         login("user2", "user2")
-        group_join("other_group", "user")
+        group_join(group_name_3, "user")
         user_logout()
         login("user", "user")
-        assert group_list() == set([("new_group", True), ("group2", True), ("other_group", False)])
+        assert group_list() == set([(group_name_1, True), (group_name_2, True), (group_name_3, False)])
 
         # Test create of existing group (member)
         before = group_list()
         try:
-            group_create("new_group")
+            group_create(group_name_1)
             self.fail()
         except GroupExists:
             assert group_list() == before
@@ -2426,11 +2430,82 @@ class TestModelverse(unittest.TestCase):
         # Test create of existing group (non-member)
         before = group_list()
         try:
-            group_create("second_group")
+            group_create(group_name_4)
             self.fail()
         except GroupExists:
             assert group_list() == before
 
+        # Delete all groups again
+        user_logout()
+        login("admin", "admin")
+        group_delete(group_name_1)
+        group_delete(group_name_2)
+        group_delete(group_name_3)
+        group_delete(group_name_4)
+        user_logout()
+        login("user", "user")
+
+    def test_op_group_delete(self):
+        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
+
+        user_logout()
+        login("user2", "user2")
+        user_logout()
+        login("user", "user")
+
+        # Create some groups first
+        group_create(group_name_1)
+        user_logout()
+        login("admin", "admin")
+        group_create(group_name_2)
+        group_join(group_name_2, "user")
+        group_create(group_name_3)
+        user_logout()
+        login("user", "user")
+
+        # Try to delete all 
+        assert group_list() == set([(group_name_1, True), (group_name_2, False)])
+        group_delete(group_name_1)
+        assert group_list() == set([(group_name_2, False)])
+
+        # Remove group that we don't own
+        try:
+            group_delete(group_name_2)
+            self.fail()
+        except GroupPermissionDenied:
+            assert group_list() == set([(group_name_2, False)])
+
+        # Remove group that we are not even member of
+        try:
+            group_delete(group_name_3)
+            self.fail()
+        except GroupPermissionDenied:
+            assert group_list() == set([(group_name_2, False)])
+
+        # Remove non-existing group
+        try:
+            group_delete(group_name_4)
+        except UnknownGroup:
+            assert group_list() == set([(group_name_2, False)])
+
+        # Test if other users can no longer see removed groups
+        group_create(group_name_1)
+        group_join(group_name_1, "user2")
+        user_logout()
+        login("user2", "user2")
+        assert group_list() == set([(group_name_1, False)])
+        user_logout()
+        login("user", "user")
+        group_delete(group_name_1)
+        user_logout()
+        login("user2", "user2")
+        assert group_list() == set([])
+        user_logout()
+        login("user", "user")
+
     """
     def do_create_user(self, name):
         user_logout()
@@ -2473,8 +2548,6 @@ class TestModelverse(unittest.TestCase):
     def test_op_process_signature(self):
     def test_op_permission_group(self):
     def test_op_permission_owner(self):
-    def test_op_group_create(self):
-    def test_op_group_delete(self):
     def test_op_group_owner_add(self):
     def test_op_group_owner_delete(self):
     def test_op_group_join(self):

+ 14 - 0
wrappers/classes/modelverse.xml

@@ -1356,6 +1356,20 @@
                         </raise>
                     </transition>
 
+                    <transition cond="self.expect_response_partial('Unknown group: ', pop=False)" target="../wait_for_action/history">
+                        <raise event="exception">
+                            <parameter expr="'UnknownGroup'"/>
+                            <parameter expr="self.split_response(self.responses.pop(0))[0]"/>
+                        </raise>
+                    </transition>
+
+                    <transition cond="self.expect_response_partial('Unknown user: ', pop=False)" target="../wait_for_action/history">
+                        <raise event="exception">
+                            <parameter expr="'UnknownUser'"/>
+                            <parameter expr="self.split_response(self.responses.pop(0))[0]"/>
+                        </raise>
+                    </transition>
+
                     <transition cond="self.expect_response_partial('Not an association: ', pop=False)" target="../wait_for_action/history">
                         <raise event="exception">
                             <parameter expr="'NotAnAssociation'"/>

+ 6 - 0
wrappers/modelverse.py

@@ -48,6 +48,12 @@ class UnknownModel(UnknownIdentifier):
 class UnknownLocation(UnknownIdentifier):
     pass
 
+class UnknownGroup(UnknownIdentifier):
+    pass
+
+class UnknownUser(UnknownIdentifier):
+    pass
+
 class ConnectionError(ModelverseException):
     pass
 

+ 61 - 39
wrappers/modelverse_SCCD.py

@@ -1794,6 +1794,16 @@ class Modelverse(RuntimeClassBase):
         _initialized_behaviour_operations_23.setTrigger(None)
         _initialized_behaviour_operations_23.setGuard(self._initialized_behaviour_operations_23_guard)
         self.states["/initialized/behaviour/operations"].addTransition(_initialized_behaviour_operations_23)
+        _initialized_behaviour_operations_24 = Transition(self, self.states["/initialized/behaviour/operations"], [self.states["/initialized/behaviour/wait_for_action/history"]])
+        _initialized_behaviour_operations_24.setAction(self._initialized_behaviour_operations_24_exec)
+        _initialized_behaviour_operations_24.setTrigger(None)
+        _initialized_behaviour_operations_24.setGuard(self._initialized_behaviour_operations_24_guard)
+        self.states["/initialized/behaviour/operations"].addTransition(_initialized_behaviour_operations_24)
+        _initialized_behaviour_operations_25 = Transition(self, self.states["/initialized/behaviour/operations"], [self.states["/initialized/behaviour/wait_for_action/history"]])
+        _initialized_behaviour_operations_25.setAction(self._initialized_behaviour_operations_25_exec)
+        _initialized_behaviour_operations_25.setTrigger(None)
+        _initialized_behaviour_operations_25.setGuard(self._initialized_behaviour_operations_25_guard)
+        self.states["/initialized/behaviour/operations"].addTransition(_initialized_behaviour_operations_25)
         
         # 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"]])
@@ -2190,125 +2200,137 @@ class Modelverse(RuntimeClassBase):
         return self.expect_response_partial('Unknown location: ', pop=False)
     
     def _initialized_behaviour_operations_4_exec(self, parameters):
-        self.raiseInternalEvent(Event("exception", None, ['NotAnAssociation', self.split_response(self.responses.pop(0))[0]]))
+        self.raiseInternalEvent(Event("exception", None, ['UnknownGroup', self.split_response(self.responses.pop(0))[0]]))
     
     def _initialized_behaviour_operations_4_guard(self, parameters):
-        return self.expect_response_partial('Not an association: ', pop=False)
+        return self.expect_response_partial('Unknown group: ', pop=False)
     
     def _initialized_behaviour_operations_5_exec(self, parameters):
-        self.raiseInternalEvent(Event("exception", None, ['ModelExists', self.split_response(self.responses.pop(0))[0]]))
+        self.raiseInternalEvent(Event("exception", None, ['UnknownUser', self.split_response(self.responses.pop(0))[0]]))
     
     def _initialized_behaviour_operations_5_guard(self, parameters):
-        return self.expect_response_partial('Model exists: ', pop=False)
+        return self.expect_response_partial('Unknown user: ', pop=False)
     
     def _initialized_behaviour_operations_6_exec(self, parameters):
-        self.raiseInternalEvent(Event("exception", None, ['GroupExists', self.split_response(self.responses.pop(0))[0]]))
+        self.raiseInternalEvent(Event("exception", None, ['NotAnAssociation', self.split_response(self.responses.pop(0))[0]]))
     
     def _initialized_behaviour_operations_6_guard(self, parameters):
-        return self.expect_response_partial('Group exists: ', pop=False)
+        return self.expect_response_partial('Not an association: ', pop=False)
     
     def _initialized_behaviour_operations_7_exec(self, parameters):
-        self.raiseInternalEvent(Event("exception", None, ['FolderExists', self.split_response(self.responses.pop(0))[0]]))
+        self.raiseInternalEvent(Event("exception", None, ['ModelExists', self.split_response(self.responses.pop(0))[0]]))
     
     def _initialized_behaviour_operations_7_guard(self, parameters):
-        return self.expect_response_partial('Folder exists: ', pop=False)
+        return self.expect_response_partial('Model exists: ', pop=False)
     
     def _initialized_behaviour_operations_8_exec(self, parameters):
-        self.raiseInternalEvent(Event("exception", None, ['AttributeExists', self.split_response(self.responses.pop(0))[0]]))
+        self.raiseInternalEvent(Event("exception", None, ['GroupExists', self.split_response(self.responses.pop(0))[0]]))
     
     def _initialized_behaviour_operations_8_guard(self, parameters):
-        return self.expect_response_partial('Attribute exists: ', pop=False)
+        return self.expect_response_partial('Group exists: ', pop=False)
     
     def _initialized_behaviour_operations_9_exec(self, parameters):
-        self.raiseInternalEvent(Event("exception", None, ['UnknownM3', self.split_response(self.responses.pop(0))[0]]))
+        self.raiseInternalEvent(Event("exception", None, ['FolderExists', self.split_response(self.responses.pop(0))[0]]))
     
     def _initialized_behaviour_operations_9_guard(self, parameters):
-        return self.expect_response_partial('Type cannot be typed as formalisms/SimpleClassDiagrams: ', pop=False)
+        return self.expect_response_partial('Folder exists: ', pop=False)
     
     def _initialized_behaviour_operations_10_exec(self, parameters):
-        self.raiseInternalEvent(Event("exception", None, ['ElementExists', self.split_response(self.responses.pop(0))[0]]))
+        self.raiseInternalEvent(Event("exception", None, ['AttributeExists', self.split_response(self.responses.pop(0))[0]]))
     
     def _initialized_behaviour_operations_10_guard(self, parameters):
-        return self.expect_response_partial('Element exists: ', pop=False)
+        return self.expect_response_partial('Attribute exists: ', pop=False)
     
     def _initialized_behaviour_operations_11_exec(self, parameters):
-        self.raiseInternalEvent(Event("exception", None, ['ReadPermissionDenied', self.split_response(self.responses.pop(0))[0]]))
+        self.raiseInternalEvent(Event("exception", None, ['UnknownM3', self.split_response(self.responses.pop(0))[0]]))
     
     def _initialized_behaviour_operations_11_guard(self, parameters):
-        return self.expect_response_partial('Read permission denied to: ', pop=False)
+        return self.expect_response_partial('Type cannot be typed as formalisms/SimpleClassDiagrams: ', pop=False)
     
     def _initialized_behaviour_operations_12_exec(self, parameters):
-        self.raiseInternalEvent(Event("exception", None, ['WritePermissionDenied', self.split_response(self.responses.pop(0))[0]]))
+        self.raiseInternalEvent(Event("exception", None, ['ElementExists', self.split_response(self.responses.pop(0))[0]]))
     
     def _initialized_behaviour_operations_12_guard(self, parameters):
-        return self.expect_response_partial('Write permission denied to: ', pop=False)
+        return self.expect_response_partial('Element exists: ', pop=False)
     
     def _initialized_behaviour_operations_13_exec(self, parameters):
-        self.raiseInternalEvent(Event("exception", None, ['WritePermissionDenied', self.current_model]))
+        self.raiseInternalEvent(Event("exception", None, ['ReadPermissionDenied', self.split_response(self.responses.pop(0))[0]]))
     
     def _initialized_behaviour_operations_13_guard(self, parameters):
-        return self.expect_response('Write permission denied', pop=True)
+        return self.expect_response_partial('Read permission denied to: ', pop=False)
     
     def _initialized_behaviour_operations_14_exec(self, parameters):
-        self.raiseInternalEvent(Event("exception", None, ['NoSimpleClassDiagramsModel', 'Model is not a Simple Class Diagrams model and has no notion of defined attributes']))
+        self.raiseInternalEvent(Event("exception", None, ['WritePermissionDenied', self.split_response(self.responses.pop(0))[0]]))
     
     def _initialized_behaviour_operations_14_guard(self, parameters):
-        return self.expect_response_partial('Not a SimpleClassDiagrams model!', pop=True)
+        return self.expect_response_partial('Write permission denied to: ', pop=False)
     
     def _initialized_behaviour_operations_15_exec(self, parameters):
-        self.raiseInternalEvent(Event("exception", None, ['ExecutePermissionDenied', self.split_response(self.responses.pop(0))[0]]))
+        self.raiseInternalEvent(Event("exception", None, ['WritePermissionDenied', self.current_model]))
     
     def _initialized_behaviour_operations_15_guard(self, parameters):
-        return self.expect_response_partial('Execute permission denied to: ', pop=False)
+        return self.expect_response('Write permission denied', pop=True)
     
     def _initialized_behaviour_operations_16_exec(self, parameters):
-        self.raiseInternalEvent(Event("exception", None, ['GroupPermissionDenied', self.split_response(self.responses.pop(0))[0]]))
+        self.raiseInternalEvent(Event("exception", None, ['NoSimpleClassDiagramsModel', 'Model is not a Simple Class Diagrams model and has no notion of defined attributes']))
     
     def _initialized_behaviour_operations_16_guard(self, parameters):
-        return self.expect_response_partial('Group permission denied to: ', pop=False)
+        return self.expect_response_partial('Not a SimpleClassDiagrams model!', pop=True)
     
     def _initialized_behaviour_operations_17_exec(self, parameters):
-        self.raiseInternalEvent(Event("exception", None, ['UserPermissionDenied', self.split_response(self.responses.pop(0))[0]]))
+        self.raiseInternalEvent(Event("exception", None, ['ExecutePermissionDenied', self.split_response(self.responses.pop(0))[0]]))
     
     def _initialized_behaviour_operations_17_guard(self, parameters):
-        return self.expect_response_partial('User permission denied to: ', pop=False)
+        return self.expect_response_partial('Execute permission denied to: ', pop=False)
     
     def _initialized_behaviour_operations_18_exec(self, parameters):
-        self.raiseInternalEvent(Event("exception", None, ['AdminPermissionDenied', 'Admin permissions are required for this operation!']))
+        self.raiseInternalEvent(Event("exception", None, ['GroupPermissionDenied', self.split_response(self.responses.pop(0))[0]]))
     
     def _initialized_behaviour_operations_18_guard(self, parameters):
-        return self.expect_response_partial('Admin permission denied', pop=True)
+        return self.expect_response_partial('Group permission denied to: ', pop=False)
     
     def _initialized_behaviour_operations_19_exec(self, parameters):
-        self.raiseInternalEvent(Event("exception", None, ['InterfaceMismatch', self.split_response(self.responses.pop(0))[0]]))
+        self.raiseInternalEvent(Event("exception", None, ['UserPermissionDenied', self.split_response(self.responses.pop(0))[0]]))
     
     def _initialized_behaviour_operations_19_guard(self, parameters):
-        return self.expect_response_partial('Incorrect format: ', pop=False)
+        return self.expect_response_partial('User permission denied to: ', pop=False)
     
     def _initialized_behaviour_operations_20_exec(self, parameters):
-        self.raiseInternalEvent(Event("exception", None, ['UnknownElement', 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_20_guard(self, parameters):
-        return self.expect_response_partial('Element not found: ', pop=False)
+        return self.expect_response_partial('Admin permission denied', pop=True)
     
     def _initialized_behaviour_operations_21_exec(self, parameters):
-        self.raiseInternalEvent(Event("exception", None, ['UnknownModel', 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_21_guard(self, parameters):
-        return self.expect_response_partial('Model not found: ', pop=False)
+        return self.expect_response_partial('Incorrect format: ', pop=False)
     
     def _initialized_behaviour_operations_22_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, ['UnknownElement', self.split_response(self.responses.pop(0))[0]]))
     
     def _initialized_behaviour_operations_22_guard(self, parameters):
-        return self.expect_response_partial('Conformance hierarchy unknown for: ', pop=False)
+        return self.expect_response_partial('Element not found: ', pop=False)
     
     def _initialized_behaviour_operations_23_exec(self, parameters):
+        self.raiseInternalEvent(Event("exception", None, ['UnknownModel', self.split_response(self.responses.pop(0))[0]]))
+    
+    def _initialized_behaviour_operations_23_guard(self, parameters):
+        return self.expect_response_partial('Model not found: ', pop=False)
+    
+    def _initialized_behaviour_operations_24_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_24_guard(self, parameters):
+        return self.expect_response_partial('Conformance hierarchy unknown for: ', pop=False)
+    
+    def _initialized_behaviour_operations_25_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_23_guard(self, parameters):
+    def _initialized_behaviour_operations_25_guard(self, parameters):
         return self.expect_response_partial('', pop=False)
     
     def _initialized_behaviour_wait_for_action_0_exec(self, parameters):