"""Tests v43 DDEX track generation.""" from textwrap import dedent from unittest.mock import patch import pytest from soundrecording_utils.ddex.v43 import track from soundrecording_utils.ddex.v43.e import E from soundrecording_utils.metadata.types import LabelParticipant, Track, TrackParticipation def test_generate_p_line( helpers, ): """Test generate_p_line format.""" result = track.generate_p_line('2021 Example Label') result = helpers.print_xml(result) expected = """ (P) 2021 Example Label """ assert result == dedent(expected).strip() @pytest.mark.parametrize( 'artist_names, expected_result', [ ([], ''), (['T1'], 'T1'), (['T1', 'T2'], 'T1 & T2'), (['T1', 'T2', 'T3'], 'T1, T2 & T3'), (['T1', 'T2', 'T3', 'T4'], 'Various Artists') ] ) def test_generate_display_artist_name( artist_names, expected_result, mock_track_participation, mock_label_participant, helpers): """Test formatting display artist name.""" result = track.generate_display_artist_name([ mock_track_participation._replace( participant=mock_label_participant._replace(name=x) ) for x in artist_names ]) result = helpers.print_xml(result) expected = f""" {expected_result} """ assert result == dedent(expected).strip() def test_generate_display_artist_name_filter( mock_track_participation, mock_label_participant, helpers): """Test display artist name filtering on participant type.""" result = track.generate_display_artist_name([ mock_track_participation._replace( participant=mock_label_participant._replace(name='P1') ), mock_track_participation._replace( participant=mock_label_participant._replace(name='P2') ), mock_track_participation._replace( participant=mock_label_participant._replace(name='P3'), participated_as='featuring' ) ]) result = helpers.print_xml(result) expected = """ P1 & P2 """ assert result == dedent(expected).strip() def test_generate_display_artist( mock_track_participation: TrackParticipation, helpers, ): """Test _generate_display_artist format.""" result = track._generate_display_artist( 1, [ mock_track_participation, mock_track_participation._replace( participated_as='track_writer' ), ], ) result = helpers.print_xml(result) expected = """ P-00000000-0000-0000-0000-000000000000 MainArtist """ # noqa: E501 assert result == dedent(expected).strip() @patch('soundrecording_utils.ddex.v43.track._generate_display_artist') def test_generate_track_display_artists( mocked_generate_display_artist, mock_track: Track, mock_track_participation: TrackParticipation, mock_label_participant: LabelParticipant, helpers ): """Test generate_track_display_artists.""" mocked_generate_display_artist.side_effect = lambda x, p: E( 'MockDisplayArtist', { 'SequenceNumber': x, }, *( E('MockParticipationRole', participation.participated_as) for participation in p ) ) mock_track = mock_track._replace( participations=[ mock_track_participation, mock_track_participation._replace( participated_as='track_writer' ), mock_track_participation._replace( participant=mock_label_participant._replace( uuid='55555555-5555-5555-5555-555555555555', ), participated_as='featuring', ), ] ) result = track.generate_track_display_artists(mock_track) display_artist_collection = E( 'TestContainer', *result, ) result = helpers.print_xml(display_artist_collection) expected = """ performer featuring """ # noqa: E501 assert result == dedent(expected).strip() def test_generate_track_contributor_artists( mock_track_participation: TrackParticipation, mock_track: Track, helpers, ): """Test generate_track_contributor_artists.""" mock_track = mock_track._replace( participations=[ mock_track_participation._replace( participated_as='producer', ), mock_track_participation._replace( participated_as='remixer', ), mock_track_participation._replace( participated_as='track_writer', ), ] ) result = track.generate_track_contributor_artists(mock_track) contributor_artist_collection = E( 'TestContainer', *result, ) result = helpers.print_xml(contributor_artist_collection) expected = """ P-00000000-0000-0000-0000-000000000000 UserDefined UserDefined Composer """ # noqa: E501 assert result == dedent(expected).strip()