import unittest from types import SimpleNamespace class ModelNormalizationTests(unittest.TestCase): def test_catalog_song_from_song_info_builds_stable_platform_key(self): from musicdl.catalogsync.models import CatalogSong, normalize_source_name song_info = SimpleNamespace( source="QQMusicClient", identifier="000x564O1lrTDY", song_name="摆脱地心引力", singers="时代少年团", album="摆脱地心引力", ext="flac", file_size_bytes=45381227, file_size="43.29 MB", raw_data={"quality": "lossless"}, ) normalized = CatalogSong.from_song_info(song_info) self.assertEqual("qq", normalize_source_name(song_info.source)) self.assertEqual("qq", normalized.platform) self.assertEqual("000x564O1lrTDY", normalized.remote_song_id) self.assertEqual("qq:000x564O1lrTDY", normalized.song_key) self.assertEqual("lossless", normalized.quality_label) self.assertEqual(45381227, normalized.file_size_bytes) def test_extract_artist_names_merges_raw_artists_and_display_text(self): from musicdl.catalogsync.models import extract_artist_names raw_data = { "search": { "singer": [{"name": "周杰伦"}, {"name": "方文山"}], } } names = extract_artist_names(raw_data, "周杰伦 / 方文山, 林俊杰") self.assertEqual(["周杰伦", "方文山", "林俊杰"], names) if __name__ == "__main__": unittest.main()