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"))]