mirror of
https://github.com/craigerl/aprsd.git
synced 2026-01-06 08:29:13 -05:00
214 lines
7.0 KiB
Python
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)
|