Skip to content

Commit cabf72b

Browse files
Test paginator
1 parent 17c7581 commit cabf72b

File tree

2 files changed

+87
-1
lines changed

2 files changed

+87
-1
lines changed

seam/seam.py

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from typing import Any, Optional, Union, Dict
1+
from typing import Any, Optional, Union, Dict, Callable
22
from typing_extensions import Self
33
from urllib3.util.retry import Retry
44

@@ -7,6 +7,7 @@
77
from .routes import Routes
88
from .models import AbstractSeam
99
from .client import SeamHttpClient
10+
from .paginator import Paginator
1011

1112

1213
class Seam(AbstractSeam):
@@ -89,6 +90,31 @@ def __init__(
8990

9091
Routes.__init__(self, client=self.client, defaults=self.defaults)
9192

93+
def create_paginator(
94+
self, request: Callable[..., Any], params: Optional[Dict[str, Any]] = None
95+
) -> Paginator:
96+
"""
97+
Creates a Paginator instance for iterating through list endpoints.
98+
99+
This is a helper method to simplify the process of paginating through
100+
API results.
101+
102+
Args:
103+
request: The API route method function to call for fetching pages
104+
(e.g., connected_accounts.list).
105+
params: Optional dictionary of initial parameters to pass to the request
106+
function.
107+
108+
Returns:
109+
An initialized Paginator object ready to fetch pages.
110+
111+
Example:
112+
>>> connected_accounts_paginator = seam.create_paginator(seam.connected_accounts.list)
113+
>>> for connected_account in connected_accounts_paginator.flatten():
114+
>>> print(connected_account.account_type_display_name)
115+
"""
116+
return Paginator(request, params)
117+
92118
@classmethod
93119
def from_api_key(
94120
cls,

test/paginator_test.py

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
from seam import Seam
2+
3+
4+
def test_paginator_first_page(seam: Seam):
5+
paginator = seam.create_paginator(
6+
seam.connected_accounts.list, {"limit": 2}
7+
)
8+
connected_accounts, pagination = paginator.first_page()
9+
10+
assert isinstance(connected_accounts, list)
11+
assert len(connected_accounts) == 2
12+
assert pagination is not None
13+
assert pagination.has_next_page is True
14+
assert pagination.next_page_cursor is not None
15+
assert pagination.next_page_url is not None
16+
17+
18+
def test_paginator_next_page(seam: Seam):
19+
paginator = seam.create_paginator(
20+
seam.connected_accounts.list, params={"limit": 2}
21+
)
22+
first_page_accounts, first_pagination = paginator.first_page()
23+
24+
assert len(first_page_accounts) == 2
25+
assert first_pagination.has_next_page is True
26+
27+
next_page_accounts, _ = paginator.next_page(
28+
first_pagination.next_page_cursor
29+
)
30+
31+
assert isinstance(next_page_accounts, list)
32+
assert len(next_page_accounts) == 1
33+
34+
35+
def test_paginator_flatten_to_list(seam: Seam):
36+
all_connected_accounts = seam.connected_accounts.list()
37+
38+
paginator = seam.create_paginator(
39+
seam.connected_accounts.list, params={"limit": 1}
40+
)
41+
paginated_accounts = paginator.flatten_to_list()
42+
43+
assert len(paginated_accounts) > 1
44+
assert len(paginated_accounts) == len(all_connected_accounts)
45+
46+
47+
def test_paginator_flatten(seam: Seam):
48+
all_connected_accounts = seam.connected_accounts.list()
49+
50+
paginator = seam.create_paginator(
51+
seam.connected_accounts.list, params={"limit": 1}
52+
)
53+
54+
collected_accounts = []
55+
for account in paginator.flatten():
56+
collected_accounts.append(account)
57+
58+
59+
assert len(collected_accounts) > 1
60+
assert len(collected_accounts) == len(all_connected_accounts)

0 commit comments

Comments
 (0)