Skip to content

Commit 2e55a5c

Browse files
committed
added tests for rfc3339 parsing
1 parent 8fdac76 commit 2e55a5c

File tree

2 files changed

+73
-6
lines changed

2 files changed

+73
-6
lines changed

nats/js/api.py

Lines changed: 21 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -96,11 +96,27 @@ def _convert_rfc3339(resp: Dict[str, Any], field: str) -> None:
9696
val = resp.get(field, None)
9797
if val is None:
9898
return None
99-
raw_date = val[:26]
100-
if raw_date.endswith("Z"):
101-
raw_date = raw_date[:-1] + "+00:00"
102-
resp[field] = datetime.datetime.fromisoformat(raw_date).replace(
103-
tzinfo=datetime.timezone.utc
99+
# Handle Zulu
100+
offset = "+00:00"
101+
if val.endswith("Z"):
102+
raw_date = val[:-1]
103+
# There MUST be an offset if not Zulu
104+
else:
105+
offset = val[-6:]
106+
raw_date = val[:-6]
107+
# Padd missing milliseconds
108+
if "." not in raw_date:
109+
raw_date += ".000000"
110+
else:
111+
raw_date = raw_date[:26]
112+
length = len(raw_date)
113+
if length < 26:
114+
raw_date += "0" * (26 - length)
115+
# Add offset
116+
raw_date = raw_date + offset
117+
# Parse into datetime using fromisoformat
118+
resp[field] = datetime.datetime.fromisoformat(raw_date).astimezone(
119+
datetime.timezone.utc
104120
)
105121

106122
@staticmethod

tests/test_js.py

Lines changed: 52 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1484,7 +1484,58 @@ async def test_consumer_with_opt_start_time_microseconds_tz(self):
14841484
)
14851485
await nc.close()
14861486

1487-
1487+
def test_parser_consumer_info_with_created_timestamp(self):
1488+
for created in [
1489+
"1970-01-01T01:02:03Z",
1490+
"1970-01-01T02:02:03+01:00",
1491+
"1970-01-01T01:02:03.0Z",
1492+
"1970-01-01T01:02:03.00Z",
1493+
"1970-01-01T01:02:03.000Z",
1494+
"1970-01-01T01:02:03.0000Z",
1495+
"1970-01-01T01:02:03.00000Z",
1496+
"1970-01-01T01:02:03.000000Z",
1497+
"1970-01-01T01:02:03.0000000Z",
1498+
"1970-01-01T01:02:03.00000000Z",
1499+
"1970-01-01T01:02:03.000000000Z",
1500+
"1970-01-01T02:02:03.000000000Z+01:00",
1501+
]:
1502+
info = api.ConsumerInfo.from_response({
1503+
"name": "test",
1504+
"stream_name": "test",
1505+
"config": {},
1506+
"created": created
1507+
})
1508+
created = info.created
1509+
assert created == datetime.datetime(
1510+
1970, 1, 1, 1, 2, 3, tzinfo=datetime.timezone.utc
1511+
)
1512+
for created in [
1513+
"1970-01-01T01:02:03.4Z",
1514+
"1970-01-01T01:02:03.4+00:00",
1515+
"1970-01-01T01:02:03.40Z",
1516+
"1970-01-01T02:02:03.40+01:00",
1517+
"1970-01-01T01:02:03.400Z",
1518+
"1970-01-01T04:02:03.400+03:00",
1519+
"1970-01-01T01:02:03.4000Z",
1520+
"1970-01-01T07:22:03.4000+06:20",
1521+
"1970-01-01T01:02:03.40000Z",
1522+
"1970-01-01T00:02:03.400000-01:00",
1523+
"1970-01-01T01:02:03.400000Z",
1524+
"1970-01-01T01:02:03.4000000Z",
1525+
"1970-01-01T01:02:03.40000000Z",
1526+
"1970-01-01T01:02:03.400000000Z",
1527+
"1970-01-01T02:02:03.400000000Z+01:00",
1528+
]:
1529+
info = api.ConsumerInfo.from_response({
1530+
"name": "test",
1531+
"stream_name": "test",
1532+
"config": {},
1533+
"created": created
1534+
})
1535+
created = info.created
1536+
assert created == datetime.datetime(
1537+
1970, 1, 1, 1, 2, 3, 400000, tzinfo=datetime.timezone.utc
1538+
)
14881539

14891540
@async_test
14901541
async def test_jsm_stream_info_options(self):

0 commit comments

Comments
 (0)