From 6db629a4a0642ca065a733902d7aff17b5402495 Mon Sep 17 00:00:00 2001 From: Eric Avdey Date: Tue, 8 Apr 2025 12:37:18 -0300 Subject: [PATCH] refactor(follower): use normal feed for one-off changes --- ibmcloudant/features/changes_follower.py | 19 ++++++++++------ test/unit/features/test_changes_follower.py | 25 +++++++++++++++++++-- 2 files changed, 35 insertions(+), 9 deletions(-) diff --git a/ibmcloudant/features/changes_follower.py b/ibmcloudant/features/changes_follower.py index 144d244c..004afce2 100644 --- a/ibmcloudant/features/changes_follower.py +++ b/ibmcloudant/features/changes_follower.py @@ -293,7 +293,7 @@ def __init__( ) -> None: self.options = kwargs self.limit = self.options.get('limit') - self._set_defaults() + self._set_defaults(_Mode.FINITE) self.service = service self.error_tolerance = error_tolerance self._iter = None @@ -358,11 +358,16 @@ def options(self, value: Dict): raise ValueError(error_fmt.format(invalid_opts_list, class_name)) self._options = value - def _set_defaults(self, limit: int = None): - defaults = { - 'feed': PostChangesEnums.Feed.LONGPOLL, - 'timeout': _LONGPOLL_TIMEOUT, - } + def _set_defaults(self, mode: _Mode, limit: int = None): + if mode == _Mode.FINITE: + defaults = { + 'feed': PostChangesEnums.Feed.NORMAL + } + elif mode == _Mode.LISTEN: + defaults = { + 'feed': PostChangesEnums.Feed.LONGPOLL, + 'timeout': _LONGPOLL_TIMEOUT, + } if limit is not None: self.logger.debug(f'Applying changes limit {limit}') defaults['limit'] = limit @@ -445,7 +450,7 @@ def _run(self, mode: _Mode): if self.limit is not None: batch_size = self.limit if self.limit < batch_size else batch_size - self._set_defaults(batch_size) + self._set_defaults(mode, batch_size) changes_caller = functools.partial( self.service.post_changes, **self.options ) diff --git a/test/unit/features/test_changes_follower.py b/test/unit/features/test_changes_follower.py index 11fed59e..e31a6d17 100644 --- a/test/unit/features/test_changes_follower.py +++ b/test/unit/features/test_changes_follower.py @@ -112,6 +112,16 @@ def test_validate_options_multiple_invalid_cases(self): def test_set_defaults(self): follower = ChangesFollower(self.client, db="db", **self.kwarg_valid) + expected = { + "feed": PostChangesEnums.Feed.NORMAL, + "timeout": None, + } + for opt, val in expected.items(): + self.assertEqual(follower.options.get(opt), val) + + def test_set_defaults_listen(self): + follower = ChangesFollower(self.client, db="db", **self.kwarg_valid) + follower._set_defaults(_Mode.LISTEN) expected = { "feed": PostChangesEnums.Feed.LONGPOLL, "timeout": _LONGPOLL_TIMEOUT, @@ -121,7 +131,18 @@ def test_set_defaults(self): def test_set_defaults_with_limit(self): follower = ChangesFollower(self.client, db="db", **self.kwarg_valid) - follower._set_defaults(limit=12) + follower._set_defaults(_Mode.FINITE, limit=12) + expected = { + "feed": PostChangesEnums.Feed.NORMAL, + "timeout": None, + "limit": 12, + } + for opt, val in expected.items(): + self.assertEqual(follower.options.get(opt), val) + + def test_set_defaults_listen_with_limit(self): + follower = ChangesFollower(self.client, db="db", **self.kwarg_valid) + follower._set_defaults(_Mode.LISTEN, limit=12) expected = { "feed": PostChangesEnums.Feed.LONGPOLL, "timeout": _LONGPOLL_TIMEOUT, @@ -133,7 +154,7 @@ def test_set_defaults_with_limit(self): def test_set_defaults_with_kwarg_limit(self): kwarg = {**self.kwarg_valid, **{"limit": 24}} follower = ChangesFollower(self.client, db="db", **kwarg) - follower._set_defaults(limit=12) + follower._set_defaults(_Mode.LISTEN, limit=12) self.assertEqual(follower.options.get("limit"), 12)