8
8
import pytest
9
9
import requests
10
10
11
+ from airbyte_cdk .sources .declarative .extractors import DpathExtractor
11
12
from airbyte_cdk .sources .declarative .requesters .paginators .strategies .offset_increment import (
12
13
OffsetIncrement ,
13
14
)
14
15
15
16
16
17
@pytest .mark .parametrize (
17
- "page_size, parameters, last_page_size, last_record, last_page_token_value, expected_next_page_token, expected_offset" ,
18
+ "page_size, parameters, response_results, last_page_size, last_record, last_page_token_value, expected_next_page_token, expected_offset" ,
18
19
[
19
- pytest .param ("2" , {}, 2 , {"id" : 1 }, 4 , 6 , 2 , id = "test_same_page_size" ),
20
- pytest .param (2 , {}, 2 , {"id" : 1 }, 4 , 6 , 2 , id = "test_same_page_size" ),
20
+ pytest .param (
21
+ "2" , {}, [{"id" : 1 }, {"id" : 2 }], 2 , {"id" : 2 }, 4 , 6 , 2 , id = "test_same_page_size"
22
+ ),
23
+ pytest .param (
24
+ 2 , {}, [{"id" : 1 }, {"id" : 2 }], 2 , {"id" : 2 }, 4 , 6 , 2 , id = "test_same_page_size"
25
+ ),
21
26
pytest .param (
22
27
"{{ parameters['page_size'] }}" ,
23
28
{"page_size" : 3 },
29
+ [{"id" : 1 }, {"id" : 2 }],
24
30
2 ,
25
31
{"id" : 1 },
26
32
3 ,
27
33
None ,
28
34
0 ,
29
35
id = "test_larger_page_size" ,
30
36
),
31
- pytest .param (None , {}, 0 , [], 3 , None , 0 , id = "test_stop_if_no_records" ),
37
+ pytest .param (None , {}, [], 0 , [], 3 , None , 0 , id = "test_stop_if_no_records" ),
32
38
pytest .param (
33
39
"{{ response['page_metadata']['limit'] }}" ,
34
40
{},
41
+ [{"id" : 1 }, {"id" : 2 }],
35
42
2 ,
36
- {"id" : 1 },
43
+ {"id" : 2 },
37
44
3 ,
38
45
None ,
39
46
0 ,
40
47
id = "test_page_size_from_response" ,
41
48
),
42
49
pytest .param (
43
- 2 , {}, 2 , {"id" : 1 }, None , 2 , 2 , id = "test_get_second_page_with_first_page_not_injected"
50
+ 2 ,
51
+ {},
52
+ [{"id" : 1 }, {"id" : 2 }],
53
+ 2 ,
54
+ {"id" : 2 },
55
+ None ,
56
+ 2 ,
57
+ 2 ,
58
+ id = "test_get_second_page_with_first_page_not_injected" ,
44
59
),
45
60
],
46
61
)
47
62
def test_offset_increment_paginator_strategy (
48
63
page_size ,
49
64
parameters ,
65
+ response_results ,
50
66
last_page_size ,
51
67
last_record ,
52
68
last_page_token_value ,
53
69
expected_next_page_token ,
54
70
expected_offset ,
55
71
):
56
- paginator_strategy = OffsetIncrement (page_size = page_size , parameters = parameters , config = {})
72
+ extractor = DpathExtractor (field_path = ["results" ], parameters = {}, config = {})
73
+ paginator_strategy = OffsetIncrement (
74
+ page_size = page_size , extractor = extractor , parameters = parameters , config = {}
75
+ )
57
76
58
77
response = requests .Response ()
59
78
60
79
response .headers = {"A_HEADER" : "HEADER_VALUE" }
61
- response_body = {"next" : "https://airbyte.io/next_url" , "page_metadata" : {"limit" : 5 }}
80
+ response_body = {
81
+ "results" : response_results ,
82
+ "next" : "https://airbyte.io/next_url" ,
83
+ "page_metadata" : {"limit" : 5 },
84
+ }
62
85
response ._content = json .dumps (response_body ).encode ("utf-8" )
63
86
64
87
next_page_token = paginator_strategy .next_page_token (
@@ -73,9 +96,28 @@ def test_offset_increment_paginator_strategy(
73
96
assert expected_next_page_token == next_page_token
74
97
75
98
99
+ def test_offset_increment_response_without_record_path ():
100
+ extractor = DpathExtractor (field_path = ["results" ], parameters = {}, config = {})
101
+ paginator_strategy = OffsetIncrement (page_size = 2 , extractor = extractor , parameters = {}, config = {})
102
+
103
+ response = requests .Response ()
104
+
105
+ response .headers = {"A_HEADER" : "HEADER_VALUE" }
106
+ response_body = {"next" : "https://airbyte.io/next_url" , "page_metadata" : {"limit" : 5 }}
107
+ response ._content = json .dumps (response_body ).encode ("utf-8" )
108
+
109
+ next_page_token = paginator_strategy .next_page_token (response , 2 , None , 4 )
110
+ assert next_page_token is None
111
+
112
+ # Validate that the PaginationStrategy is stateless and calling next_page_token() again returns the same result
113
+ next_page_token = paginator_strategy .next_page_token (response , 2 , None , 4 )
114
+ assert next_page_token is None
115
+
116
+
76
117
def test_offset_increment_paginator_strategy_rises ():
77
118
paginator_strategy = OffsetIncrement (
78
119
page_size = "{{ parameters['page_size'] }}" ,
120
+ extractor = DpathExtractor (field_path = ["results" ], parameters = {}, config = {}),
79
121
parameters = {"page_size" : "invalid value" },
80
122
config = {},
81
123
)
@@ -94,8 +136,13 @@ def test_offset_increment_paginator_strategy_rises():
94
136
def test_offset_increment_paginator_strategy_initial_token (
95
137
inject_on_first_request : bool , expected_initial_token : Optional [Any ]
96
138
):
139
+ extractor = DpathExtractor (field_path = ["" ], parameters = {}, config = {})
97
140
paginator_strategy = OffsetIncrement (
98
- page_size = 20 , parameters = {}, config = {}, inject_on_first_request = inject_on_first_request
141
+ page_size = 20 ,
142
+ extractor = extractor ,
143
+ parameters = {},
144
+ config = {},
145
+ inject_on_first_request = inject_on_first_request ,
99
146
)
100
147
101
148
assert paginator_strategy .initial_token == expected_initial_token
0 commit comments