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