49 lines
1.5 KiB
Python
49 lines
1.5 KiB
Python
from pathlib import Path
|
|
|
|
from serato_doctor.database_parser import iter_records, parse_database
|
|
|
|
|
|
def record(tag, payload):
|
|
return tag + len(payload).to_bytes(4, "big") + payload
|
|
|
|
|
|
def text_record(tag, value):
|
|
return record(tag, value.encode("utf-16-be"))
|
|
|
|
|
|
def test_parse_database_reads_track_paths_and_metadata(tmp_path):
|
|
track = b"".join(
|
|
[
|
|
text_record(b"pfil", "Users/sample/Music/Track.mp3"),
|
|
text_record(b"tsng", "Track title"),
|
|
text_record(b"tart", "Test artist"),
|
|
text_record(b"talb", "Test album"),
|
|
text_record(b"tgen", "House"),
|
|
]
|
|
)
|
|
database_path = tmp_path / "database V2"
|
|
database_path.write_bytes(
|
|
text_record(b"vrsn", "2.0/Test Database") + record(b"otrk", track)
|
|
)
|
|
|
|
database = parse_database(database_path)
|
|
|
|
assert database.version == "2.0/Test Database"
|
|
assert len(database.tracks) == 1
|
|
parsed = database.tracks[0]
|
|
assert parsed.path == Path("/Users/sample/Music/Track.mp3")
|
|
assert parsed.filename == "Track.mp3"
|
|
assert parsed.title == "Track title"
|
|
assert parsed.artist == "Test artist"
|
|
assert parsed.album == "Test album"
|
|
assert parsed.genre == "House"
|
|
|
|
|
|
def test_iter_records_ignores_incomplete_trailing_record():
|
|
complete = record(b"vrsn", "2.0".encode("utf-16-be"))
|
|
incomplete = b"otrk\x00\x00\x00\x10short"
|
|
|
|
records = list(iter_records(complete + incomplete))
|
|
|
|
assert records == [(b"vrsn", "2.0".encode("utf-16-be"))]
|