Files
semantica/tests/normalize/test_date_normalizer.py
KaifAhmad1 58707ff721 fix(kg): resolve 'unhashable type: Entity' in GraphAnalyzer #159
- Robust ID extraction in CentralityCalculator, CommunityDetector, and ConnectivityAnalyzer
- Support for direct Entity objects and dictionaries as node identifiers
- Improved Entity hashability in utils/types.py
- Added integration test to verify fix and prevent regression
2026-01-08 17:23:31 +05:30

76 lines
2.8 KiB
Python

import unittest
from datetime import datetime, date, timedelta, timezone
from semantica.normalize.date_normalizer import (
DateNormalizer,
TimeZoneNormalizer,
RelativeDateProcessor,
TemporalExpressionParser
)
class TestDateNormalizer(unittest.TestCase):
def setUp(self):
self.normalizer = DateNormalizer()
def test_normalize_date_iso(self):
# Test ISO8601 parsing
self.assertEqual(
self.normalizer.normalize_date("2023-01-01", format="date"),
"2023-01-01"
)
self.assertEqual(
self.normalizer.normalize_date("2023-01-01T12:00:00", format="ISO8601"),
"2023-01-01T12:00:00+00:00"
)
def test_normalize_date_relative(self):
# Test relative date parsing (e.g., "today", "yesterday")
# Note: These depend on current date, so we might need to mock datetime if strictly testing logic,
# but for now we'll assume the relative processor uses current time.
# We can check if it returns a valid ISO date string.
today = datetime.now(timezone.utc).date().isoformat()
self.assertEqual(
self.normalizer.normalize_date("today", format="date"),
today
)
def test_normalize_timezone(self):
# Test timezone conversion
# "2023-01-01T12:00:00+01:00" -> UTC should be "2023-01-01T11:00:00+00:00"
normalized = self.normalizer.normalize_date(
"2023-01-01T12:00:00+01:00",
timezone="UTC"
)
self.assertEqual(normalized, "2023-01-01T11:00:00+00:00")
def test_parse_temporal_expression(self):
# Test range parsing
result = self.normalizer.parse_temporal_expression("from 2023-01-01 to 2023-01-31")
self.assertIsNotNone(result.get("range"))
class TestTimeZoneNormalizer(unittest.TestCase):
def setUp(self):
self.tz_normalizer = TimeZoneNormalizer()
def test_normalize_timezone_obj(self):
dt = datetime(2023, 1, 1, 12, 0, 0)
# Assuming default is UTC if not specified or naive
normalized = self.tz_normalizer.normalize_timezone(dt, "UTC")
# Check offset instead of object identity
self.assertEqual(normalized.tzinfo.utcoffset(normalized), timezone.utc.utcoffset(None))
class TestRelativeDateProcessor(unittest.TestCase):
def setUp(self):
self.processor = RelativeDateProcessor()
def test_process_relative_expression(self):
# "3 days ago"
dt = self.processor.process_relative_expression("3 days ago")
self.assertIsInstance(dt, datetime)
# Roughly check delta
# Use datetime.now() since result is naive
diff = datetime.now() - dt
self.assertTrue(timedelta(days=2, hours=23) < diff < timedelta(days=3, hours=1))
if __name__ == "__main__":
unittest.main()