"""Unit tests for search_usernames — Fragment marketplace username search.""" from unittest.mock import AsyncMock, patch import pytest from pyfragment import FragmentClient from pyfragment.types import UsernamesResult from tests.shared import FAKE_HASH FAKE_HTML = """
@coolname
On auction
5
On auction
""" # search_usernames mocked tests @pytest.mark.asyncio async def test_search_usernames_basic(client: FragmentClient) -> None: with ( patch("pyfragment.methods.search_usernames.get_fragment_hash", AsyncMock(return_value=FAKE_HASH)), patch( "pyfragment.methods.search_usernames.fragment_request", AsyncMock(return_value={"ok": True, "html": FAKE_HTML}), ), ): result = await client.search_usernames("coolname") assert isinstance(result, UsernamesResult) assert len(result.items) == 1 assert result.items[0]["slug"] == "username/coolname" assert result.items[0]["name"] == "@coolname" assert result.items[0]["date"] == "2026-06-01T12:00:00+00:00" assert result.next_offset_id is None @pytest.mark.asyncio async def test_search_usernames_empty_html(client: FragmentClient) -> None: with ( patch("pyfragment.methods.search_usernames.get_fragment_hash", AsyncMock(return_value=FAKE_HASH)), patch( "pyfragment.methods.search_usernames.fragment_request", AsyncMock(return_value={"ok": True}), ), ): result = await client.search_usernames("zzz_no_results") assert isinstance(result, UsernamesResult) assert result.items == [] assert result.next_offset_id is None @pytest.mark.asyncio async def test_search_usernames_with_sort_and_filter(client: FragmentClient) -> None: with ( patch("pyfragment.methods.search_usernames.get_fragment_hash", AsyncMock(return_value=FAKE_HASH)), patch( "pyfragment.methods.search_usernames.fragment_request", AsyncMock(return_value={"ok": True, "html": FAKE_HTML}), ) as mock_request, ): result = await client.search_usernames("durov", sort="price_desc", filter="auction") assert isinstance(result, UsernamesResult) call_data = mock_request.call_args[0][3] assert call_data["type"] == "usernames" assert call_data["method"] == "searchAuctions" assert call_data["sort"] == "price_desc" assert call_data["filter"] == "auction" assert call_data["query"] == "durov" @pytest.mark.asyncio async def test_search_usernames_with_offset_id(client: FragmentClient) -> None: with ( patch("pyfragment.methods.search_usernames.get_fragment_hash", AsyncMock(return_value=FAKE_HASH)), patch( "pyfragment.methods.search_usernames.fragment_request", AsyncMock(return_value={"ok": True, "html": FAKE_HTML, "next_offset_id": "offset_99"}), ) as mock_request, ): result = await client.search_usernames("durov", offset_id="offset_10") assert isinstance(result, UsernamesResult) assert result.next_offset_id == "offset_99" call_data = mock_request.call_args[0][3] assert call_data["offset_id"] == "offset_10" @pytest.mark.asyncio async def test_search_usernames_default_query(client: FragmentClient) -> None: with ( patch("pyfragment.methods.search_usernames.get_fragment_hash", AsyncMock(return_value=FAKE_HASH)), patch( "pyfragment.methods.search_usernames.fragment_request", AsyncMock(return_value={"ok": True, "html": FAKE_HTML}), ) as mock_request, ): result = await client.search_usernames() assert isinstance(result, UsernamesResult) call_data = mock_request.call_args[0][3] assert call_data["query"] == "" assert call_data["type"] == "usernames"