"""Tests for primary track selection logic.""" from unittest import mock from soundrecording_utils.ddex.utils.primary_track import get_primary_track from soundrecording_utils.metadata.types import OrchardSoundRecording, TrackConnection OSR_ISRC = 'QM6N22376917' TRACK_ISRC = 'TRACKABC1234' TRACK_TUID = 'tuid-abc-1234' APP_NAME = 'TestApp' _TRACK_INFO = { 'trackName': 'Test Song', 'labelSoundRecording': {'label': {'name': 'Test Label'}}, 'product': {'subgenre': {'genre': {'name': 'Pop'}}}, 'participations': [ { 'participant': {'name': 'Artist A', 'uuid': 'uuid-1'}, 'participated_as': 'performer', } ], } def _empty_osr(): return OrchardSoundRecording( isrc=OSR_ISRC, track_connection=TrackConnection(tracks=[]), assets=[], ) @mock.patch('soundrecording_utils.ddex.utils.primary_track.get_track') @mock.patch('soundrecording_utils.ddex.utils.primary_track.get_primary_track_isrc_and_tuid') def test_get_primary_track_uses_track_tuid_for_gql( mock_get_isrc_and_tuid, mock_get_track ): """When tracks=[], resolves track ISRC+TUID via OSR query before fetching metadata.""" mock_get_isrc_and_tuid.return_value = (TRACK_ISRC, TRACK_TUID) mock_get_track.return_value = _TRACK_INFO get_primary_track(_empty_osr(), APP_NAME) mock_get_isrc_and_tuid.assert_called_once_with(OSR_ISRC, APP_NAME) mock_get_track.assert_called_once_with(TRACK_ISRC, TRACK_TUID, APP_NAME) @mock.patch('soundrecording_utils.ddex.utils.primary_track.get_track') @mock.patch('soundrecording_utils.ddex.utils.primary_track.get_primary_track_isrc_and_tuid') def test_get_primary_track_populates_label_name(mock_get_isrc_and_tuid, mock_get_track): """Populates LabelName from the track GQL response.""" mock_get_isrc_and_tuid.return_value = (TRACK_ISRC, TRACK_TUID) mock_get_track.return_value = _TRACK_INFO track = get_primary_track(_empty_osr(), APP_NAME) assert track.product.label.name == 'Test Label' @mock.patch('soundrecording_utils.ddex.utils.primary_track.get_track') @mock.patch('soundrecording_utils.ddex.utils.primary_track.get_primary_track_isrc_and_tuid') def test_get_primary_track_populates_participations(mock_get_isrc_and_tuid, mock_get_track): """Participations (used for DisplayArtistName) are populated from GQL.""" mock_get_isrc_and_tuid.return_value = (TRACK_ISRC, TRACK_TUID) mock_get_track.return_value = _TRACK_INFO track = get_primary_track(_empty_osr(), APP_NAME) assert len(track.participations) == 1 assert track.participations[0].participant.name == 'Artist A' assert track.participations[0].participated_as == 'performer' @mock.patch('soundrecording_utils.ddex.utils.primary_track.get_track') @mock.patch('soundrecording_utils.ddex.utils.primary_track.get_primary_track_isrc_and_tuid') def test_get_primary_track_returns_empty_dummy_when_tuid_not_resolved( mock_get_isrc_and_tuid, mock_get_track ): """When get_primary_track_isrc_and_tuid returns None, get_track is not called. A dummy track with empty fields is returned. """ mock_get_isrc_and_tuid.return_value = None track = get_primary_track(_empty_osr(), APP_NAME) mock_get_track.assert_not_called() assert track.product.label.name == '' assert track.participations == [] assert track.name == '' @mock.patch('soundrecording_utils.ddex.utils.primary_track.get_track') @mock.patch('soundrecording_utils.ddex.utils.primary_track.get_primary_track_isrc_and_tuid') def test_get_primary_track_returns_empty_dummy_when_track_info_not_found( mock_get_isrc_and_tuid, mock_get_track ): """When get_track returns None (TUID not found), dummy track is returned.""" mock_get_isrc_and_tuid.return_value = (TRACK_ISRC, TRACK_TUID) mock_get_track.return_value = None track = get_primary_track(_empty_osr(), APP_NAME) assert track.product.label.name == '' assert track.participations == [] def test_get_primary_track_returns_primary_track_when_tracks_present( mock_track, mock_orchard_sound_recording ): """When track_connection has tracks, returns the primary one without calling GQL.""" with mock.patch( 'soundrecording_utils.ddex.utils.primary_track.get_primary_track_isrc_and_tuid' ) as mock_get_isrc_and_tuid: result = get_primary_track(mock_orchard_sound_recording, APP_NAME) mock_get_isrc_and_tuid.assert_not_called() assert result == mock_track