from diff import parse_ics_events, compute_diff, parse_ics_events_with_data class TestParseIcsEvents: def test_parse_basic(self, ics_sample): result = parse_ics_events(ics_sample) assert "evt-001@test.com" in result assert "evt-002@test.com" in result assert len(result) == 2 def test_parse_no_uid(self): ics = """BEGIN:VCALENDAR VERSION:2.0 BEGIN:VEVENT DTSTAMP:20240101T000000Z DTSTART:20240101T100000Z SUMMARY:No UID END:VEVENT END:VCALENDAR""" result = parse_ics_events(ics) assert len(result) == 0 def test_hashes_are_sha256(self, ics_sample): result = parse_ics_events(ics_sample) for uid, h in result.items(): assert len(h) == 64 int(h, 16) def test_same_event_same_hash(self, ics_sample): r1 = parse_ics_events(ics_sample) r2 = parse_ics_events(ics_sample) for uid in r1: assert r1[uid] == r2[uid] def test_modified_event_different_hash(self, ics_sample, ics_sample_modified): r1 = parse_ics_events(ics_sample) r2 = parse_ics_events(ics_sample_modified) assert r1["evt-001@test.com"] != r2["evt-001@test.com"] class TestComputeDiff: def test_no_changes(self, ics_sample): ics_uids = parse_ics_events(ics_sample) deltas = compute_diff(ics_uids, ics_uids) assert len(deltas["to_add"]) == 0 assert len(deltas["to_update"]) == 0 assert len(deltas["to_delete"]) == 0 def test_add_events(self, ics_sample, ics_sample_modified): original = parse_ics_events(ics_sample) modified = parse_ics_events(ics_sample_modified) deltas = compute_diff(modified, original) assert ("evt-003@test.com", modified["evt-003@test.com"]) in deltas["to_add"] def test_delete_events(self, ics_sample, ics_sample_modified): original = parse_ics_events(ics_sample) modified = parse_ics_events(ics_sample_modified) deltas = compute_diff(modified, original) assert "evt-002@test.com" in deltas["to_delete"] def test_update_events(self, ics_sample, ics_sample_modified): original = parse_ics_events(ics_sample) modified = parse_ics_events(ics_sample_modified) deltas = compute_diff(modified, original) uid, new_hash = deltas["to_update"][0] assert uid == "evt-001@test.com" assert new_hash == modified["evt-001@test.com"] class TestParseIcsEventsWithData: def test_returns_bytes(self, ics_sample): result = parse_ics_events_with_data(ics_sample) assert len(result) == 2 for uid, data in result.items(): assert isinstance(data, bytes) assert b"VEVENT" in data