소스 검색

Fixed group_create (with tests) and group_join (still to test)

Yentl Van Tendeloo 7 년 전
부모
커밋
dfa9893c47
5개의 변경된 파일142개의 추가작업 그리고 43개의 파일을 삭제
  1. 6 2
      bootstrap/core_algorithm.alc
  2. 74 0
      unit/test_all.py
  3. 11 4
      wrappers/classes/modelverse.xml
  4. 3 0
      wrappers/modelverse.py
  5. 48 37
      wrappers/modelverse_SCCD.py

+ 6 - 2
bootstrap/core_algorithm.alc

@@ -2227,8 +2227,12 @@ 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 (set_in(allOutgoingAssociationInstances(core, other_user_id, "belongsTo"), group_id)):
+				if (bool_not(set_in(allOutgoingAssociationInstances(core, other_user_id, "belongsTo"), group_id))):
 					instantiate_link(core, "belongsTo", "", other_user_id, group_id)
 					return "Success"!
 				else:
@@ -2277,7 +2281,7 @@ String function cmd_group_list():
 	String admin
 	String result
 	
-	result = ""
+	result = "Success: "
 	groups = allAssociationDestinations(core, current_user_id, "belongsTo")
 	while (set_len(groups) > 0):
 		group_id = set_pop(groups)

+ 74 - 0
unit/test_all.py

@@ -2386,6 +2386,80 @@ class TestModelverse(unittest.TestCase):
         except NoSimpleClassDiagramsModel:
             pass
 
+    def test_op_group_create(self):
+
+        # Test normal operation
+        assert group_list() == set([])
+        group_create("new_group")
+        assert group_list() == set([("new_group", True)])
+
+        # Test second group
+        assert group_list() == set([("new_group", True)])
+        group_create("group2")
+        assert group_list() == set([("new_group", True), ("group2", True)])
+
+        # Test other groups
+        user_logout()
+        login("user2", "user2")
+        group_create("other_group")
+        group_create("second_group")
+        user_logout()
+        login("user", "user")
+        assert group_list() == set([("new_group", True), ("group2", True)])
+
+        # Test non-admin groups
+        user_logout()
+        login("user2", "user2")
+        group_join("other_group", "user")
+        user_logout()
+        login("user", "user")
+        assert group_list() == set([("new_group", True), ("group2", True), ("other_group", False)])
+
+        # Test create of existing group (member)
+        before = group_list()
+        try:
+            group_create("new_group")
+            self.fail()
+        except GroupExists:
+            assert group_list() == before
+
+        # Test create of existing group (non-member)
+        before = group_list()
+        try:
+            group_create("second_group")
+            self.fail()
+        except GroupExists:
+            assert group_list() == before
+
+    """
+    def do_create_user(self, name):
+        user_logout()
+        login(name, name)
+        user_logout()
+        login("user", "user")
+
+    def do_test_permission(self, model, expected_permissions):
+        for user, permission in expected_permissions.items():
+            read = permission != "N"
+            write = permission == "W"
+
+            assert can_read(model, user) == read
+            assert can_write(model, user) == write
+
+    def test_op_permission_owner(self):
+        model_add("users/user/test/a", "formalisms/SimpleClassDiagrams")
+        group_create("users")
+        permission_group("users/user/test/a", "users")
+
+        self.do_create_user("group_user")
+        self.do_create_user("other_user")
+        group_join("users", "group_user")
+
+        self.do_test_permission("users/user/test/a", {"admin": "W", "user": "W", "group_user": "R", "other_user": "N"})
+
+        #permission_owner("users/user/test/a", "group_user")
+    """
+
     """
     def test_op_model_render(self):
     def test_op_transformation_between(self):

+ 11 - 4
wrappers/classes/modelverse.xml

@@ -754,7 +754,7 @@
                     <state id="group_create">
                         <onentry>
                             <raise event="request">
-                                <parameter expr="['group_create', self.parameters[0], self.parameters[1]]"/>
+                                <parameter expr="['group_create', self.parameters[0]]"/>
                             </raise>
                         </onentry>
 
@@ -768,7 +768,7 @@
                     <state id="group_delete">
                         <onentry>
                             <raise event="request">
-                                <parameter expr="['group_delete', self.parameters[0], self.parameters[1]]"/>
+                                <parameter expr="['group_delete', self.parameters[0]]"/>
                             </raise>
                         </onentry>
 
@@ -838,13 +838,13 @@
                     <state id="group_list">
                         <onentry>
                             <raise event="request">
-                                <parameter expr="['group_list', self.parameters[0], self.parameters[1]]"/>
+                                <parameter expr="['group_list']"/>
                             </raise>
                         </onentry>
 
                         <transition cond="self.expect_response_partial('Success: ', pop=False)" target="../../wait_for_action/history">
                             <raise event="result">
-                                <parameter expr="set(self.split_response(self.responses.pop(0)))"/>
+                                <parameter expr="set([(i[3:], True if i[1] == 'A' else False) for i in self.split_response(self.responses.pop(0))])"/>
                             </raise>
                         </transition>
                     </state>
@@ -1370,6 +1370,13 @@
                         </raise>
                     </transition>
 
+                    <transition cond="self.expect_response_partial('Group exists: ', pop=False)" target="../wait_for_action/history">
+                        <raise event="exception">
+                            <parameter expr="'GroupExists'"/>
+                            <parameter expr="self.split_response(self.responses.pop(0))[0]"/>
+                        </raise>
+                    </transition>
+
                     <transition cond="self.expect_response_partial('Folder exists: ', pop=False)" target="../wait_for_action/history">
                         <raise event="exception">
                             <parameter expr="'FolderExists'"/>

+ 3 - 0
wrappers/modelverse.py

@@ -66,6 +66,9 @@ class ModelExists(ExistsError):
 class FolderExists(ExistsError):
     pass
 
+class GroupExists(ExistsError):
+    pass
+
 class PermissionDenied(ModelverseException):
     pass
 

+ 48 - 37
wrappers/modelverse_SCCD.py

@@ -1789,6 +1789,11 @@ class Modelverse(RuntimeClassBase):
         _initialized_behaviour_operations_22.setTrigger(None)
         _initialized_behaviour_operations_22.setGuard(self._initialized_behaviour_operations_22_guard)
         self.states["/initialized/behaviour/operations"].addTransition(_initialized_behaviour_operations_22)
+        _initialized_behaviour_operations_23 = Transition(self, self.states["/initialized/behaviour/operations"], [self.states["/initialized/behaviour/wait_for_action/history"]])
+        _initialized_behaviour_operations_23.setAction(self._initialized_behaviour_operations_23_exec)
+        _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)
         
         # 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"]])
@@ -2037,10 +2042,10 @@ class Modelverse(RuntimeClassBase):
         self.raiseInternalEvent(Event("request", None, [['permission_group', self.parameters[0], self.parameters[1]]]))
     
     def _initialized_behaviour_operations_group_create_enter(self):
-        self.raiseInternalEvent(Event("request", None, [['group_create', self.parameters[0], self.parameters[1]]]))
+        self.raiseInternalEvent(Event("request", None, [['group_create', self.parameters[0]]]))
     
     def _initialized_behaviour_operations_group_delete_enter(self):
-        self.raiseInternalEvent(Event("request", None, [['group_delete', self.parameters[0], self.parameters[1]]]))
+        self.raiseInternalEvent(Event("request", None, [['group_delete', self.parameters[0]]]))
     
     def _initialized_behaviour_operations_group_owner_add_enter(self):
         self.raiseInternalEvent(Event("request", None, [['group_owner_add', self.parameters[0], self.parameters[1]]]))
@@ -2055,7 +2060,7 @@ class Modelverse(RuntimeClassBase):
         self.raiseInternalEvent(Event("request", None, [['group_kick', self.parameters[0], self.parameters[1]]]))
     
     def _initialized_behaviour_operations_group_list_enter(self):
-        self.raiseInternalEvent(Event("request", None, [['group_list', self.parameters[0], self.parameters[1]]]))
+        self.raiseInternalEvent(Event("request", None, [['group_list']]))
     
     def _initialized_behaviour_operations_admin_promote_enter(self):
         self.raiseInternalEvent(Event("request", None, [['admin_promote', self.parameters[0]]]))
@@ -2197,107 +2202,113 @@ class Modelverse(RuntimeClassBase):
         return self.expect_response_partial('Model exists: ', pop=False)
     
     def _initialized_behaviour_operations_6_exec(self, parameters):
-        self.raiseInternalEvent(Event("exception", None, ['FolderExists', 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_6_guard(self, parameters):
-        return self.expect_response_partial('Folder exists: ', pop=False)
+        return self.expect_response_partial('Group exists: ', pop=False)
     
     def _initialized_behaviour_operations_7_exec(self, parameters):
-        self.raiseInternalEvent(Event("exception", None, ['AttributeExists', 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_7_guard(self, parameters):
-        return self.expect_response_partial('Attribute exists: ', pop=False)
+        return self.expect_response_partial('Folder exists: ', pop=False)
     
     def _initialized_behaviour_operations_8_exec(self, parameters):
-        self.raiseInternalEvent(Event("exception", None, ['UnknownM3', 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_8_guard(self, parameters):
-        return self.expect_response_partial('Type cannot be typed as formalisms/SimpleClassDiagrams: ', pop=False)
+        return self.expect_response_partial('Attribute exists: ', pop=False)
     
     def _initialized_behaviour_operations_9_exec(self, parameters):
-        self.raiseInternalEvent(Event("exception", None, ['ElementExists', 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_9_guard(self, parameters):
-        return self.expect_response_partial('Element exists: ', pop=False)
+        return self.expect_response_partial('Type cannot be typed as formalisms/SimpleClassDiagrams: ', pop=False)
     
     def _initialized_behaviour_operations_10_exec(self, parameters):
-        self.raiseInternalEvent(Event("exception", None, ['ReadPermissionDenied', 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_10_guard(self, parameters):
-        return self.expect_response_partial('Read permission denied to: ', pop=False)
+        return self.expect_response_partial('Element exists: ', pop=False)
     
     def _initialized_behaviour_operations_11_exec(self, parameters):
-        self.raiseInternalEvent(Event("exception", None, ['WritePermissionDenied', self.split_response(self.responses.pop(0))[0]]))
+        self.raiseInternalEvent(Event("exception", None, ['ReadPermissionDenied', self.split_response(self.responses.pop(0))[0]]))
     
     def _initialized_behaviour_operations_11_guard(self, parameters):
-        return self.expect_response_partial('Write permission denied to: ', pop=False)
+        return self.expect_response_partial('Read permission denied to: ', pop=False)
     
     def _initialized_behaviour_operations_12_exec(self, parameters):
-        self.raiseInternalEvent(Event("exception", None, ['WritePermissionDenied', self.current_model]))
+        self.raiseInternalEvent(Event("exception", None, ['WritePermissionDenied', self.split_response(self.responses.pop(0))[0]]))
     
     def _initialized_behaviour_operations_12_guard(self, parameters):
-        return self.expect_response('Write permission denied', pop=True)
+        return self.expect_response_partial('Write permission denied to: ', pop=False)
     
     def _initialized_behaviour_operations_13_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.current_model]))
     
     def _initialized_behaviour_operations_13_guard(self, parameters):
-        return self.expect_response_partial('Not a SimpleClassDiagrams model!', pop=True)
+        return self.expect_response('Write permission denied', pop=True)
     
     def _initialized_behaviour_operations_14_exec(self, parameters):
-        self.raiseInternalEvent(Event("exception", None, ['ExecutePermissionDenied', 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_14_guard(self, parameters):
-        return self.expect_response_partial('Execute permission denied to: ', pop=False)
+        return self.expect_response_partial('Not a SimpleClassDiagrams model!', pop=True)
     
     def _initialized_behaviour_operations_15_exec(self, parameters):
-        self.raiseInternalEvent(Event("exception", None, ['GroupPermissionDenied', 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_15_guard(self, parameters):
-        return self.expect_response_partial('Group permission denied to: ', pop=False)
+        return self.expect_response_partial('Execute permission denied to: ', pop=False)
     
     def _initialized_behaviour_operations_16_exec(self, parameters):
-        self.raiseInternalEvent(Event("exception", None, ['UserPermissionDenied', self.split_response(self.responses.pop(0))[0]]))
+        self.raiseInternalEvent(Event("exception", None, ['GroupPermissionDenied', self.split_response(self.responses.pop(0))[0]]))
     
     def _initialized_behaviour_operations_16_guard(self, parameters):
-        return self.expect_response_partial('User permission denied to: ', pop=False)
+        return self.expect_response_partial('Group permission denied to: ', pop=False)
     
     def _initialized_behaviour_operations_17_exec(self, parameters):
-        self.raiseInternalEvent(Event("exception", None, ['AdminPermissionDenied', 'Admin permissions are required for this operation!']))
+        self.raiseInternalEvent(Event("exception", None, ['UserPermissionDenied', self.split_response(self.responses.pop(0))[0]]))
     
     def _initialized_behaviour_operations_17_guard(self, parameters):
-        return self.expect_response_partial('Admin permission denied', pop=True)
+        return self.expect_response_partial('User permission denied to: ', pop=False)
     
     def _initialized_behaviour_operations_18_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_18_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_19_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_19_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_20_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_20_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_21_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_21_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_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)]))
+    
+    def _initialized_behaviour_operations_22_guard(self, parameters):
+        return self.expect_response_partial('Conformance hierarchy unknown for: ', pop=False)
+    
+    def _initialized_behaviour_operations_23_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_22_guard(self, parameters):
+    def _initialized_behaviour_operations_23_guard(self, parameters):
         return self.expect_response_partial('', pop=False)
     
     def _initialized_behaviour_wait_for_action_0_exec(self, parameters):
@@ -2848,7 +2859,7 @@ class Modelverse(RuntimeClassBase):
         return self.expect_response('Success')
     
     def _initialized_behaviour_operations_group_list_0_exec(self, parameters):
-        self.raiseInternalEvent(Event("result", None, [set(self.split_response(self.responses.pop(0)))]))
+        self.raiseInternalEvent(Event("result", None, [set([(i[3:], True if i[1] == 'A' else False) for i in self.split_response(self.responses.pop(0))])]))
     
     def _initialized_behaviour_operations_group_list_0_guard(self, parameters):
         return self.expect_response_partial('Success: ', pop=False)