feat: register local agent project workspaces
This commit is contained in:
@@ -320,6 +320,81 @@ class AuthenticationTests(unittest.TestCase):
|
||||
self.assertEqual(second_own.status_code, 200, second_own.text)
|
||||
self.assertEqual(second_own.json()["files"], ["two.md"])
|
||||
|
||||
def test_desktop_project_registration_grants_only_selected_folder_to_owner(self) -> None:
|
||||
_first_user, first_token = self._register()
|
||||
_second_user, second_token = self._register()
|
||||
with tempfile.TemporaryDirectory() as directory:
|
||||
root = Path(directory) / "sample-project"
|
||||
root.mkdir()
|
||||
(root / "README.md").write_text("project details", encoding="utf-8")
|
||||
first_headers = {"Authorization": f"Bearer {first_token}"}
|
||||
second_headers = {"Authorization": f"Bearer {second_token}"}
|
||||
|
||||
registered = self.client.post(
|
||||
"/v1/agent/projects",
|
||||
headers=first_headers,
|
||||
json={"workspace_path": str(root)},
|
||||
)
|
||||
first_files = self.client.post(
|
||||
"/v1/agent/workspace/files",
|
||||
headers=first_headers,
|
||||
json={"workspace_path": str(root)},
|
||||
)
|
||||
second_files = self.client.post(
|
||||
"/v1/agent/workspace/files",
|
||||
headers=second_headers,
|
||||
json={"workspace_path": str(root)},
|
||||
)
|
||||
overlap_registration = self.client.post(
|
||||
"/v1/agent/projects",
|
||||
headers=second_headers,
|
||||
json={"workspace_path": str(root.parent)},
|
||||
)
|
||||
revoked = self.client.request(
|
||||
"DELETE",
|
||||
"/v1/agent/projects",
|
||||
headers=first_headers,
|
||||
json={"workspace_path": str(root)},
|
||||
)
|
||||
after_revoke = self.client.post(
|
||||
"/v1/agent/workspace/files",
|
||||
headers=first_headers,
|
||||
json={"workspace_path": str(root)},
|
||||
)
|
||||
|
||||
self.assertEqual(registered.status_code, 201, registered.text)
|
||||
self.assertEqual(registered.json()["files"], ["README.md"])
|
||||
self.assertEqual(first_files.status_code, 200, first_files.text)
|
||||
self.assertEqual(second_files.status_code, 403, second_files.text)
|
||||
self.assertEqual(overlap_registration.status_code, 409, overlap_registration.text)
|
||||
self.assertEqual(revoked.status_code, 200, revoked.text)
|
||||
self.assertTrue(revoked.json()["removed"])
|
||||
self.assertEqual(after_revoke.status_code, 403, after_revoke.text)
|
||||
|
||||
def test_deleted_project_folder_can_still_be_unregistered(self) -> None:
|
||||
_user_id, token = self._register()
|
||||
with tempfile.TemporaryDirectory() as directory:
|
||||
root = Path(directory) / "vanished-project"
|
||||
root.mkdir()
|
||||
headers = {"Authorization": f"Bearer {token}"}
|
||||
registered = self.client.post(
|
||||
"/v1/agent/projects",
|
||||
headers=headers,
|
||||
json={"workspace_path": str(root)},
|
||||
)
|
||||
self.assertEqual(registered.status_code, 201, registered.text)
|
||||
root.rmdir()
|
||||
|
||||
revoked = self.client.request(
|
||||
"DELETE",
|
||||
"/v1/agent/projects",
|
||||
headers=headers,
|
||||
json={"workspace_path": str(root)},
|
||||
)
|
||||
|
||||
self.assertEqual(revoked.status_code, 200, revoked.text)
|
||||
self.assertTrue(revoked.json()["removed"])
|
||||
|
||||
def test_local_bootstrap_is_restricted_to_loopback_clients(self) -> None:
|
||||
remote_client = TestClient(app, client=("192.0.2.10", 43210))
|
||||
remote = remote_client.post("/v1/auth/local-session", json={})
|
||||
|
||||
Reference in New Issue
Block a user