|
1 | 1 | import json |
2 | 2 | import logging |
3 | 3 | import os |
| 4 | +import random |
4 | 5 | import tempfile |
5 | 6 | import subprocess |
6 | 7 | import shutil |
|
19 | 20 | decode_token_data, |
20 | 21 | TokenError, |
21 | 22 | ServerType, |
22 | | - ErrorCode, |
23 | 23 | ) |
24 | 24 | from ..client_push import push_project_async, push_project_cancel |
25 | 25 | from ..client_pull import ( |
|
39 | 39 | from ..merginproject import pygeodiff |
40 | 40 | from ..report import create_report |
41 | 41 | from ..editor import EDITOR_ROLE_NAME, filter_changes, is_editor_enabled |
42 | | - |
| 42 | +from ..common import ErrorCode |
43 | 43 |
|
44 | 44 | SERVER_URL = os.environ.get("TEST_MERGIN_URL") |
45 | 45 | API_USER = os.environ.get("TEST_API_USERNAME") |
@@ -355,8 +355,8 @@ def test_push_pull_changes(mc): |
355 | 355 | assert os.path.exists(os.path.join(project_dir_2, "renamed.txt")) |
356 | 356 | assert os.path.exists(os.path.join(project_dir_2, conflicted_copy_file_name(f_updated, API_USER, 1))) |
357 | 357 | assert ( |
358 | | - generate_checksum(os.path.join(project_dir_2, conflicted_copy_file_name(f_updated, API_USER, 1))) |
359 | | - == f_conflict_checksum |
| 358 | + generate_checksum(os.path.join(project_dir_2, conflicted_copy_file_name(f_updated, API_USER, 1))) |
| 359 | + == f_conflict_checksum |
360 | 360 | ) |
361 | 361 | assert generate_checksum(os.path.join(project_dir_2, f_updated)) == f_remote_checksum |
362 | 362 |
|
@@ -2459,8 +2459,8 @@ def test_project_rename(mc: MerginClient): |
2459 | 2459 |
|
2460 | 2460 | # cannot rename with full project name |
2461 | 2461 | with pytest.raises( |
2462 | | - ClientError, |
2463 | | - match="Project's new name should be without workspace specification", |
| 2462 | + ClientError, |
| 2463 | + match="Project's new name should be without workspace specification", |
2464 | 2464 | ): |
2465 | 2465 | mc.rename_project(project, "workspace" + "/" + test_project_renamed) |
2466 | 2466 |
|
@@ -2711,8 +2711,8 @@ def test_error_projects_limit_hit(mcStorage: MerginClient): |
2711 | 2711 | mcStorage.create_project_and_push(test_project_fullname, project_dir) |
2712 | 2712 | assert e.value.server_code == ErrorCode.ProjectsLimitHit.value |
2713 | 2713 | assert ( |
2714 | | - e.value.detail |
2715 | | - == "Maximum number of projects is reached. Please upgrade your subscription to create new projects (ProjectsLimitHit)" |
| 2714 | + e.value.detail |
| 2715 | + == "Maximum number of projects is reached. Please upgrade your subscription to create new projects (ProjectsLimitHit)" |
2716 | 2716 | ) |
2717 | 2717 | assert e.value.http_error == 422 |
2718 | 2718 | assert e.value.http_method == "POST" |
@@ -2742,3 +2742,58 @@ def test_workspace_requests(mc2: MerginClient): |
2742 | 2742 | assert service["plan"]["product_id"] == None |
2743 | 2743 | assert service["plan"]["type"] == "custom" |
2744 | 2744 | assert service["subscription"] == None |
| 2745 | + |
| 2746 | + |
| 2747 | +def test_access_management(mc: MerginClient): |
| 2748 | + # create a user in a workspace |
| 2749 | + workspace_id = None |
| 2750 | + for workspace in mc.workspaces_list(): |
| 2751 | + if workspace["name"] == mc.username(): |
| 2752 | + workspace_id = workspace["id"] |
| 2753 | + break |
| 2754 | + email = "create_user" + str(random.randint(1000, 9999)) + "@client.py" |
| 2755 | + password = "Il0vemergin" |
| 2756 | + role = "writer" |
| 2757 | + mc.create_user(email, password, workspace_id, role) |
| 2758 | + workspace_members = mc.list_workspace_members(workspace_id) |
| 2759 | + new_user = next((m for m in workspace_members if m["email"] == email)) |
| 2760 | + assert new_user |
| 2761 | + assert new_user["workspace_role"] == role |
| 2762 | + # test get workspace member |
| 2763 | + ws_member = mc.get_workspace_member(workspace_id, new_user["id"]) |
| 2764 | + assert ws_member["email"] == email |
| 2765 | + assert ws_member["workspace_role"] == role |
| 2766 | + updated_role = "admin" |
| 2767 | + # test update workspace member |
| 2768 | + mc.update_workspace_member(workspace_id, new_user["id"], updated_role) |
| 2769 | + updated_user = mc.get_workspace_member(workspace_id, new_user["id"]) |
| 2770 | + assert updated_user["workspace_role"] == updated_role |
| 2771 | + # test remove workspace member |
| 2772 | + mc.remove_workspace_member(workspace_id, new_user["id"]) |
| 2773 | + workspace_members = mc.list_workspace_members(workspace_id) |
| 2774 | + assert not any(m["id"] == new_user["id"] for m in workspace_members) |
| 2775 | + # add project |
| 2776 | + test_project_name = "test_collaborators" |
| 2777 | + test_project_fullname = API_USER + "/" + test_project_name |
| 2778 | + project_dir = os.path.join(TMP_DIR, test_project_name, API_USER) |
| 2779 | + cleanup(mc, test_project_fullname, [project_dir]) |
| 2780 | + mc.create_project(test_project_name) |
| 2781 | + project_info = get_project_info(mc, API_USER, test_project_name) |
| 2782 | + test_project_id = project_info["id"] |
| 2783 | + project_role = "reader" |
| 2784 | + # test add project collaborator |
| 2785 | + mc.add_project_collaborator(test_project_id, new_user["email"], project_role) |
| 2786 | + collaborators = mc.list_project_collaborators(test_project_id) |
| 2787 | + new_collaborator = next((c for c in collaborators if c["id"] == new_user["id"])) |
| 2788 | + assert new_collaborator |
| 2789 | + assert new_collaborator["project_role"] == project_role |
| 2790 | + updated_role = "owner" |
| 2791 | + # test update project collaborator |
| 2792 | + mc.update_project_collaborator(test_project_id, new_user["id"], updated_role) |
| 2793 | + collaborators = mc.list_project_collaborators(test_project_id) |
| 2794 | + updated_collaborator = next((c for c in collaborators if c["id"] == new_user["id"])) |
| 2795 | + assert updated_collaborator["project_role"] == updated_role |
| 2796 | + # test remove project collaborator |
| 2797 | + mc.remove_project_collaborator(test_project_id, new_user["id"]) |
| 2798 | + collaborators = mc.list_project_collaborators(test_project_id) |
| 2799 | + assert not any(c["id"] == new_user["id"] for c in collaborators) |
0 commit comments