arcade-mcp/toolkits/dropbox/tests/test_list_items.py
Renato Byrro c1e8fc795a
Dropbox Toolkit (#332)
Basic tools to list items in a folder, search for files / folders, and
download a file content.
2025-03-27 18:34:10 -03:00

145 lines
3.9 KiB
Python

from unittest.mock import MagicMock
import httpx
import pytest
from arcade_dropbox.tools.browse import list_items_in_folder
from arcade_dropbox.utils import clean_dropbox_entries
@pytest.mark.asyncio
async def test_list_items_success_empty_folder(
mock_context,
mock_httpx_client,
):
mock_httpx_response = MagicMock(spec=httpx.Response)
mock_httpx_response.status_code = 200
mock_httpx_response.json.return_value = {"entries": [], "cursor": None, "has_more": False}
mock_httpx_client.post.return_value = mock_httpx_response
tool_response = await list_items_in_folder(
context=mock_context,
folder_path="/path/to/folder",
)
assert tool_response == {
"items": [],
"cursor": None,
"has_more": False,
}
@pytest.mark.asyncio
async def test_list_items_success_with_folder_entries(
mock_context,
mock_httpx_client,
sample_folder_entry,
sample_file_entry,
):
entries = [sample_folder_entry, sample_file_entry]
mock_httpx_response = MagicMock(spec=httpx.Response)
mock_httpx_response.status_code = 200
mock_httpx_response.json.return_value = {"entries": entries, "cursor": None, "has_more": False}
mock_httpx_client.post.return_value = mock_httpx_response
tool_response = await list_items_in_folder(
context=mock_context,
folder_path="/path/to/folder",
)
assert tool_response == {
"items": clean_dropbox_entries(entries),
"cursor": None,
"has_more": False,
}
@pytest.mark.asyncio
async def test_list_items_success_with_more_items_to_paginate(
mock_context,
mock_httpx_client,
sample_folder_entry,
sample_file_entry,
):
entries = [sample_folder_entry, sample_file_entry]
mock_httpx_response = MagicMock(spec=httpx.Response)
mock_httpx_response.status_code = 200
mock_httpx_response.json.return_value = {
"entries": entries,
"cursor": "cursor",
"has_more": True,
}
mock_httpx_client.post.return_value = mock_httpx_response
tool_response = await list_items_in_folder(
context=mock_context,
folder_path="/path/to/folder",
)
assert tool_response == {
"items": clean_dropbox_entries(entries),
"cursor": "cursor",
"has_more": True,
}
@pytest.mark.asyncio
async def test_list_items_success_providing_cursor(
mock_context,
mock_httpx_client,
sample_folder_entry,
sample_file_entry,
):
entries = [sample_folder_entry, sample_file_entry]
mock_httpx_response = MagicMock(spec=httpx.Response)
mock_httpx_response.status_code = 200
mock_httpx_response.json.return_value = {
"entries": entries,
"cursor": "cursor2",
"has_more": True,
}
mock_httpx_client.post.return_value = mock_httpx_response
tool_response = await list_items_in_folder(
context=mock_context,
folder_path="/path/to/folder",
cursor="cursor1",
limit=2,
)
assert tool_response == {
"items": clean_dropbox_entries(entries),
"cursor": "cursor2",
"has_more": True,
}
# Check that the request was made with the cursor and not the other arguments
mock_httpx_client.post.assert_called_with(
url="https://api.dropboxapi.com/2/files/list_folder/continue",
headers={"Authorization": "Bearer fake-token"},
json={"cursor": "cursor1"},
)
@pytest.mark.asyncio
async def test_list_items_path_not_found(
mock_context,
mock_httpx_client,
):
mock_httpx_response = MagicMock(spec=httpx.Response)
mock_httpx_response.status_code = 409
mock_httpx_response.json.return_value = {"error_summary": "path/not_found"}
mock_httpx_client.post.return_value = mock_httpx_response
tool_response = await list_items_in_folder(
context=mock_context,
folder_path="/not/exist/folder",
)
assert tool_response == {
"error": "The specified path was not found by Dropbox",
}