1
0
mirror of https://github.com/craigerl/aprsd.git synced 2026-01-06 08:29:13 -05:00
aprsd/tests/utils/test_json.py
2025-12-09 17:20:23 -05:00

214 lines
7.0 KiB
Python

import datetime
import decimal
import json
import unittest
from aprsd.utils.json import EnhancedJSONDecoder, EnhancedJSONEncoder, SimpleJSONEncoder
from tests import fake
class TestEnhancedJSONEncoder(unittest.TestCase):
"""Unit tests for the EnhancedJSONEncoder class."""
def test_encode_datetime(self):
"""Test encoding datetime objects."""
dt = datetime.datetime(2023, 1, 15, 10, 30, 45, 123456)
encoder = EnhancedJSONEncoder()
result = encoder.default(dt)
self.assertEqual(result['__type__'], 'datetime.datetime')
self.assertIn('args', result)
self.assertEqual(result['args'][0], 2023) # year
self.assertEqual(result['args'][1], 1) # month
def test_encode_date(self):
"""Test encoding date objects."""
d = datetime.date(2023, 1, 15)
encoder = EnhancedJSONEncoder()
result = encoder.default(d)
self.assertEqual(result['__type__'], 'datetime.date')
self.assertIn('args', result)
self.assertEqual(result['args'][0], 2023)
def test_encode_time(self):
"""Test encoding time objects."""
t = datetime.time(10, 30, 45, 123456)
encoder = EnhancedJSONEncoder()
result = encoder.default(t)
self.assertEqual(result['__type__'], 'datetime.time')
self.assertIn('args', result)
self.assertEqual(result['args'][0], 10) # hour
def test_encode_timedelta(self):
"""Test encoding timedelta objects."""
td = datetime.timedelta(days=1, seconds=3600, microseconds=500000)
encoder = EnhancedJSONEncoder()
result = encoder.default(td)
self.assertEqual(result['__type__'], 'datetime.timedelta')
self.assertIn('args', result)
self.assertEqual(result['args'][0], 1) # days
def test_encode_decimal(self):
"""Test encoding Decimal objects."""
dec = decimal.Decimal('123.456')
encoder = EnhancedJSONEncoder()
result = encoder.default(dec)
self.assertEqual(result['__type__'], 'decimal.Decimal')
self.assertIn('args', result)
self.assertEqual(result['args'][0], '123.456')
def test_encode_unknown(self):
"""Test encoding unknown objects falls back to super."""
encoder = EnhancedJSONEncoder()
with self.assertRaises(TypeError):
encoder.default(object())
class TestSimpleJSONEncoder(unittest.TestCase):
"""Unit tests for the SimpleJSONEncoder class."""
def test_encode_datetime(self):
"""Test encoding datetime objects."""
dt = datetime.datetime(2023, 1, 15, 10, 30, 45)
encoder = SimpleJSONEncoder()
result = encoder.default(dt)
self.assertIsInstance(result, str)
self.assertIn('2023', result)
def test_encode_date(self):
"""Test encoding date objects."""
d = datetime.date(2023, 1, 15)
encoder = SimpleJSONEncoder()
result = encoder.default(d)
self.assertIsInstance(result, str)
self.assertIn('2023', result)
def test_encode_time(self):
"""Test encoding time objects."""
t = datetime.time(10, 30, 45)
encoder = SimpleJSONEncoder()
result = encoder.default(t)
self.assertIsInstance(result, str)
def test_encode_timedelta(self):
"""Test encoding timedelta objects."""
td = datetime.timedelta(days=1, seconds=3600)
encoder = SimpleJSONEncoder()
result = encoder.default(td)
self.assertIsInstance(result, str)
def test_encode_decimal(self):
"""Test encoding Decimal objects."""
dec = decimal.Decimal('123.456')
encoder = SimpleJSONEncoder()
result = encoder.default(dec)
self.assertEqual(result, '123.456')
def test_encode_packet(self):
"""Test encoding Packet objects."""
packet = fake.fake_packet()
encoder = SimpleJSONEncoder()
result = encoder.default(packet)
self.assertIsInstance(result, dict)
# Should have packet attributes
self.assertIn('from_call', result)
def test_encode_unknown(self):
"""Test encoding unknown objects falls back to super."""
encoder = SimpleJSONEncoder()
with self.assertRaises(TypeError):
encoder.default(object())
class TestEnhancedJSONDecoder(unittest.TestCase):
"""Unit tests for the EnhancedJSONDecoder class."""
def test_decode_datetime(self):
"""Test decoding datetime objects."""
dt = datetime.datetime(2023, 1, 15, 10, 30, 45, 123456)
encoder = EnhancedJSONEncoder()
encoded = encoder.default(dt)
json_str = json.dumps(encoded)
decoded = json.loads(json_str, cls=EnhancedJSONDecoder)
self.assertIsInstance(decoded, datetime.datetime)
self.assertEqual(decoded.year, 2023)
self.assertEqual(decoded.month, 1)
def test_decode_date(self):
"""Test decoding date objects."""
d = datetime.date(2023, 1, 15)
encoder = EnhancedJSONEncoder()
encoded = encoder.default(d)
json_str = json.dumps(encoded)
decoded = json.loads(json_str, cls=EnhancedJSONDecoder)
self.assertIsInstance(decoded, datetime.date)
self.assertEqual(decoded.year, 2023)
def test_decode_time(self):
"""Test decoding time objects."""
t = datetime.time(10, 30, 45, 123456)
encoder = EnhancedJSONEncoder()
encoded = encoder.default(t)
json_str = json.dumps(encoded)
decoded = json.loads(json_str, cls=EnhancedJSONDecoder)
self.assertIsInstance(decoded, datetime.time)
self.assertEqual(decoded.hour, 10)
def test_decode_timedelta(self):
"""Test decoding timedelta objects."""
td = datetime.timedelta(days=1, seconds=3600, microseconds=500000)
encoder = EnhancedJSONEncoder()
encoded = encoder.default(td)
json_str = json.dumps(encoded)
decoded = json.loads(json_str, cls=EnhancedJSONDecoder)
self.assertIsInstance(decoded, datetime.timedelta)
self.assertEqual(decoded.days, 1)
def test_decode_decimal(self):
"""Test decoding Decimal objects."""
dec = decimal.Decimal('123.456')
encoder = EnhancedJSONEncoder()
encoded = encoder.default(dec)
json_str = json.dumps(encoded)
decoded = json.loads(json_str, cls=EnhancedJSONDecoder)
self.assertIsInstance(decoded, decimal.Decimal)
self.assertEqual(str(decoded), '123.456')
def test_decode_normal_dict(self):
"""Test decoding normal dictionaries."""
normal_dict = {'key': 'value', 'number': 42}
json_str = json.dumps(normal_dict)
decoded = json.loads(json_str, cls=EnhancedJSONDecoder)
self.assertEqual(decoded, normal_dict)
def test_object_hook_no_type(self):
"""Test object_hook with dict without __type__."""
decoder = EnhancedJSONDecoder()
normal_dict = {'key': 'value'}
result = decoder.object_hook(normal_dict)
self.assertEqual(result, normal_dict)