From e280496acbad42adccd2707dd2145037bb2ddeea Mon Sep 17 00:00:00 2001 From: George Hotelling Date: Wed, 8 Feb 2023 12:21:32 -0800 Subject: [PATCH] More unit tests --- Makefile | 3 +++ requirements.txt | 17 +++++++++++++++++ test_zoho_auth.py | 25 ++++++++++++++++++++++--- zoho_auth.py | 10 +++++----- 4 files changed, 47 insertions(+), 8 deletions(-) create mode 100644 requirements.txt diff --git a/Makefile b/Makefile index bd78f24..7f5bfb7 100644 --- a/Makefile +++ b/Makefile @@ -6,3 +6,6 @@ install: uninstall: rm -v /usr/bin/doorsd /etc/doorsrc + +test: + pytest \ No newline at end of file diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..3fb29da --- /dev/null +++ b/requirements.txt @@ -0,0 +1,17 @@ +attrs==22.2.0 +certifi==2022.12.7 +charset-normalizer==3.0.1 +exceptiongroup==1.1.0 +freezegun==1.2.2 +idna==3.4 +iniconfig==2.0.0 +packaging==23.0 +pluggy==1.0.0 +pytest==7.2.1 +python-dateutil==2.8.2 +requests==2.28.2 +requests-mock==1.10.0 +six==1.16.0 +slacker==0.14.0 +tomli==2.0.1 +urllib3==1.26.14 diff --git a/test_zoho_auth.py b/test_zoho_auth.py index 7faa01d..2660fc4 100644 --- a/test_zoho_auth.py +++ b/test_zoho_auth.py @@ -1,4 +1,6 @@ +import datetime import unittest +from freezegun import freeze_time from unittest.mock import patch, MagicMock from zoho_auth import ZohoToken @@ -12,13 +14,30 @@ class TestZohoToken(unittest.TestCase): mock_response.read.return_value.decode.return_value = '{"access_token": "mock_access_token", "expires_in": 3600}' mock_request.urlopen.return_value.__enter__.return_value = mock_response - # __init__ calls update_token() auth = ZohoToken('mock_client_id', 'mock_client_secret', 'mock_refresh_token') # Assert that the token was fetched - self.assertEqual(auth.access_token, 'mock_access_token') + self.assertEqual(auth.get_token(), 'mock_access_token') + mock_request.Request.assert_called_with('https://accounts.zoho.com/oauth/v2/token?refresh_token=mock_refresh_token&client_id=mock_client_id&client_secret=mock_client_secret&grant_type=refresh_token', method='POST') + @patch('zoho_auth.request') + @freeze_time('2009-06-15 09:00:00', as_kwarg='frozen_time') + def test_updates_token_after_expiration(self, mock_request, frozen_time): + """Test that ZohoAuth fetches a new token after the previous one expires""" + mock_response = MagicMock() + mock_response.read.return_value.decode.return_value = '{"access_token": "mock_access_token", "expires_in": 3600}' + mock_request.urlopen.return_value.__enter__.return_value = mock_response + auth = ZohoToken('mock_client_id', 'mock_client_secret', 'mock_refresh_token') + self.assertEqual(auth.expires_at, datetime.datetime(2009, 6, 15, 10, 0, 0)) + + mock_response.read.return_value.decode.return_value = '{"access_token": "updated_mock_access_token", "expires_in": 3600}' + frozen_time.tick(datetime.timedelta(seconds=3599)) + token = auth.get_token() + self.assertEqual(token, 'mock_access_token') + frozen_time.tick(datetime.timedelta(seconds=1)) + token = auth.get_token() + self.assertEqual(token, 'updated_mock_access_token') if __name__ == '__main__': - unittest.main() \ No newline at end of file + unittest.main() diff --git a/zoho_auth.py b/zoho_auth.py index 3719ade..4417f2a 100644 --- a/zoho_auth.py +++ b/zoho_auth.py @@ -9,7 +9,7 @@ class ZohoToken: self.client_id = client_id self.client_secret = client_secret self.refresh_token = refresh_token - self.access_token = None + self._access_token = None self.expires_at = None self.update_token() @@ -23,13 +23,13 @@ class ZohoToken: req = request.Request(url, method="POST") with request.urlopen(req) as f: data = json.loads(f.read().decode()) - self.access_token = data["access_token"] + self._access_token = data["access_token"] self.expires_at = datetime.datetime.now() + datetime.timedelta(seconds=int(data["expires_in"])) def get_token(self): - if self.access_token is None or self.expires_at <= datetime.datetime.now(): + if self._access_token is None or self.expires_at <= datetime.datetime.now(): self.update_token() - return self.access_token + return self._access_token def authenticate(token, key): ret = False @@ -49,4 +49,4 @@ def authenticate(token, key): except HTTPError as e: print("Error pinging server: %s" % e) - return ret \ No newline at end of file + return ret