|
1 | 1 | # Copyright (C) Lutra Consulting Limited |
2 | 2 | # |
3 | 3 | # SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-MerginMaps-Commercial |
4 | | -from .utils import add_user |
| 4 | +from datetime import datetime |
| 5 | + |
| 6 | +from . import DEFAULT_USER |
| 7 | +from .utils import ( |
| 8 | + add_user, |
| 9 | + login, |
| 10 | + login_as_admin, |
| 11 | + create_workspace, |
| 12 | + create_project, |
| 13 | + upload_file_to_project, |
| 14 | +) |
5 | 15 | from ..app import db |
6 | 16 | from mergin.sync.models import Project |
7 | 17 | from tests import test_project, test_workspace_id |
8 | 18 |
|
| 19 | +from ..auth.models import User |
9 | 20 | from ..config import Configuration |
10 | 21 | from ..sync.models import ProjectRole |
11 | 22 |
|
@@ -126,3 +137,69 @@ def test_project_members(client): |
126 | 137 | # access provided by workspace role cannot be removed directly |
127 | 138 | response = client.delete(url + f"/{user.id}") |
128 | 139 | assert response.status_code == 404 |
| 140 | + |
| 141 | + |
| 142 | +def test_get_project(client): |
| 143 | + """Test get project info endpoint""" |
| 144 | + admin = User.query.filter_by(username=DEFAULT_USER[0]).first() |
| 145 | + test_workspace = create_workspace() |
| 146 | + project = create_project("new_project", test_workspace, admin) |
| 147 | + add_user("test_user", "ilovemergin") |
| 148 | + login(client, "test_user", "ilovemergin") |
| 149 | + # lack of permissions |
| 150 | + response = client.get(f"v2/projects/{project.id}") |
| 151 | + assert response.status_code == 403 |
| 152 | + # access public project |
| 153 | + project.public = True |
| 154 | + db.session.commit() |
| 155 | + response = client.get(f"v2/projects/{project.id}") |
| 156 | + assert response.status_code == 200 |
| 157 | + assert response.json["public"] is True |
| 158 | + # project scheduled for deletion |
| 159 | + login_as_admin(client) |
| 160 | + project.public = False |
| 161 | + project.removed_at = datetime.utcnow() |
| 162 | + db.session.commit() |
| 163 | + response = client.get(f"v2/projects/{project.id}") |
| 164 | + assert response.status_code == 404 |
| 165 | + # success |
| 166 | + project.removed_at = None |
| 167 | + db.session.commit() |
| 168 | + response = client.get(f"v2/projects/{project.id}") |
| 169 | + assert response.status_code == 200 |
| 170 | + expected_keys = { |
| 171 | + "id", |
| 172 | + "name", |
| 173 | + "workspace", |
| 174 | + "role", |
| 175 | + "version", |
| 176 | + "created_at", |
| 177 | + "updated_at", |
| 178 | + "public", |
| 179 | + "size", |
| 180 | + } |
| 181 | + assert expected_keys == response.json.keys() |
| 182 | + # create new versions |
| 183 | + files = ["test.txt", "test3.txt", "test.qgs"] |
| 184 | + for file in files: |
| 185 | + upload_file_to_project(project, file, client) |
| 186 | + # project version does not exist |
| 187 | + response = client.get( |
| 188 | + f"v2/projects/{project.id}?files_at_version=v{project.latest_version+1}" |
| 189 | + ) |
| 190 | + assert response.status_code == 404 |
| 191 | + # files |
| 192 | + response = client.get( |
| 193 | + f"v2/projects/{project.id}?files_at_version=v{project.latest_version-2}" |
| 194 | + ) |
| 195 | + assert response.status_code == 200 |
| 196 | + assert len(response.json["files"]) == 1 |
| 197 | + assert any(resp_files["path"] == files[0] for resp_files in response.json["files"]) |
| 198 | + assert not any( |
| 199 | + resp_files["path"] == files[1] for resp_files in response.json["files"] |
| 200 | + ) |
| 201 | + response = client.get( |
| 202 | + f"v2/projects/{project.id}?files_at_version=v{project.latest_version}" |
| 203 | + ) |
| 204 | + assert len(response.json["files"]) == 3 |
| 205 | + assert {f["path"] for f in response.json["files"]} == set(files) |
0 commit comments