208 lines
7.0 KiB
Python
208 lines
7.0 KiB
Python
import pytest
|
|
|
|
from sdks.python.src.honcho.client import Honcho
|
|
from sdks.python.src.honcho.pagination import AsyncPage, SyncPage
|
|
from sdks.python.src.honcho.peer import Peer
|
|
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_page_get_next_page(
|
|
client_fixture: tuple[Honcho, str],
|
|
):
|
|
"""
|
|
Tests that Page.get_next_page() works correctly for both sync and async clients.
|
|
"""
|
|
honcho_client, client_type = client_fixture
|
|
|
|
if client_type == "async":
|
|
# Create multiple peers to test pagination
|
|
for i in range(15):
|
|
peer = await honcho_client.aio.peer(id=f"pagination-test-peer-async-{i}")
|
|
await peer.aio.get_metadata() # Create the peer
|
|
|
|
# Get first page
|
|
first_page = await honcho_client.aio.peers()
|
|
assert isinstance(first_page, AsyncPage)
|
|
assert len(first_page.items) > 0
|
|
|
|
# If there's a next page, test get_next_page()
|
|
if first_page.has_next_page():
|
|
second_page = await first_page.get_next_page()
|
|
assert second_page is not None
|
|
assert isinstance(second_page, AsyncPage)
|
|
assert second_page.page == 2
|
|
else:
|
|
# Create multiple peers to test pagination
|
|
for i in range(15):
|
|
peer = honcho_client.peer(id=f"pagination-test-peer-{i}")
|
|
peer.get_metadata() # Create the peer
|
|
|
|
# Get first page
|
|
first_page = honcho_client.peers()
|
|
assert isinstance(first_page, SyncPage)
|
|
assert len(first_page.items) > 0
|
|
|
|
# If there's a next page, test get_next_page()
|
|
if first_page.has_next_page():
|
|
second_page = first_page.get_next_page()
|
|
assert second_page is not None
|
|
assert isinstance(second_page, SyncPage)
|
|
assert second_page.page == 2
|
|
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_page_transform_preserved_across_pages(
|
|
client_fixture: tuple[Honcho, str],
|
|
):
|
|
"""
|
|
Tests that transformation function is preserved when getting next page.
|
|
"""
|
|
honcho_client, client_type = client_fixture
|
|
|
|
if client_type == "async":
|
|
# Create multiple peers to ensure pagination
|
|
for i in range(25):
|
|
peer = await honcho_client.aio.peer(id=f"transform-test-peer-async-{i}")
|
|
await peer.aio.get_metadata()
|
|
|
|
# Get first page
|
|
first_page = await honcho_client.aio.peers()
|
|
assert isinstance(first_page, AsyncPage)
|
|
|
|
# Verify items are Peer instances (transformed)
|
|
for item in first_page.items:
|
|
assert isinstance(item, Peer)
|
|
|
|
# Get next page and verify transformation is preserved
|
|
if first_page.has_next_page():
|
|
second_page = await first_page.get_next_page()
|
|
assert second_page is not None
|
|
for item in second_page.items:
|
|
assert isinstance(item, Peer)
|
|
else:
|
|
# Create multiple peers to ensure pagination
|
|
for i in range(25):
|
|
peer = honcho_client.peer(id=f"transform-test-peer-{i}")
|
|
peer.get_metadata()
|
|
|
|
# Get first page
|
|
first_page = honcho_client.peers()
|
|
assert isinstance(first_page, SyncPage)
|
|
|
|
# Verify items are Peer instances (transformed)
|
|
for item in first_page.items:
|
|
assert isinstance(item, Peer)
|
|
|
|
# Get next page and verify transformation is preserved
|
|
if first_page.has_next_page():
|
|
second_page = first_page.get_next_page()
|
|
assert second_page is not None
|
|
for item in second_page.items:
|
|
assert isinstance(item, Peer)
|
|
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_page_get_next_page_throws_exception_on_last_page(
|
|
client_fixture: tuple[Honcho, str],
|
|
):
|
|
"""
|
|
Tests that get_next_page() throws RuntimeError when on the last page.
|
|
"""
|
|
honcho_client, client_type = client_fixture
|
|
|
|
if client_type == "async":
|
|
# Create just a few peers to ensure we're on the last page
|
|
for i in range(3):
|
|
peer = await honcho_client.aio.peer(id=f"last-page-test-peer-async-{i}")
|
|
await peer.aio.get_metadata()
|
|
|
|
# Get first page
|
|
first_page = await honcho_client.aio.peers()
|
|
assert isinstance(first_page, AsyncPage)
|
|
|
|
# Should be on last page (or only page)
|
|
if not first_page.has_next_page():
|
|
# get_next_page should throw runtime error
|
|
try:
|
|
await first_page.get_next_page()
|
|
except Exception as e:
|
|
assert isinstance(e, RuntimeError)
|
|
else:
|
|
# Create just a few peers to ensure we're on the last page
|
|
for i in range(3):
|
|
peer = honcho_client.peer(id=f"last-page-test-peer-{i}")
|
|
peer.get_metadata()
|
|
|
|
# Get first page
|
|
first_page = honcho_client.peers()
|
|
assert isinstance(first_page, SyncPage)
|
|
|
|
# Should be on last page (or only page)
|
|
if not first_page.has_next_page():
|
|
# get_next_page should throw runtime error
|
|
try:
|
|
first_page.get_next_page()
|
|
except Exception as e:
|
|
assert isinstance(e, RuntimeError)
|
|
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_page_manual_pagination(
|
|
client_fixture: tuple[Honcho, str],
|
|
):
|
|
"""
|
|
Tests manual pagination with get_next_page.
|
|
"""
|
|
honcho_client, client_type = client_fixture
|
|
|
|
if client_type == "async":
|
|
# Create enough peers to ensure multiple pages
|
|
for i in range(25):
|
|
peer = await honcho_client.aio.peer(
|
|
id=f"manual-pagination-test-peer-async-{i}"
|
|
)
|
|
await peer.aio.get_metadata()
|
|
|
|
# Collect items via manual pagination
|
|
manual_items = []
|
|
manual_page = await honcho_client.aio.peers()
|
|
page_count = 0
|
|
|
|
while manual_page is not None:
|
|
page_count += 1
|
|
manual_items.extend(manual_page.items) # pyright: ignore
|
|
|
|
if not manual_page.has_next_page():
|
|
break
|
|
|
|
manual_page = await manual_page.get_next_page()
|
|
|
|
# Should have collected all items
|
|
assert len(manual_items) >= 25 # pyright: ignore
|
|
# All items should be Peer instances
|
|
assert all(isinstance(item, Peer) for item in manual_items) # pyright: ignore
|
|
else:
|
|
# Create enough peers to ensure multiple pages
|
|
for i in range(25):
|
|
peer = honcho_client.peer(id=f"manual-pagination-test-peer-{i}")
|
|
peer.get_metadata()
|
|
|
|
# Collect items via manual pagination
|
|
manual_items = []
|
|
manual_page = honcho_client.peers()
|
|
page_count = 0
|
|
|
|
while manual_page is not None:
|
|
page_count += 1
|
|
manual_items.extend(manual_page.items) # pyright: ignore
|
|
|
|
if not manual_page.has_next_page():
|
|
break
|
|
|
|
manual_page = manual_page.get_next_page()
|
|
|
|
# Should have collected all items
|
|
assert len(manual_items) >= 25 # pyright: ignore
|
|
# All items should be Peer instances
|
|
assert all(isinstance(item, Peer) for item in manual_items) # pyright: ignore
|