|
2 | 2 | # |
3 | 3 | # SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-MerginMaps-Commercial |
4 | 4 |
|
| 5 | +import pytest |
| 6 | +from unittest.mock import patch |
5 | 7 | import datetime |
6 | 8 | from flask_login import AnonymousUserMixin |
7 | 9 |
|
8 | | -from ..sync.permissions import require_project, ProjectPermissions |
9 | | -from ..sync.models import ProjectRole |
| 10 | +from mergin.tests import DEFAULT_USER |
| 11 | + |
| 12 | +from ..sync.permissions import ( |
| 13 | + require_project, |
| 14 | + check_project_permissions, |
| 15 | + ProjectPermissions, |
| 16 | +) |
| 17 | +from ..sync.models import Project, ProjectRole |
10 | 18 | from ..auth.models import User |
11 | 19 | from ..app import db |
12 | 20 | from ..config import Configuration |
13 | | -from .utils import add_user, create_project, create_workspace |
| 21 | +from .utils import ( |
| 22 | + add_user, |
| 23 | + create_project, |
| 24 | + create_workspace, |
| 25 | + login, |
| 26 | + logout, |
| 27 | +) |
14 | 28 |
|
15 | 29 |
|
16 | 30 | def test_project_permissions(client): |
@@ -116,3 +130,47 @@ def test_project_permissions(client): |
116 | 130 | assert ProjectPermissions.All.check(project, user) |
117 | 131 | assert ProjectPermissions.Edit.check(project, user) |
118 | 132 | assert ProjectPermissions.get_user_project_role(project, user) == ProjectRole.OWNER |
| 133 | + |
| 134 | + |
| 135 | +def test_check_project_permissions(client): |
| 136 | + """Test check_project_permissions with various permission scenarios.""" |
| 137 | + admin = User.query.filter_by(username=DEFAULT_USER[0]).first() |
| 138 | + test_workspace = create_workspace() |
| 139 | + |
| 140 | + private_proj = create_project("batch_private", test_workspace, admin) |
| 141 | + public_proj = create_project("batch_public", test_workspace, admin) |
| 142 | + |
| 143 | + p = Project.query.get(public_proj.id) |
| 144 | + p.public = True |
| 145 | + db.session.commit() |
| 146 | + |
| 147 | + priv_proj = Project.query.get(private_proj.id) |
| 148 | + pub_proj = Project.query.get(public_proj.id) |
| 149 | + |
| 150 | + # First user with access to both projects |
| 151 | + login(client, DEFAULT_USER[0], DEFAULT_USER[1]) |
| 152 | + |
| 153 | + with client: |
| 154 | + client.get("/") |
| 155 | + assert check_project_permissions(priv_proj, ProjectPermissions.Read) is None |
| 156 | + assert check_project_permissions(pub_proj, ProjectPermissions.Read) is None |
| 157 | + |
| 158 | + # Second user with no access to private project (ensure global perms disabled) |
| 159 | + with patch.object(Configuration, "GLOBAL_READ", False), patch.object( |
| 160 | + Configuration, "GLOBAL_WRITE", False |
| 161 | + ), patch.object(Configuration, "GLOBAL_ADMIN", False): |
| 162 | + user2 = add_user("user_batch", "password") |
| 163 | + login(client, user2.username, "password") |
| 164 | + |
| 165 | + with client: |
| 166 | + client.get("/") |
| 167 | + assert check_project_permissions(pub_proj, ProjectPermissions.Read) is None |
| 168 | + assert check_project_permissions(priv_proj, ProjectPermissions.Read) == 403 |
| 169 | + |
| 170 | + # Logged-out (anonymous) user |
| 171 | + logout(client) |
| 172 | + |
| 173 | + with client: |
| 174 | + client.get("/") |
| 175 | + assert check_project_permissions(priv_proj, ProjectPermissions.Read) == 404 |
| 176 | + assert check_project_permissions(pub_proj, ProjectPermissions.Read) is None |
0 commit comments