summaryrefslogtreecommitdiffstats
path: root/packages/meshbay-node/tests/test_media_cache.py
blob: e70ef43f1452323a90d2c6036c3629da55a72408 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
"""Tests for media_cache.py — TMDB/MusicBrainz/thumbnail cache and its pruning obligation."""

import time

import pytest

from meshbay_node.media_cache import MediaCache, TMDB_META_TTL_SECS, MUSICBRAINZ_META_TTL_SECS


@pytest.fixture
async def cache(tmp_path):
    c = MediaCache(db_path=tmp_path / "media_cache.db")
    await c.open()
    yield c
    await c.close()


@pytest.mark.asyncio
async def test_file_tmdb_round_trip(cache):
    assert await cache.get_file_tmdb("file1") is None

    await cache.set_file_tmdb("file1", "12345", "movie")

    assert await cache.get_file_tmdb("file1") == ("12345", "movie")


@pytest.mark.asyncio
async def test_tmdb_meta_round_trip(cache):
    assert await cache.get_tmdb_meta("12345", "movie") is None

    await cache.set_tmdb_meta("12345", "movie", {"title": "A Movie", "vote_average": 7.5})

    meta = await cache.get_tmdb_meta("12345", "movie")
    assert meta == {"title": "A Movie", "vote_average": 7.5}


@pytest.mark.asyncio
async def test_tmdb_meta_expires_after_ttl(cache):
    await cache._db.execute(
        "INSERT INTO tmdb_meta (tmdb_id, media_type, json, fetched_at) VALUES (?, ?, ?, ?)",
        ("999", "movie", '{"title": "Old"}', time.time() - TMDB_META_TTL_SECS - 1),
    )
    await cache._db.commit()

    assert await cache.get_tmdb_meta("999", "movie") is None


@pytest.mark.asyncio
async def test_thumb_round_trip(cache):
    assert await cache.get_thumb("thumbhash1") is None

    await cache.put_thumb("thumbhash1", "file1", b"\xff\xd8fakejpeg")

    assert await cache.get_thumb("thumbhash1") == b"\xff\xd8fakejpeg"


@pytest.mark.asyncio
async def test_prune_file_removes_thumb_and_mapping_but_not_shared_meta(cache):
    # Two episodes of the same show share one tmdb_meta row (§2's stated case).
    await cache.set_file_tmdb("ep1", "555", "tv")
    await cache.set_file_tmdb("ep2", "555", "tv")
    await cache.set_tmdb_meta("555", "tv", {"name": "A Show"})
    await cache.put_thumb("thumb-ep1", "ep1", b"jpeg-bytes-1")

    await cache.prune_file("ep1")

    assert await cache.get_file_tmdb("ep1") is None
    assert await cache.get_thumb("thumb-ep1") is None
    # ep2's own mapping and the shared show metadata both survive
    assert await cache.get_file_tmdb("ep2") == ("555", "tv")
    assert await cache.get_tmdb_meta("555", "tv") == {"name": "A Show"}


# ── Music app (docs/musicbay.md §6) — file_mbid/mbid_meta ────────────────────

@pytest.mark.asyncio
async def test_file_mbid_round_trip(cache):
    assert await cache.get_file_mbid("file1") is None

    await cache.set_file_mbid("file1", "release-mbid-1")

    assert await cache.get_file_mbid("file1") == "release-mbid-1"


@pytest.mark.asyncio
async def test_mbid_meta_round_trip(cache):
    assert await cache.get_mbid_meta("release-mbid-1") is None

    await cache.set_mbid_meta("release-mbid-1", {"artist": "Some Artist", "album": "An Album"})

    meta = await cache.get_mbid_meta("release-mbid-1")
    assert meta == {"artist": "Some Artist", "album": "An Album"}


@pytest.mark.asyncio
async def test_mbid_meta_expires_after_ttl(cache):
    await cache._db.execute(
        "INSERT INTO mbid_meta (mbid, json, fetched_at) VALUES (?, ?, ?)",
        ("old-mbid", '{"album": "Old"}', time.time() - MUSICBRAINZ_META_TTL_SECS - 1),
    )
    await cache._db.commit()

    assert await cache.get_mbid_meta("old-mbid") is None


@pytest.mark.asyncio
async def test_prune_file_removes_mbid_mapping_but_not_shared_meta(cache):
    # Two tracks of the same release share one mbid_meta row.
    await cache.set_file_mbid("track1", "release-mbid-1")
    await cache.set_file_mbid("track2", "release-mbid-1")
    await cache.set_mbid_meta("release-mbid-1", {"album": "An Album"})
    await cache.put_thumb("cover-hash", "track1", b"cover-bytes")

    await cache.prune_file("track1")

    assert await cache.get_file_mbid("track1") is None
    assert await cache.get_thumb("cover-hash") is None
    # track2's own mapping and the shared release metadata both survive
    assert await cache.get_file_mbid("track2") == "release-mbid-1"
    assert await cache.get_mbid_meta("release-mbid-1") == {"album": "An Album"}