summaryrefslogtreecommitdiffstats
path: root/packages/meshbay-node/tests/test_enrich_photo.py
diff options
context:
space:
mode:
Diffstat (limited to 'packages/meshbay-node/tests/test_enrich_photo.py')
-rw-r--r--packages/meshbay-node/tests/test_enrich_photo.py28
1 files changed, 28 insertions, 0 deletions
diff --git a/packages/meshbay-node/tests/test_enrich_photo.py b/packages/meshbay-node/tests/test_enrich_photo.py
index e0c1b73..877a71d 100644
--- a/packages/meshbay-node/tests/test_enrich_photo.py
+++ b/packages/meshbay-node/tests/test_enrich_photo.py
@@ -62,6 +62,34 @@ async def test_enricher_populates_dimensions_and_stores_thumbnail(tmp_path, medi
@pytest.mark.asyncio
+async def test_enricher_reuses_cached_meta_without_touching_the_file_again(tmp_path, media_cache):
+ """
+ The gap this closes: enrichment fields only ever lived in the in-memory
+ GroupIndex, so every daemon restart re-ran Pillow over every photo in
+ every configured root from scratch, even though media_cache.db (the
+ thumbnail bytes) already had the answer. A second PhotoEnricher sharing
+ the same media_cache — standing in for "the daemon restarted" — must
+ reuse it instead. Proven strongly: the source file is deleted between
+ the two runs, so a second real decode attempt would fail outright
+ rather than merely being redundant.
+ """
+ img = tmp_path / "reused.jpg"
+ _save_jpeg(img, size=(300, 200))
+ entry = IndexEntry(id="fileid_reuse", name=img.name, path=img.name,
+ size=img.stat().st_size, type="image", added_at=0)
+
+ first_enricher = PhotoEnricher(media_cache)
+ _, first_fields = await _run(first_enricher, entry, img)
+ assert first_fields.get("thumb_hash")
+
+ img.unlink() # a real second decode would now raise, not just be wasteful
+ second_enricher = PhotoEnricher(media_cache)
+ _, second_fields = await _run(second_enricher, entry, img)
+
+ assert second_fields == first_fields
+
+
+@pytest.mark.asyncio
async def test_enricher_no_exif_degrades_gracefully(tmp_path, media_cache):
"""A screenshot or a re-saved image with no EXIF block at all is the
ordinary case, not an error — must not raise and must leave taken_at/