Skip to content

Commit c551d0b

Browse files
committed
Added check for datetime string format + tests
1 parent 4534dd9 commit c551d0b

File tree

2 files changed

+47
-6
lines changed

2 files changed

+47
-6
lines changed

shellhub/models/device.py

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -60,16 +60,23 @@ def __init__(self, api_object: shellhub.models.base.ShellHub, device_json): # t
6060
self.info = ShellHubDeviceInfo(device_json["info"])
6161
self.public_key = device_json["public_key"]
6262
self.tenant_id = device_json["tenant_id"]
63-
self.last_seen = datetime.fromisoformat(device_json["last_seen"])
63+
self.last_seen = self._safe_isoformat_to_datetime(device_json["last_seen"])
6464
self.online = device_json["online"]
6565
self.namespace = device_json["namespace"]
6666
self.status = device_json["status"]
67-
self.status_updated_at = datetime.fromisoformat(device_json["status_updated_at"])
68-
self.created_at = datetime.fromisoformat(device_json["created_at"])
67+
self.status_updated_at = self._safe_isoformat_to_datetime(device_json["status_updated_at"])
68+
self.created_at = self._safe_isoformat_to_datetime(device_json["created_at"])
6969
self.remote_addr = device_json["remote_addr"]
7070
self.tags = device_json["tags"]
7171
self.acceptable = device_json["acceptable"]
7272

73+
@staticmethod
74+
def _safe_isoformat_to_datetime(date_string: str) -> datetime:
75+
try:
76+
return datetime.fromisoformat(date_string)
77+
except ValueError as e:
78+
raise ShellHubApiError(f"Invalid date string: {date_string} (Couldn't convert to datetime)") from e
79+
7380
def delete(self) -> bool:
7481
"""
7582
Delete the device from the API

tests/test_devices.py

Lines changed: 37 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
from datetime import datetime
2+
13
import pytest
24

35
from shellhub.exceptions import ShellHubApiError
@@ -118,16 +120,48 @@ def test_get_device(self, shellhub, requests_mock):
118120
== "-----BEGIN RSA PUBLIC KEY-----\nxxx\nxxx\nxxx\nxxx\nxxx\nxxx\n-----END RSA PUBLIC KEY-----\n"
119121
)
120122
assert device.tenant_id == "1"
121-
assert device.last_seen == "1970-01-01T00:00:00Z"
123+
assert device.last_seen == datetime.fromisoformat("1970-01-01T00:00:00Z")
122124
assert device.online
123125
assert device.namespace == "dev"
124126
assert device.status == "accepted"
125-
assert device.status_updated_at == "1970-01-01T00:00:00Z"
126-
assert device.created_at == "1970-01-01T00:00:00Z"
127+
assert device.status_updated_at == datetime.fromisoformat("1970-01-01T00:00:00Z")
128+
assert device.created_at == datetime.fromisoformat("1970-01-01T00:00:00Z")
127129
assert device.remote_addr == "0.0.0.0"
128130
assert device.tags == []
129131
assert not device.acceptable
130132

133+
def test_get_incorrect_datetime_format(self, shellhub, requests_mock):
134+
mock_response = {
135+
"uid": "1",
136+
"name": "default",
137+
"identity": {"mac": "06:04:ju:le:s7:08"},
138+
"info": {
139+
"id": "ubuntu",
140+
"pretty_name": "Ubuntu 20.04.2 LTS",
141+
"version": "v0.14.1",
142+
"arch": "amd64",
143+
"platform": "docker",
144+
},
145+
"public_key": "-----BEGIN RSA PUBLIC KEY-----\nxxx\nxxx\nxxx\n"
146+
"xxx\nxxx\nxxx\n-----END RSA PUBLIC KEY-----\n",
147+
"tenant_id": "1",
148+
"last_seen": "-1",
149+
"online": True,
150+
"namespace": "dev",
151+
"status": "accepted",
152+
"status_updated_at": "-1",
153+
"created_at": "-1",
154+
"remote_addr": "0.0.0.0",
155+
"position": {"latitude": 0, "longitude": 0},
156+
"tags": [],
157+
"public_url": False,
158+
"public_url_address": "",
159+
"acceptable": False,
160+
}
161+
requests_mock.get(f"{MOCKED_DOMAIN_URL}/api/devices/1", json=mock_response)
162+
with pytest.raises(ShellHubApiError):
163+
shellhub.get_device("1")
164+
131165

132166
class TestDeleteDevice:
133167
def test_delete_device(self, shellhub_device, requests_mock):

0 commit comments

Comments
 (0)