You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
SoulSync/tests/playback/test_play_log.py

76 lines
2.3 KiB

"""Tests for core.playback.play_log.build_play_event."""
from __future__ import annotations
from core.playback.play_log import WEB_PLAYER_SOURCE, build_play_event
TS = "2026-05-30T12:00:00Z"
def test_library_track_full_event():
ev = build_play_event(
{"id": 4321, "title": "DtMF", "artist": "Bad Bunny", "album": "DeBÍ"},
TS, duration_ms=237000,
)
assert ev == {
"track_id": "4321",
"title": "DtMF",
"artist": "Bad Bunny",
"album": "DeBÍ",
"played_at": TS,
"duration_ms": 237000,
"server_source": WEB_PLAYER_SOURCE,
"db_track_id": 4321,
}
def test_int_string_id_is_db_track_id():
ev = build_play_event({"id": "99", "title": "X"}, TS)
assert ev["db_track_id"] == 99
assert ev["track_id"] == "99"
def test_composite_id_not_used_as_db_track_id():
# Streamed/search results can carry a composite id like "user||file" —
# must NOT become db_track_id (would corrupt the int FK join).
ev = build_play_event({"id": "peer||song.flac", "title": "Streamed"}, TS)
assert ev["db_track_id"] is None
assert ev["track_id"] == "peer||song.flac"
def test_missing_title_returns_none():
assert build_play_event({"id": 1, "artist": "A"}, TS) is None
assert build_play_event({"title": " "}, TS) is None
def test_non_dict_returns_none():
assert build_play_event(None, TS) is None
assert build_play_event("nope", TS) is None
def test_missing_fields_default_to_empty():
ev = build_play_event({"title": "Solo"}, TS)
assert ev["artist"] == ""
assert ev["album"] == ""
assert ev["duration_ms"] == 0
assert ev["db_track_id"] is None
assert ev["track_id"] is None
def test_bad_duration_is_zero():
ev = build_play_event({"id": 1, "title": "T"}, TS, duration_ms="not-a-number")
assert ev["duration_ms"] == 0
def test_bool_id_not_treated_as_int():
# True is an int in Python — must not slip through as a track id.
ev = build_play_event({"id": True, "title": "T"}, TS)
assert ev["db_track_id"] is None
def test_caller_supplies_timestamp_pure():
# The module never reads the clock — same input → same output.
a = build_play_event({"id": 1, "title": "T"}, TS)
b = build_play_event({"id": 1, "title": "T"}, TS)
assert a == b