reddit-media-collector/tests/test_sidecar.py

147 lines
4.3 KiB
Python

"""Tests for sidecar file generation."""
import json
from src.sidecar import generate_filename, write_immich_sidecar
class TestWriteImmichSidecar:
def test_creates_sidecar_file(self, tmp_path):
media_file = tmp_path / "test.jpg"
media_file.write_bytes(b"fake image data")
sidecar_path = write_immich_sidecar(
filepath=str(media_file),
subreddit="pics",
author="testuser",
title="A great photo",
score=150,
created_utc=1700000000.0,
media_type="image",
permalink="/r/pics/comments/abc/a_great_photo/",
flair="OC",
source_type="subreddit",
)
assert sidecar_path.endswith(".json")
with open(sidecar_path) as f:
data = json.load(f)
assert "dateTimeOriginal" in data
assert data["description"] == "A great photo"
assert data["albums"] == ["r/pics"]
assert "reddit" in data["tags"]
assert "pics" in data["tags"]
assert "OC" in data["tags"]
assert data["rating"] == 3 # score 150 -> rating 3
assert data["people"] == ["testuser"]
assert "reddit.com" in data["externalUrl"]
def test_rating_buckets(self, tmp_path):
media_file = tmp_path / "test.jpg"
media_file.write_bytes(b"fake")
test_cases = [
(5, 1),
(10, 2),
(50, 3),
(200, 4),
(1000, 5),
(5000, 5),
]
for score, expected_rating in test_cases:
path = write_immich_sidecar(
filepath=str(media_file),
subreddit="test",
author="user",
title="test",
score=score,
created_utc=1700000000.0,
media_type="image",
)
with open(path) as f:
data = json.load(f)
assert data["rating"] == expected_rating, f"Score {score} should give rating {expected_rating}"
def test_deleted_author_no_people(self, tmp_path):
media_file = tmp_path / "test.jpg"
media_file.write_bytes(b"fake")
write_immich_sidecar(
filepath=str(media_file),
subreddit="test",
author="[deleted]",
title="test",
score=10,
created_utc=1700000000.0,
media_type="image",
)
with open(str(media_file) + ".json") as f:
data = json.load(f)
assert "people" not in data
def test_no_permalink_no_external_url(self, tmp_path):
media_file = tmp_path / "test.jpg"
media_file.write_bytes(b"fake")
write_immich_sidecar(
filepath=str(media_file),
subreddit="test",
author="user",
title="test",
score=10,
created_utc=1700000000.0,
media_type="image",
)
with open(str(media_file) + ".json") as f:
data = json.load(f)
assert "externalUrl" not in data
class TestGenerateFilename:
def test_basic_filename(self):
name = generate_filename(
subreddit="pics",
author="testuser",
created_utc=1700000000.0,
post_id="abc123",
ext=".jpg",
)
assert "pics" in name
assert "testuser" in name
assert "abc123" in name
assert name.endswith(".jpg")
def test_gallery_index(self):
name = generate_filename(
subreddit="pics",
author="testuser",
created_utc=1700000000.0,
post_id="abc123",
ext=".jpg",
gallery_index=3,
)
assert "_3.jpg" in name
def test_deleted_author(self):
name = generate_filename(
subreddit="pics",
author="[deleted]",
created_utc=1700000000.0,
post_id="abc123",
ext=".jpg",
)
assert "unknown" in name
def test_sanitized_names(self):
name = generate_filename(
subreddit="pics/test",
author="user name!@#",
created_utc=1700000000.0,
post_id="abc123",
ext=".jpg",
)
# Should not contain special characters
assert "/" not in name
assert "!" not in name
assert "@" not in name