fix: --force re-render progression, cache dir loading, and Joplin link preservation. Co-Authored-By: Fable 5 <noreply@anthropic.com>
This commit is contained in:
@@ -151,3 +151,73 @@ class TestGetNewOrUpdated:
|
||||
convs = [{"id": "a", "updated_at": "2024-06-01T00:00:00Z"}]
|
||||
result = tmp_cache.get_new_or_updated("claude", convs)
|
||||
assert len(result) == 1
|
||||
|
||||
def test_force_returns_all_cached_and_unchanged(self, tmp_cache):
|
||||
tmp_cache.mark_exported("claude", "a", {"updated_at": "2024-01-01T00:00:00Z"})
|
||||
convs = [
|
||||
{"id": "a", "updated_at": "2024-01-01T00:00:00Z"}, # cached, unchanged
|
||||
{"id": "b", "updated_at": "2024-01-02T00:00:00Z"}, # new
|
||||
]
|
||||
assert len(tmp_cache.get_new_or_updated("claude", convs)) == 1
|
||||
assert len(tmp_cache.get_new_or_updated("claude", convs, force=True)) == 2
|
||||
|
||||
def test_force_orders_least_recently_exported_first(self, tmp_cache):
|
||||
# 'a' was exported long ago; 'b' just now; 'c' never.
|
||||
tmp_cache.mark_exported("claude", "a", {"updated_at": "2024-01-01T00:00:00Z"})
|
||||
tmp_cache._data["claude"]["a"]["exported_at"] = "2024-01-01T00:00:00Z"
|
||||
tmp_cache.mark_exported("claude", "b", {"updated_at": "2024-01-01T00:00:00Z"})
|
||||
tmp_cache._data["claude"]["b"]["exported_at"] = "2026-06-12T00:00:00Z"
|
||||
convs = [{"id": "a"}, {"id": "b"}, {"id": "c"}]
|
||||
ordered = [c["id"] for c in tmp_cache.get_new_or_updated("claude", convs, force=True)]
|
||||
# never-exported ('c', exported_at "") and oldest ('a') come before 'b'
|
||||
assert ordered == ["c", "a", "b"]
|
||||
|
||||
def test_force_capped_run_makes_progress(self, tmp_cache):
|
||||
"""The bug: force + cap repeated the same head every run. Now each
|
||||
capped run re-exports the next-oldest batch and converges."""
|
||||
convs = [{"id": f"c{i}", "updated_at": "2024-01-01T00:00:00Z"} for i in range(5)]
|
||||
seen = set()
|
||||
for _ in range(3): # cap=2 over 3 runs should cover all 5
|
||||
batch = tmp_cache.get_new_or_updated("claude", convs, force=True)[:2]
|
||||
for c in batch:
|
||||
seen.add(c["id"])
|
||||
tmp_cache.mark_exported("claude", c["id"], {"file_path": f"/{c['id']}.md"})
|
||||
assert seen == {f"c{i}" for i in range(5)}
|
||||
|
||||
|
||||
class TestReexportPreservesJoplinLink:
|
||||
"""A re-export must not drop the Joplin note link, or re-syncing would
|
||||
create duplicate notes instead of updating the existing ones."""
|
||||
|
||||
def test_joplin_fields_carried_across_reexport(self, tmp_cache):
|
||||
tmp_cache.mark_exported("chatgpt", "c1", {
|
||||
"title": "T", "updated_at": "2024-01-01T00:00:00Z", "file_path": "/x.md",
|
||||
})
|
||||
tmp_cache.mark_joplin_synced("chatgpt", "c1", "note-123")
|
||||
tmp_cache.set_joplin_resources("chatgpt", "c1", {"media/a.png": "res-1"})
|
||||
|
||||
# Re-export the same conversation (new render, new file_path).
|
||||
tmp_cache.mark_exported("chatgpt", "c1", {
|
||||
"title": "T", "updated_at": "2024-01-01T00:00:00Z", "file_path": "/x2.md",
|
||||
})
|
||||
|
||||
entry = tmp_cache.get_all_entries("chatgpt")["c1"]
|
||||
assert entry["joplin_note_id"] == "note-123"
|
||||
assert entry["joplin_resources"] == {"media/a.png": "res-1"}
|
||||
assert entry["file_path"] == "/x2.md"
|
||||
|
||||
def test_reexport_marks_note_for_update_not_create(self, tmp_cache):
|
||||
tmp_cache.mark_exported("chatgpt", "c1", {
|
||||
"updated_at": "2024-01-01T00:00:00Z", "file_path": "/x.md",
|
||||
})
|
||||
tmp_cache.mark_joplin_synced("chatgpt", "c1", "note-123")
|
||||
# Nothing pending right after sync.
|
||||
assert tmp_cache.get_joplin_pending("chatgpt") == []
|
||||
# Re-export bumps exported_at past joplin_synced_at → pending for update,
|
||||
# carrying the existing note id so the sync updates rather than creates.
|
||||
tmp_cache.mark_exported("chatgpt", "c1", {
|
||||
"updated_at": "2024-01-01T00:00:00Z", "file_path": "/x.md",
|
||||
})
|
||||
pending = tmp_cache.get_joplin_pending("chatgpt")
|
||||
assert len(pending) == 1
|
||||
assert pending[0][1]["joplin_note_id"] == "note-123"
|
||||
|
||||
Reference in New Issue
Block a user