Skip to content

Commit 7a99654

Browse files
authored
fix: clear token and expiry time on invalid token err (#925)
1 parent 0439937 commit 7a99654

File tree

2 files changed

+83
-13
lines changed

2 files changed

+83
-13
lines changed

fyle_intacct_api/utils.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -115,5 +115,7 @@ def invalidate_sage_intacct_credentials(workspace_id, sage_intacct_credentials=N
115115
if sage_intacct_credentials:
116116
if not sage_intacct_credentials.is_expired:
117117
import_string('apps.workspaces.tasks.patch_integration_settings')(workspace_id, is_token_expired=True)
118-
sage_intacct_credentials.is_expired = True
118+
119+
sage_intacct_credentials.access_token = None
120+
sage_intacct_credentials.access_token_expires_at = None
119121
sage_intacct_credentials.save()

tests/test_sageintacct/test_utils.py

Lines changed: 80 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import logging
2-
from datetime import datetime
2+
from datetime import datetime, timedelta
33
from unittest import mock
44

55
import pytest
@@ -2061,20 +2061,88 @@ def test_invalidate_sage_intacct_credentials(mocker, db):
20612061
invalidate_sage_intacct_credentials(workspace_id)
20622062
assert not mocked_patch.called
20632063

2064-
# TODO: Uncomment this when we have a FE Changes ready
2065-
# # Should call patch_integration_settings with the correct arguments if sage_intacct_credentials.is_expired is False
2066-
# sage_intacct_credentials.is_expired = False
2067-
# sage_intacct_credentials.save()
20682064

2069-
# invalidate_sage_intacct_credentials(workspace_id)
2065+
def test_invalidate_sage_intacct_credentials_clears_tokens(mocker, db):
2066+
"""
2067+
Test that invalidate_sage_intacct_credentials clears access_token and access_token_expires_at,
2068+
calls patch_integration_settings when is_expired was False, and does not change is_expired.
2069+
"""
2070+
workspace_id = 1
2071+
2072+
sage_intacct_credentials = SageIntacctCredential.objects.get(workspace_id=workspace_id)
2073+
sage_intacct_credentials.is_expired = False
2074+
sage_intacct_credentials.access_token = 'some-access-token'
2075+
sage_intacct_credentials.access_token_expires_at = datetime.now(tz=timezone.utc) + timedelta(hours=5)
2076+
sage_intacct_credentials.save()
2077+
2078+
mocked_patch = mocker.MagicMock()
2079+
mocker.patch('apps.workspaces.tasks.patch_integration_settings', side_effect=mocked_patch)
2080+
2081+
invalidate_sage_intacct_credentials(workspace_id)
2082+
2083+
sage_intacct_credentials.refresh_from_db()
2084+
2085+
mocked_patch.assert_called_once_with(workspace_id, is_token_expired=True)
2086+
2087+
assert sage_intacct_credentials.is_expired is False
2088+
2089+
assert sage_intacct_credentials.access_token is None
2090+
assert sage_intacct_credentials.access_token_expires_at is None
2091+
2092+
2093+
def test_invalidate_sage_intacct_credentials_with_passed_credentials(mocker, db):
2094+
"""
2095+
Test invalidate_sage_intacct_credentials when credentials object is passed directly
2096+
(as done by TokenHealthView and export tasks).
2097+
"""
2098+
workspace_id = 1
2099+
2100+
sage_intacct_credentials = SageIntacctCredential.objects.get(workspace_id=workspace_id)
2101+
sage_intacct_credentials.is_expired = False
2102+
sage_intacct_credentials.access_token = 'some-access-token'
2103+
sage_intacct_credentials.access_token_expires_at = datetime.now(tz=timezone.utc) + timedelta(hours=5)
2104+
sage_intacct_credentials.save()
20702105

2071-
# args, kwargs = mocked_patch.call_args
2072-
# assert args[0] == workspace_id
2073-
# assert kwargs['is_token_expired'] == True
2106+
mocked_patch = mocker.MagicMock()
2107+
mocker.patch('apps.workspaces.tasks.patch_integration_settings', side_effect=mocked_patch)
2108+
2109+
# Pass credentials object directly (simulates how TokenHealthView calls it)
2110+
invalidate_sage_intacct_credentials(workspace_id, sage_intacct_credentials)
2111+
2112+
sage_intacct_credentials.refresh_from_db()
2113+
2114+
mocked_patch.assert_called_once_with(workspace_id, is_token_expired=True)
2115+
2116+
assert sage_intacct_credentials.is_expired is False
2117+
2118+
assert sage_intacct_credentials.access_token is None
2119+
assert sage_intacct_credentials.access_token_expires_at is None
2120+
2121+
2122+
def test_invalidate_sage_intacct_credentials_already_expired_passed_directly(mocker, db):
2123+
"""
2124+
Test invalidate_sage_intacct_credentials when already-expired credentials are passed directly.
2125+
Should not call patch_integration_settings but should still clear tokens.
2126+
"""
2127+
workspace_id = 1
2128+
2129+
sage_intacct_credentials = SageIntacctCredential.objects.get(workspace_id=workspace_id)
2130+
sage_intacct_credentials.is_expired = True
2131+
sage_intacct_credentials.access_token = 'stale-access-token'
2132+
sage_intacct_credentials.access_token_expires_at = datetime.now(tz=timezone.utc) + timedelta(hours=3)
2133+
sage_intacct_credentials.save()
2134+
2135+
mocked_patch = mocker.MagicMock()
2136+
mocker.patch('apps.workspaces.tasks.patch_integration_settings', side_effect=mocked_patch)
2137+
2138+
invalidate_sage_intacct_credentials(workspace_id, sage_intacct_credentials)
2139+
2140+
sage_intacct_credentials.refresh_from_db()
2141+
2142+
assert not mocked_patch.called
20742143

2075-
# # Verify the credentials were marked as expired
2076-
# sage_intacct_credentials.refresh_from_db()
2077-
# assert sage_intacct_credentials.is_expired == True
2144+
assert sage_intacct_credentials.access_token is None
2145+
assert sage_intacct_credentials.access_token_expires_at is None
20782146

20792147

20802148
def test_get_or_create_vendor_fallback_creation_error(mocker, db):

0 commit comments

Comments
 (0)