"""Tests Meta DDEX header generation."""
from textwrap import dedent
from unittest.mock import patch
from src.constants.ddex import DEFAULT_TERRITORY_CODE
from src.ddex import release
from src.ddex.e import E
from soundrecording_utils.metadata.types import OrchardSoundRecording
from soundrecording_utils.metadata.types import Track
from soundrecording_utils.metadata.types import TrackConnection
@patch('src.ddex.release.generate_p_line')
def test_generate_p_lines(
mock_generate_p_line,
mock_orchard_sound_recording: OrchardSoundRecording,
mock_track: Track,
helpers,
):
"""Test _generate_p_lines for single label."""
mock_generate_p_line.side_effect = lambda p_info: E('MockPLine', p_info)
result = release._generate_p_lines(mock_orchard_sound_recording)
pline_collection = E(
'TestContainer',
*result,
)
result = helpers.print_xml(pline_collection)
expected = """
2021 Example Label
"""
assert result == dedent(expected).strip()
@patch('src.ddex.release.generate_p_line')
def test_generate_p_lines_duplicate_track_p_lines(
mock_generate_p_line,
mock_orchard_sound_recording: OrchardSoundRecording,
mock_track: Track,
helpers,
):
"""Test _generate_p_lines for duplicate labels."""
mock_generate_p_line.side_effect = lambda p_info: E('MockPLine', p_info)
mock_orchard_sound_recording = mock_orchard_sound_recording._replace(
track_connection=TrackConnection(
tracks=[
mock_track,
mock_track,
],
),
)
result = release._generate_p_lines(mock_orchard_sound_recording)
pline_collection = E(
'TestContainer',
*result,
)
result = helpers.print_xml(pline_collection)
expected = """
2021 Example Label
"""
assert result == dedent(expected).strip()
@patch('src.ddex.release.generate_p_line')
def test_generate_p_lines_multiple_track_p_lines(
mock_generate_p_line,
mock_orchard_sound_recording: OrchardSoundRecording,
mock_track: Track,
helpers,
):
"""Test _generate_p_lines for multiple labels."""
mock_generate_p_line.side_effect = lambda p_info: E('MockPLine', p_info)
mock_orchard_sound_recording = mock_orchard_sound_recording._replace(
track_connection=TrackConnection(
tracks=[
mock_track._replace(
p_info='2020 Example Label',
),
mock_track._replace(
p_info='2021 Some Other Label',
),
mock_track._replace(
p_info='2020 Example Label',
),
],
),
)
result = release._generate_p_lines(mock_orchard_sound_recording)
pline_collection = E(
'TestContainer',
*result,
)
result = helpers.print_xml(pline_collection)
expected = """
2020 Example Label
2021 Some Other Label
"""
assert result == dedent(expected).strip()
@patch('src.ddex.release.generate_reference_title')
@patch('src.ddex.release._generate_p_lines')
@patch('src.ddex.release._generate_all_release_details_by_territories')
def test_generate_release(
mock_generate_all_release_details_by_terretories,
mock_generate_p_lines,
mock_generate_reference_title,
mock_orchard_sound_recording: OrchardSoundRecording,
helpers,
):
"""Test generate_release."""
mock_generate_p_lines.return_value = [
E('MockPLine1'),
E('MockPLine2'),
]
mock_generate_all_release_details_by_terretories.return_value = [
E('MockResourceDetailByTerritory1'),
E('MockResourceDetailByTerritory2'),
]
mock_generate_reference_title.return_value = E('MockReferenceTitle')
result = release.generate_release(
'R0',
'A1',
mock_orchard_sound_recording,
)
result = helpers.print_xml(result)
expected = """
XXAAA2100000
R0
A1
SingleResourceRelease
""" # noqa: E501
assert result == dedent(expected).strip()
@patch(
'src.ddex.release.'
'_generate_release_details_by_territory'
)
@patch(
'src.ddex.release.'
'deduplicate_territories'
)
def test_generate_all_release_details_by_territories(
mock_deduplicate_territories, mock_generate_details,
mock_track, mock_orchard_sound_recording):
"""Test track filtering by territories."""
mock_generate_details.return_value = 'Result'
mock_orchard_sound_recording = mock_orchard_sound_recording._replace(
track_connection=TrackConnection(
tracks=[
mock_track._replace(territories=[]),
mock_track
],
),
)
mock_deduplicate_territories.return_value = \
mock_orchard_sound_recording.track_connection.tracks
result = release._generate_all_release_details_by_territories(
mock_orchard_sound_recording
)
assert result == ['Result']
mock_deduplicate_territories.assert_called_once_with(mock_orchard_sound_recording) # noqa:E501
mock_generate_details.assert_called_once_with(mock_track.territories, mock_track) # noqa:E501
@patch(
'src.ddex.release.'
'_generate_release_details_by_territory'
)
@patch(
'src.ddex.release.'
'deduplicate_territories'
)
def test_generate_all_release_details_by_territories_no_territories(
mock_deduplicate_territories, mock_generate_details,
mock_track, mock_orchard_sound_recording):
"""Test track filtering by territories."""
mock_generate_details.return_value = 'Result'
mock_orchard_sound_recording = mock_orchard_sound_recording._replace(
track_connection=TrackConnection(
tracks=[
mock_track._replace(territories=[]),
mock_track._replace(territories=[])
],
),
)
mock_deduplicate_territories.return_value = \
mock_orchard_sound_recording.track_connection.tracks
result = release._generate_all_release_details_by_territories(
mock_orchard_sound_recording
)
assert result == ['Result']
mock_deduplicate_territories.assert_called_once_with(mock_orchard_sound_recording) # noqa:E501
mock_generate_details.assert_called_once_with([DEFAULT_TERRITORY_CODE], mock_track._replace(territories=[])) # noqa:E501
@patch(
'src.ddex.release.'
'generate_display_artist_name'
)
@patch(
'src.ddex.release.'
'generate_track_display_artists'
)
def test_generate_details_by_territory(
mock_generate_track_display_artists,
mock_generate_display_artist_name,
mock_track, mock_track_participation, helpers):
"""Test release details xml generation."""
mock_generate_track_display_artists.return_value = [
E('DisplayArtist1'),
E('DisplayArtist2')
]
mock_generate_display_artist_name.return_value = E('DisplayArtistName')
result = release._generate_release_details_by_territory(
['AA', 'BB', 'CC'],
mock_track
)
result = helpers.print_xml(result)
expected = """
AA
BB
CC
Test Label
Test Track Name
NotExplicit
Rock
"""
assert result == dedent(expected).strip()
mock_generate_display_artist_name.assert_called_once_with(mock_track.participations) # noqa:E501
mock_generate_track_display_artists.assert_called_once_with(mock_track)