Skip to content

Commit d40708a

Browse files
committed
bugfix: handle bad JSON version info
1 parent 349552e commit d40708a

File tree

3 files changed

+41
-1
lines changed

3 files changed

+41
-1
lines changed

CHANGELOG.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
Unreleased
22
----------
3-
-
3+
**Bugfixes**
4+
- Fixed an issue where invalid HTTP responses could cause an error when using `Session.version_info()`.
45

56
v1.8.2 (2023-01-30)
67
-------------------

src/sasctl/core.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -835,6 +835,11 @@ def version_info(self):
835835
r = self.get("/licenses/grants")
836836
release = r.json().get("release")
837837

838+
# If JSON response was not properly formatted then do not continue
839+
# NOTE: response can be logged & debugged with .add_logger()
840+
if release is None:
841+
return None
842+
838843
# Convert 'V03' and 'V04' to just 3 or 4.
839844
major_version = int(release.upper().lstrip("V"))
840845

tests/unit/test_session.py

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -435,3 +435,37 @@ def test_as_swat():
435435
username="testuser",
436436
password=None,
437437
)
438+
439+
440+
@mock.patch("sasctl.core.Session._get_authorization_token")
441+
@mock.patch("sasctl.core.Session.get")
442+
def test_version_info_35(get, _):
443+
"""Verify that Session.version_info() makes the correct HTTP call."""
444+
from sasctl.core import VersionInfo
445+
s = Session("example.com", "user", "password")
446+
447+
get.return_value.status_code = 200
448+
get.return_value.json.return_value = {"release": "V03"}
449+
450+
version = s.version_info()
451+
452+
assert get.call_count == 1
453+
454+
url, params = get.call_args
455+
assert url[0] == '/licenses/grants'
456+
457+
assert isinstance(version, VersionInfo)
458+
assert version.major == 3
459+
460+
461+
@mock.patch("sasctl.core.Session._get_authorization_token")
462+
@mock.patch("sasctl.core.Session.get")
463+
def test_version_info_invalid_response(get, _):
464+
"""Verify that Session.version_info() returns None if the HTTP response is invalid."""
465+
s = Session("example.com", "user", "password")
466+
467+
get.return_value.status_code = 200
468+
get.return_value.json.return_value = {"not_a_release": "V03"}
469+
470+
version = s.version_info()
471+
assert version is None

0 commit comments

Comments
 (0)