forked from singer-io/tap-zendesk
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
TDL-6756: Fix Infinite Loop for Users (singer-io#103)
* Reproduce infinite loop behaviour in unittest 'test_user_infinite_loop.py' and correct that behaviour * Correct exception mesaage in unittest * change logger message * correct logger message * add comment in streams.py and add 2sec window test case * add comment in streams.py and add 2sec window test case * Change exception message * Correct comment message * resolved unitetst error * update behaviour for 1 second window size * changelog and verison bump --------- Co-authored-by: Rushikesh Todkar <98420315+RushiT0122@users.noreply.github.com> Co-authored-by: kethan1122 <kcherukuri@talend.com>
- Loading branch information
1 parent
86f41ea
commit d9473d9
Showing
4 changed files
with
81 additions
and
4 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,70 @@ | ||
import unittest | ||
from unittest import mock | ||
import tap_zendesk | ||
from tap_zendesk.streams import Users | ||
from tap_zendesk.streams import STREAMS | ||
import singer | ||
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: | ||
self.count = 999 | ||
else: | ||
self.count = 1001 | ||
return self | ||
|
||
class TestUserSyncCheck(unittest.TestCase): | ||
@mock.patch('tap_zendesk.singer.utils.now', side_effect=lambda : datetime.datetime(2022, 4, 7, 1, 45, 21, 840535, tzinfo=tz.UTC)) | ||
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') |