147 lines
4.3 KiB
Python
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
|