diff --git a/gns3server/controller/project.py b/gns3server/controller/project.py index d6563ead0..01506a734 100644 --- a/gns3server/controller/project.py +++ b/gns3server/controller/project.py @@ -2141,6 +2141,10 @@ class Project: Check if all items in a project are locked and not """ + if not self._drawings and not self._nodes: + # a project without drawings or nodes has nothing to lock and would + # otherwise always report as locked, even after unlocking it + return False for drawing in self._drawings.values(): if not drawing.locked: return False diff --git a/tests/api/routes/controller/test_projects.py b/tests/api/routes/controller/test_projects.py index aa7ae8d36..c5d32922a 100644 --- a/tests/api/routes/controller/test_projects.py +++ b/tests/api/routes/controller/test_projects.py @@ -613,3 +613,29 @@ class TestControllerProjectRoutes: assert drawing.locked is False for node in project.nodes.values(): assert node.locked is False + + response = await client.get(app.url_path_for("locked_project", project_id=project.id)) + assert response.status_code == status.HTTP_200_OK + assert response.json() is False + + async def test_lock_unlock_empty_project(self, app: FastAPI, client: AsyncClient, project: Project) -> None: + + # a project without drawings or nodes has nothing to lock and must + # never report as locked, otherwise it could not be unlocked + response = await client.get(app.url_path_for("locked_project", project_id=project.id)) + assert response.status_code == status.HTTP_200_OK + assert response.json() is False + + response = await client.post(app.url_path_for("lock_project", project_id=project.id)) + assert response.status_code == status.HTTP_204_NO_CONTENT + + response = await client.get(app.url_path_for("locked_project", project_id=project.id)) + assert response.status_code == status.HTTP_200_OK + assert response.json() is False + + response = await client.post(app.url_path_for("unlock_project", project_id=project.id)) + assert response.status_code == status.HTTP_204_NO_CONTENT + + response = await client.get(app.url_path_for("locked_project", project_id=project.id)) + assert response.status_code == status.HTTP_200_OK + assert response.json() is False