11import uuid
2+ import time
23from datetime import datetime , timedelta
4+ from typing import Optional
35
6+ from square .core .api_error import ApiError
47from square .requests .catalog_item import CatalogItemParams
58from square .requests .catalog_item_variation import CatalogItemVariationParams
69from square .requests .catalog_object_item_variation import (
1417from . import helpers
1518
1619
20+ def retry_on_rate_limit (func ):
21+ """Decorator to retry functions on rate limit errors"""
22+ def wrapper (* args , ** kwargs ):
23+ max_retries = 5
24+ base_delay = 2 # seconds
25+
26+ for attempt in range (max_retries ):
27+ try :
28+ return func (* args , ** kwargs )
29+ except ApiError as e :
30+ if e .status_code == 429 and attempt < max_retries - 1 :
31+ delay = base_delay * (2 ** attempt ) # exponential backoff
32+ print (f"Rate limited. Retrying in { delay } seconds..." )
33+ time .sleep (delay )
34+ continue
35+ raise
36+ return None
37+ return wrapper
38+
39+
40+ @retry_on_rate_limit
1741def create_catalog_item_variation () -> str :
1842 client = helpers .test_client ()
1943
@@ -67,7 +91,8 @@ def create_catalog_item_variation() -> str:
6791 return item_variation_ids [0 ]
6892
6993
70- def create_initial_adjustment (item_variation_id : str ):
94+ @retry_on_rate_limit
95+ def create_initial_adjustment (item_variation_id : str ) -> Optional [str ]:
7196 """
7297 Create an initial inventory adjustment and return the physical count ID
7398 """
@@ -91,6 +116,9 @@ def create_initial_adjustment(item_variation_id: str):
91116 ],
92117 )
93118
119+ # Add delay after the first operation
120+ time .sleep (2 )
121+
94122 changes = response .changes
95123 assert changes is not None
96124 assert len (changes ) > 0
@@ -115,6 +143,9 @@ def create_initial_adjustment(item_variation_id: str):
115143 ],
116144 )
117145
146+ # Add delay after the second operation
147+ time .sleep (2 )
148+
118149 physical_changes_response = client .inventory .batch_get_changes (
119150 types = ["PHYSICAL_COUNT" ],
120151 catalog_object_ids = [item_variation_id ],
@@ -133,7 +164,9 @@ def create_initial_adjustment(item_variation_id: str):
133164def test_batch_change_inventory ():
134165 client = helpers .test_client ()
135166 item_variation_id = create_catalog_item_variation ()
167+ time .sleep (2 ) # Add delay after catalog operation
136168 create_initial_adjustment (item_variation_id )
169+ time .sleep (2 ) # Add delay after adjustment
137170
138171 response = client .inventory .batch_create_changes (
139172 idempotency_key = str (uuid .uuid4 ()),
@@ -163,7 +196,9 @@ def test_batch_change_inventory():
163196def test_batch_retrieve_inventory_changes ():
164197 client = helpers .test_client ()
165198 item_variation_id = create_catalog_item_variation ()
199+ time .sleep (2 ) # Add delay after catalog operation
166200 create_initial_adjustment (item_variation_id )
201+ time .sleep (2 ) # Add delay after adjustment
167202
168203 response = client .inventory .batch_get_changes (
169204 catalog_object_ids = [item_variation_id ]
@@ -175,7 +210,9 @@ def test_batch_retrieve_inventory_changes():
175210def test_batch_retrieve_inventory_counts ():
176211 client = helpers .test_client ()
177212 item_variation_id = create_catalog_item_variation ()
213+ time .sleep (2 ) # Add delay after catalog operation
178214 create_initial_adjustment (item_variation_id )
215+ time .sleep (2 ) # Add delay after adjustment
179216
180217 response = client .inventory .batch_get_counts (catalog_object_ids = [item_variation_id ])
181218 assert response .items is not None
@@ -185,7 +222,9 @@ def test_batch_retrieve_inventory_counts():
185222def test_retrieve_inventory_changes ():
186223 client = helpers .test_client ()
187224 item_variation_id = create_catalog_item_variation ()
225+ time .sleep (2 ) # Add delay after catalog operation
188226 create_initial_adjustment (item_variation_id )
227+ time .sleep (2 ) # Add delay after adjustment
189228
190229 response = client .inventory .get (catalog_object_id = item_variation_id )
191230 assert response .items is not None
@@ -195,7 +234,9 @@ def test_retrieve_inventory_changes():
195234def test_retrieve_inventory_counts ():
196235 client = helpers .test_client ()
197236 item_variation_id = create_catalog_item_variation ()
237+ time .sleep (2 ) # Add delay after catalog operation
198238 physical_count_id = create_initial_adjustment (item_variation_id )
239+ time .sleep (2 ) # Add delay after adjustment
199240
200241 response = client .inventory .get_physical_count (physical_count_id = physical_count_id )
201242 assert response .count is not None
@@ -204,7 +245,9 @@ def test_retrieve_inventory_counts():
204245def test_retrieve_inventory_adjustments ():
205246 client = helpers .test_client ()
206247 item_variation_id = create_catalog_item_variation ()
248+ time .sleep (2 ) # Add delay after catalog operation
207249 create_initial_adjustment (item_variation_id )
250+ time .sleep (2 ) # Add delay after adjustment
208251
209252 response = client .inventory .batch_create_changes (
210253 idempotency_key = str (uuid .uuid4 ()),
@@ -230,6 +273,9 @@ def test_retrieve_inventory_adjustments():
230273 assert isinstance (changes [0 ].adjustment , InventoryAdjustment )
231274 assert changes [0 ].adjustment .id is not None
232275 adjustment_id = changes [0 ].adjustment .id
276+
277+ time .sleep (2 ) # Add delay before retrieve
278+
233279 retrieve_response = client .inventory .get_adjustment (adjustment_id = adjustment_id )
234280 retrieve_adjustment = retrieve_response .adjustment
235281 assert retrieve_adjustment is not None
@@ -238,4 +284,4 @@ def test_retrieve_inventory_adjustments():
238284 assert retrieve_adjustment_id is not None
239285
240286 assert retrieve_response .adjustment is not None
241- assert adjustment_id == retrieve_adjustment_id
287+ assert adjustment_id == retrieve_adjustment_id
0 commit comments