|
2 | 2 | # |
3 | 3 | # SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-MerginMaps-Commercial |
4 | 4 |
|
5 | | -from mergin.sync.tasks import remove_transaction_chunks, remove_unused_chunks |
| 5 | +from mergin.sync.tasks import remove_transaction_chunks |
6 | 6 | from . import DEFAULT_USER |
7 | 7 | from .utils import ( |
8 | 8 | add_user, |
|
22 | 22 | from sqlalchemy.exc import IntegrityError |
23 | 23 | import pytest |
24 | 24 | from datetime import datetime, timedelta, timezone |
| 25 | +import json |
25 | 26 |
|
26 | 27 | from mergin.app import db |
27 | 28 | from mergin.config import Configuration |
28 | | -from mergin.sync.config import Configuration as SyncConfiguration |
29 | 29 | from mergin.sync.errors import ( |
30 | 30 | BigChunkError, |
31 | 31 | ProjectLocked, |
|
51 | 51 | _get_changes_with_diff_0_size, |
52 | 52 | _get_changes_without_added, |
53 | 53 | ) |
| 54 | +from ..sync.interfaces import WorkspaceRole |
54 | 55 |
|
55 | 56 |
|
56 | 57 | def test_schedule_delete_project(client): |
@@ -598,3 +599,81 @@ def test_full_push(client): |
598 | 599 | os.path.join(project.storage.project_dir, "v2", test_file["path"]) |
599 | 600 | ) |
600 | 601 | assert not Upload.query.filter_by(project_id=project.id).first() |
| 602 | + |
| 603 | + |
| 604 | +def test_list_workspace_projects(client): |
| 605 | + admin = User.query.filter_by(username=DEFAULT_USER[0]).first() |
| 606 | + test_workspace = create_workspace() |
| 607 | + url = f"v2/workspaces/{test_workspace.id}/projects" |
| 608 | + for i in range(1, 11): |
| 609 | + create_project(f"project_{i}", test_workspace, admin) |
| 610 | + |
| 611 | + # missing required query params |
| 612 | + assert client.get(url).status_code == 400 |
| 613 | + |
| 614 | + # success |
| 615 | + page = 1 |
| 616 | + per_page = 10 |
| 617 | + response = client.get(url + f"?page={page}&per_page={per_page}") |
| 618 | + resp_data = json.loads(response.data) |
| 619 | + assert response.status_code == 200 |
| 620 | + assert resp_data["count"] == 11 |
| 621 | + assert len(resp_data["projects"]) == per_page |
| 622 | + # correct number on the last page |
| 623 | + page = 4 |
| 624 | + per_page = 3 |
| 625 | + response = client.get(url + f"?page={page}&per_page={per_page}") |
| 626 | + assert response.json["count"] == 11 |
| 627 | + assert len(response.json["projects"]) == 2 |
| 628 | + # name search - more results |
| 629 | + page = 1 |
| 630 | + per_page = 3 |
| 631 | + response = client.get(url + f"?page={page}&per_page={per_page}&q=1") |
| 632 | + assert response.json["count"] == 2 |
| 633 | + assert len(response.json["projects"]) == 2 |
| 634 | + assert response.json["projects"][1]["name"] == "project_10" |
| 635 | + # name search - specific result |
| 636 | + project_name = "project_4" |
| 637 | + response = client.get(url + f"?page={page}&per_page={per_page}&q={project_name}") |
| 638 | + assert response.json["projects"][0]["name"] == project_name |
| 639 | + |
| 640 | + # no permissions to workspace |
| 641 | + user2 = add_user("user", "password") |
| 642 | + login(client, user2.username, "password") |
| 643 | + Configuration.GLOBAL_READ = 0 |
| 644 | + Configuration.GLOBAL_WRITE = 0 |
| 645 | + Configuration.GLOBAL_ADMIN = 0 |
| 646 | + resp = client.get(url + "?page=1&per_page=10") |
| 647 | + assert resp.status_code == 200 |
| 648 | + assert resp.json["count"] == 0 |
| 649 | + |
| 650 | + # no existing workspace |
| 651 | + assert ( |
| 652 | + client.get("/v1/workspace/1234/projects?page=1&per_page=10").status_code == 404 |
| 653 | + ) |
| 654 | + |
| 655 | + # project shared directly |
| 656 | + p = Project.query.filter_by(workspace_id=test_workspace.id).first() |
| 657 | + p.set_role(user2.id, ProjectRole.READER) |
| 658 | + db.session.commit() |
| 659 | + resp = client.get(url + "?page=1&per_page=10") |
| 660 | + resp_data = json.loads(resp.data) |
| 661 | + assert resp_data["count"] == 1 |
| 662 | + assert resp_data["projects"][0]["name"] == p.name |
| 663 | + |
| 664 | + # deactivate project |
| 665 | + p.removed_at = datetime.utcnow() |
| 666 | + db.session.commit() |
| 667 | + resp = client.get(url + "?page=1&per_page=10") |
| 668 | + assert resp.json["count"] == 0 |
| 669 | + |
| 670 | + # add user as a reader |
| 671 | + Configuration.GLOBAL_READ = 1 |
| 672 | + db.session.commit() |
| 673 | + resp = client.get(url + "?page=1&per_page=10") |
| 674 | + assert p.name not in [proj["name"] for proj in resp.json["projects"]] |
| 675 | + assert resp.json["count"] == 10 |
| 676 | + |
| 677 | + # logout |
| 678 | + logout(client) |
| 679 | + assert client.get(url + "?page=1&per_page=10").status_code == 401 |
0 commit comments