from backend.app.utils.sidecar import SidecarData, find_sidecar, parse_sidecar def test_find_sidecar_stem_json(tmp_path): media = tmp_path / "photo.jpg" media.write_bytes(b"x") sc = tmp_path / "photo.json" sc.write_text("{}") assert find_sidecar(media) == sc def test_find_sidecar_full_name_json(tmp_path): media = tmp_path / "photo.jpg" media.write_bytes(b"x") sc = tmp_path / "photo.jpg.json" sc.write_text("{}") assert find_sidecar(media) == sc def test_find_sidecar_none(tmp_path): media = tmp_path / "photo.jpg" media.write_bytes(b"x") assert find_sidecar(media) is None def test_parse_empty_dict_all_none(): sd = parse_sidecar({}) assert isinstance(sd, SidecarData) assert (sd.platform, sd.external_post_id, sd.post_url, sd.post_title, sd.description, sd.attachment_count, sd.post_date) == ( None, None, None, None, None, None, None) assert sd.raw == {} def test_parse_core_fields_and_id_priority(): sd = parse_sidecar({ "category": "patreon", "id": 12345, "post_id": 999, "url": "https://patreon.com/posts/12345", "title": " Hello ", "content": "

body

", "page_count": 4, "published_at": "2023-08-01T04:20:02Z", }) assert sd.platform == "patreon" assert sd.external_post_id == "12345" # 'id' wins over 'post_id' assert sd.post_url == "https://patreon.com/posts/12345" assert sd.post_title == "Hello" assert sd.description == "

body

" assert sd.attachment_count == 4 assert sd.post_date.year == 2023 and sd.post_date.tzinfo is not None def test_parse_description_precedence_and_images_count(): sd = parse_sidecar({"description": "d", "caption": "c", "images": [1, 2, 3]}) assert sd.description == "d" # content>description>caption assert sd.attachment_count == 3 # len(images) fallback def test_parse_date_epoch_and_unparseable_and_naive(): assert parse_sidecar({"timestamp": 1690857602}).post_date.tzinfo is not None assert parse_sidecar({"date": "not-a-date"}).post_date is None naive = parse_sidecar({"date": "2023-08-01T00:00:00"}).post_date assert naive is not None and naive.utcoffset().total_seconds() == 0 def test_parse_ignores_non_str_junk(): sd = parse_sidecar({"category": 5, "title": 7, "page_count": "x", "id": True}) assert sd.platform is None and sd.post_title is None assert sd.attachment_count is None assert sd.external_post_id is None # bool is not a valid id assert sd.raw == {"category": 5, "title": 7, "page_count": "x", "id": True}