import unittest from datetime import datetime, timezone from fault_log_analyzer.parser import parse_log, parse_timestamp, templatize, tokenize class TestParseTimestamp(unittest.TestCase): def test_iso_with_z(self): dt = parse_timestamp("2025-01-01T10:18:00Z") self.assertEqual(dt.year, 2025) self.assertEqual(dt.minute, 18) def test_epoch_seconds(self): dt = parse_timestamp(1735726680) # 2025-01-01T10:18:00Z self.assertEqual(dt.year, 2025) def test_epoch_millis(self): dt = parse_timestamp(1735726680000) self.assertEqual(dt.year, 2025) def test_common_format(self): dt = parse_timestamp("2025-01-01 10:18:00") self.assertEqual(dt.year, 2025) self.assertEqual(dt.hour, 10) def test_invalid_returns_none(self): self.assertIsNone(parse_timestamp("not-a-date")) class TestParseLog(unittest.TestCase): def test_structured_json(self): raw = { "timestamp": "2025-01-01T10:18:00Z", "level": "ERROR", "message": "No space left on device", "host_id": "h-001", "service": "app", "trace_id": "tr-1", } entry = parse_log(raw) self.assertEqual(entry.level, "ERROR") self.assertEqual(entry.host_id, "h-001") self.assertEqual(entry.trace_id, "tr-1") def test_level_extracted_from_message(self): entry = parse_log({"message": "ERROR: something bad"}) self.assertEqual(entry.level, "ERROR") def test_json_message_expands_fields(self): raw = {"message": '{"message": "disk full", "level": "FATAL", "host_id": "h-2"}'} entry = parse_log(raw) self.assertEqual(entry.message, "disk full") self.assertEqual(entry.level, "FATAL") self.assertEqual(entry.host_id, "h-2") class TestTemplatize(unittest.TestCase): def test_replace_variables(self): msg = "Connection from 10.0.0.11 port 8080 failed after 3 retries" tpl = templatize(msg) self.assertIn("", tpl) self.assertIn("", tpl) def test_replace_uuid(self): tpl = templatize("request 123e4567-e89b-12d3-a456-426614174000 failed") self.assertIn("", tpl) def test_tokenize(self): tokens = tokenize("No space left on device") self.assertIn("space", tokens) self.assertIn("device", tokens) if __name__ == "__main__": unittest.main()