File size: 2,140 Bytes
4ae09a8
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
from unittest.mock import MagicMock, patch
from db import SongRepo, slugify


def test_slugify_basic():
    assert slugify("Never Gonna Give You Up", "Rick Astley") == "never-gonna-give-you-up-rick-astley"


def test_slugify_truncates_long_input():
    s = slugify("a" * 200, "b" * 50)
    assert len(s) <= 80


def test_slugify_strips_punctuation():
    assert slugify("Hello, World!", "DJ?") == "hello-world-dj"


def _repo_with_mock_client():
    client = MagicMock()
    return SongRepo(client), client


def test_get_song_returns_row_or_none():
    repo, client = _repo_with_mock_client()
    client.table.return_value.select.return_value.eq.return_value.maybe_single.return_value.execute.return_value = MagicMock(data={"youtube_id": "abc"})
    row = repo.get_song("abc")
    assert row == {"youtube_id": "abc"}


def test_upsert_song_calls_supabase_upsert():
    repo, client = _repo_with_mock_client()
    client.table.return_value.upsert.return_value.execute.return_value = MagicMock(data=[{"youtube_id": "abc"}])
    repo.upsert_song({
        "youtube_id": "abc", "slug": "x", "title": "T", "artist": "A",
        "duration_sec": 100, "r2_key": "karaoke/abc.mp3",
        "thumbnail_url": "https://i.ytimg.com/vi/abc/hqdefault.jpg",
        "status": "ready",
    })
    client.table.assert_called_with("songs")
    client.table.return_value.upsert.assert_called_once()


def test_create_job_inserts_and_returns_id():
    repo, client = _repo_with_mock_client()
    client.table.return_value.insert.return_value.execute.return_value = MagicMock(
        data=[{"id": "job-uuid", "youtube_id": "abc", "status": "queued"}]
    )
    jid = repo.create_job("abc")
    assert jid == "job-uuid"


def test_update_job_sets_status_and_error():
    repo, client = _repo_with_mock_client()
    client.table.return_value.update.return_value.eq.return_value.execute.return_value = MagicMock(data=[])
    repo.update_job("job-uuid", status="failed_fetch", error="boom")
    call = client.table.return_value.update.call_args[0][0]
    assert call["status"] == "failed_fetch"
    assert call["error"] == "boom"
    assert "finished_at" in call