"""Tests Meta DDEX header generation."""
from textwrap import dedent
from unittest.mock import patch
import pytest
from soundrecording_utils.ddex.v38 import track
from soundrecording_utils.ddex.v38.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 = """
Test Participant
00000000-0000-0000-0000-000000000000
MainArtist
Composer
""" # noqa: E501
assert result == dedent(expected).strip()
@patch('soundrecording_utils.ddex.v38.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
track_writer
featuring
""" # noqa: E501
assert result == dedent(expected).strip()