From b7375d11da89661a78ce37c8bd9c7ac3ff9ec191 Mon Sep 17 00:00:00 2001 From: James Woglom Date: Wed, 1 Jul 2026 03:05:36 +0000 Subject: [PATCH] Test get() 401 re-login and 500 retry paths --- tests/api/test_tandemsource.py | 54 ++++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) diff --git a/tests/api/test_tandemsource.py b/tests/api/test_tandemsource.py index 4d2b5d0..652586d 100644 --- a/tests/api/test_tandemsource.py +++ b/tests/api/test_tandemsource.py @@ -7,6 +7,7 @@ import urllib.parse from unittest.mock import patch from tconnectsync.api.tandemsource import TandemSourceApi +from tconnectsync.api.common import ApiException from tconnectsync.eventparser import events as eventtypes @@ -389,5 +390,58 @@ class TestPumpEvents(unittest.TestCase): self.assertEqual(out, []) +class TestGetRetry(unittest.TestCase): + """get() retries once on 500, re-logs-in and retries once on 401, and + raises immediately on other statuses; after one retry it gives up.""" + maxDiff = None + + def _api(self): + api = TandemSourceApi.__new__(TandemSourceApi) + api._email = 'e' + api._password = 'p' + api.accessTokenExpiresAt = 0 + return api + + def test_401_triggers_relogin_then_retry_succeeds(self): + api = self._api() + with patch.object(TandemSourceApi, "_get", + side_effect=[ApiException(401, 'unauth'), {'ok': True}]) as m_get, \ + patch.object(TandemSourceApi, "login", return_value=None) as m_login: + result = api.get('ep', {}) + self.assertEqual(result, {'ok': True}) + self.assertEqual(m_login.call_count, 1) + self.assertEqual(m_get.call_count, 2) + + def test_500_retries_without_relogin(self): + api = self._api() + with patch.object(TandemSourceApi, "_get", + side_effect=[ApiException(500, 'err'), {'ok': True}]) as m_get, \ + patch.object(TandemSourceApi, "login", return_value=None) as m_login: + result = api.get('ep', {}) + self.assertEqual(result, {'ok': True}) + self.assertEqual(m_login.call_count, 0) + self.assertEqual(m_get.call_count, 2) + + def test_other_status_raises_immediately(self): + api = self._api() + with patch.object(TandemSourceApi, "_get", + side_effect=ApiException(403, 'forbidden')) as m_get, \ + patch.object(TandemSourceApi, "login", return_value=None) as m_login: + with self.assertRaises(ApiException): + api.get('ep', {}) + self.assertEqual(m_login.call_count, 0) + self.assertEqual(m_get.call_count, 1) + + def test_persistent_401_raises_after_one_retry(self): + api = self._api() + with patch.object(TandemSourceApi, "_get", + side_effect=[ApiException(401, 'unauth'), ApiException(401, 'unauth')]) as m_get, \ + patch.object(TandemSourceApi, "login", return_value=None) as m_login: + with self.assertRaises(ApiException): + api.get('ep', {}) + self.assertEqual(m_login.call_count, 1) + self.assertEqual(m_get.call_count, 2) + + if __name__ == "__main__": unittest.main()