Skip to content

Commit 1f9369d

Browse files
committed
Add test_ttl
1 parent 97f6723 commit 1f9369d

File tree

2 files changed

+35
-2
lines changed

2 files changed

+35
-2
lines changed

libs/langgraph-checkpoint-mongodb/langgraph/checkpoint/mongodb/saver.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ class MongoDBSaver(BaseCheckpointSaver):
4040
db_name (Optional[str]): Database name
4141
checkpoint_collection_name (Optional[str]): Name of Collection of Checkpoints
4242
writes_collection_name (Optional[str]): Name of Collection of intermediate writes.
43-
ttl (Optional[int]): Time to live in seconds.
43+
ttl (Optional[int]): Time to live in seconds. See https://www.mongodb.com/docs/manual/core/index-ttl/.
4444
4545
Examples:
4646
@@ -87,12 +87,12 @@ def __init__(
8787
keys=[("thread_id", 1), ("checkpoint_ns", 1), ("checkpoint_id", -1)],
8888
unique=True,
8989
)
90-
9190
if self.ttl:
9291
self.checkpoint_collection.create_index(
9392
keys=[("created_at", ASCENDING)],
9493
expireAfterSeconds=self.ttl,
9594
)
95+
9696
if len(self.writes_collection.list_indexes().to_list()) < 2:
9797
self.writes_collection.create_index(
9898
keys=[

libs/langgraph-checkpoint-mongodb/tests/unit_tests/test_sync.py

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import os
2+
from time import sleep
23
from typing import Any
34

45
import pytest
@@ -165,3 +166,35 @@ def test_nested_filter() -> None:
165166
# Drop collections
166167
saver.checkpoint_collection.drop()
167168
saver.writes_collection.drop()
169+
170+
171+
def test_ttl(input_data: dict[str, Any]) -> None:
172+
collection_name = "ttl_test"
173+
ttl = 1
174+
background_period = 60 # period between background task runs
175+
176+
with MongoDBSaver.from_conn_string(
177+
MONGODB_URI, DB_NAME, collection_name, ttl=ttl
178+
) as saver:
179+
try:
180+
# save a checkpoint
181+
saver.put(
182+
input_data["config_2"],
183+
input_data["chkpnt_2"],
184+
input_data["metadata_2"],
185+
{},
186+
)
187+
188+
query: dict[str, Any] = {} # search by no keys, return all checkpoints
189+
search_results_2 = list(saver.list(None, filter=query))
190+
assert len(search_results_2) == 1
191+
assert search_results_2[0].metadata == input_data["metadata_2"]
192+
193+
sleep(ttl + background_period)
194+
assert len(list(saver.list(None, filter=query))) == 0
195+
196+
finally:
197+
saver.checkpoint_collection.delete_many({})
198+
saver.checkpoint_collection.drop_indexes()
199+
saver.writes_collection.delete_many({})
200+
saver.writes_collection.drop_indexes()

0 commit comments

Comments
 (0)