from datetime import timedelta from types import SimpleNamespace from src.ircfa_interaction.memory_lifecycle import ( MEMORY_ACTIVE, MEMORY_ARCHIVED, MEMORY_EXPIRED, memory_duplicate_count, memory_lifecycle, new_memory_metadata, refresh_duplicate_metadata, update_memory_controls, utc_now, ) def memory_with(metadata): return SimpleNamespace(metadata_json=metadata) def test_memory_lab_test_note_expires_after_seven_days(): now = utc_now() memory = memory_with( new_memory_metadata( files=None, saved_images=None, message_id="message-1", message="Please remember this harmless Memory Lab test note: bluebird-4829.", now=now, ) ) assert memory_lifecycle(memory, now) == MEMORY_ACTIVE assert memory_lifecycle(memory, now + timedelta(days=7, seconds=1)) == MEMORY_EXPIRED def test_archived_memory_stays_archived_and_can_be_restored(): now = utc_now() memory = memory_with({"lifecycle": MEMORY_ACTIVE, "pinned": False}) memory.metadata_json = update_memory_controls(memory, lifecycle=MEMORY_ARCHIVED, now=now) assert memory_lifecycle(memory, now) == MEMORY_ARCHIVED memory.metadata_json = update_memory_controls(memory, lifecycle=MEMORY_ACTIVE, now=now) assert memory_lifecycle(memory, now) == MEMORY_ACTIVE def test_restoring_an_expired_memory_removes_its_expiry_date(): now = utc_now() memory = memory_with({ "lifecycle": MEMORY_ACTIVE, "expires_at": (now - timedelta(seconds=1)).isoformat(), }) memory.metadata_json = update_memory_controls(memory, lifecycle=MEMORY_ACTIVE, now=now) assert "expires_at" not in memory.metadata_json assert memory_lifecycle(memory, now) == MEMORY_ACTIVE def test_repeated_memory_request_refreshes_one_record_metadata(): now = utc_now() memory = memory_with({"remember_count": 1, "lifecycle": MEMORY_ACTIVE}) refreshed = refresh_duplicate_metadata( memory, message_id="message-2", message="Please remember the same technical note.", now=now, ) assert refreshed["lifecycle"] == MEMORY_ACTIVE assert refreshed["message_id"] == "message-2" assert memory_duplicate_count(memory_with(refreshed)) == 2