1+ """Tests for pagination helper functionality."""
2+
3+ import pytest
4+ from gradient ._utils import PaginationHelper
5+
6+
7+ class TestPaginationHelper :
8+ """Test pagination helper functionality."""
9+
10+ def test_pagination_helper_basic (self ):
11+ """Test basic pagination functionality."""
12+ helper = PaginationHelper (page_size = 2 , max_pages = 3 )
13+
14+ # Mock responses with different pages
15+ responses = [
16+ {"data" : ["item1" , "item2" ]}, # Page 1
17+ {"data" : ["item3" , "item4" ]}, # Page 2
18+ {"data" : ["item5" ]}, # Page 3 (partial)
19+ ]
20+ response_index = 0
21+
22+ def mock_fetch (params ):
23+ nonlocal response_index
24+ if response_index < len (responses ):
25+ result = responses [response_index ]
26+ response_index += 1
27+ return result
28+ return {"data" : []}
29+
30+ result = helper .paginate (mock_fetch )
31+ assert result == ["item1" , "item2" , "item3" , "item4" , "item5" ]
32+
33+ def test_pagination_helper_max_pages (self ):
34+ """Test pagination with max pages limit."""
35+ helper = PaginationHelper (page_size = 2 , max_pages = 2 )
36+
37+ responses = [
38+ {"data" : ["item1" , "item2" ]},
39+ {"data" : ["item3" , "item4" ]},
40+ {"data" : ["item5" , "item6" ]}, # Should not be reached
41+ ]
42+ response_index = 0
43+
44+ def mock_fetch (params ):
45+ nonlocal response_index
46+ if response_index < len (responses ):
47+ result = responses [response_index ]
48+ response_index += 1
49+ return result
50+ return {"data" : []}
51+
52+ result = helper .paginate (mock_fetch )
53+ assert result == ["item1" , "item2" , "item3" , "item4" ]
54+
55+ def test_pagination_helper_empty_response (self ):
56+ """Test pagination with empty response."""
57+ helper = PaginationHelper (page_size = 2 )
58+
59+ def mock_fetch (params ):
60+ return {"data" : []}
61+
62+ result = helper .paginate (mock_fetch )
63+ assert result == []
64+
65+ def test_pagination_helper_different_response_formats (self ):
66+ """Test pagination with different response formats."""
67+ helper = PaginationHelper (page_size = 2 )
68+
69+ # Test different response formats
70+ test_cases = [
71+ {"data" : ["item1" , "item2" ]},
72+ {"items" : ["item3" , "item4" ]},
73+ {"results" : ["item5" , "item6" ]},
74+ ["item7" , "item8" ], # Direct list
75+ ]
76+
77+ for i , expected_format in enumerate (test_cases ):
78+ response_index = 0
79+
80+ def mock_fetch (params ):
81+ nonlocal response_index
82+ if response_index == 0 :
83+ response_index += 1
84+ return expected_format
85+ return {"data" : []}
86+
87+ result = helper .paginate (mock_fetch )
88+ expected_items = expected_format if isinstance (expected_format , list ) else expected_format .get (
89+ list (expected_format .keys ())[0 ], []
90+ )
91+ assert result == expected_items
92+
93+ def test_pagination_helper_extract_items (self ):
94+ """Test item extraction from different response formats."""
95+ helper = PaginationHelper ()
96+
97+ # Test various response formats
98+ test_responses = [
99+ type ('MockResponse' , (), {'data' : ['item1' ]})(),
100+ type ('MockResponse' , (), {'items' : ['item2' ]})(),
101+ type ('MockResponse' , (), {'results' : ['item3' ]})(),
102+ ['item4' ],
103+ {'data' : ['item5' ]},
104+ {'unknown' : ['should_be_empty' ]},
105+ ]
106+
107+ for i , response in enumerate (test_responses ):
108+ items = helper ._extract_items (response )
109+ expected_items = [f'item{ i + 1 } ' ] if i < 5 else []
110+ assert items == expected_items
0 commit comments