Skip to content

Commit

Permalink
update behaviour for 1 second window size
Browse files Browse the repository at this point in the history
  • Loading branch information
RushiT0122 committed May 23, 2023
1 parent 83f14e4 commit bb081e1
Show file tree
Hide file tree
Showing 2 changed files with 25 additions and 11 deletions.
4 changes: 4 additions & 0 deletions tap_zendesk/streams.py
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,10 @@ def __init__(self, client=None, config=None):
else:
self.request_timeout = REQUEST_TIMEOUT # If value is 0,"0","" or not passed then it set default to 300 seconds.

# To avoid infinite loop behavior we should not configure search window less than 2
if config.get('search_window_size') and int(config.get('search_window_size')) < 2:
raise ValueError('Search window size cannot be less than 2')

def get_bookmark(self, state):
return utils.strptime_with_tz(singer.get_bookmark(state, self.name, self.replication_key))

Expand Down
32 changes: 21 additions & 11 deletions test/unittests/test_user_infinite_loop.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,14 +7,15 @@
import datetime
from dateutil import tz


class MockSearch:
def __init__(self):
self.count = 1001
self.updated_at = "test"

def __iter__(self):
return (self for x in range(4))

def search(self, test, updated_after, updated_before, type="user" ):
# For window size less than 2 return less than or equal to 1000 records and for larger window return greater than 1000 records
if (singer.strptime(updated_before) - singer.strptime(updated_after)).seconds < 2:
Expand All @@ -30,31 +31,40 @@ def test_many_records_in_one_seconds_for_user(self, mocked_now):
Reproduce infinite looping behavior for Users stream when user have many record in single seconds
"""
user_obj = Users(MockSearch(), {})

with self.assertRaises(Exception) as e:
l = list(user_obj.sync({'bookmarks': {'users': {'updated_at': '2022-03-30T08:45:21.000000Z'}}}))

self.assertEqual(str(e.exception), 'users - Unable to get all users within minimum window of a single second (2022-03-30T08:45:21Z), found 1001 users within this timestamp. Zendesk can only provide a maximum of 1000 users per request. See: https://develop.zendesk.com/hc/en-us/articles/360022563994--BREAKING-New-Search-API-Result-Limits')

def test_many_records_in_one_seconds_for_user_with_3_sec_window(self):
"""
To verify that if user give 3 seconds window then also we don't get infinite loop behavior
"""
user_obj = Users(client=MockSearch(), config={'search_window_size': 3})

with self.assertRaises(Exception) as e:
l = list(user_obj.sync({'bookmarks': {'users': {'updated_at': '2022-03-30T08:45:21.000000Z'}}}))

self.assertEqual(str(e.exception), 'users - Unable to get all users within minimum window of a single second (2022-03-30T08:45:21Z), found 1001 users within this timestamp. Zendesk can only provide a maximum of 1000 users per request. See: https://develop.zendesk.com/hc/en-us/articles/360022563994--BREAKING-New-Search-API-Result-Limits')

def test_many_records_in_one_seconds_for_user_with_2_sec_window(self):
"""
To verify that if user give 2 seconds window then also we don't get infinite loop behavior
"""
user_obj = Users(client=MockSearch(), config={'search_window_size': 2})

with self.assertRaises(Exception) as e:
l = list(user_obj.sync({'bookmarks': {'users': {'updated_at': '2022-03-30T08:45:21.000000Z'}}}))

self.assertEqual(str(e.exception), 'users - Unable to get all users within minimum window of a single second (2022-03-30T08:45:21Z), found 1001 users within this timestamp. Zendesk can only provide a maximum of 1000 users per request. See: https://develop.zendesk.com/hc/en-us/articles/360022563994--BREAKING-New-Search-API-Result-Limits')


def test_search_window_size_equals_1_sec(self):
"""
To verify that search window size 1 second cannot be configured
"""

with self.assertRaises(ValueError) as e:
Users(client=MockSearch(), config={'search_window_size': 1})

self.assertEqual(str(e.exception), 'Search window size cannot be less than 2')

0 comments on commit bb081e1

Please sign in to comment.