"""Tests Meta DDEX header generation."""
from textwrap import dedent
from unittest.mock import call
from unittest.mock import patch
from src.ddex import sound_recording
from src.ddex.e import E
from soundrecording_utils.metadata.types import Asset
from soundrecording_utils.metadata.types import Language
from soundrecording_utils.metadata.types import OrchardSoundRecording
from soundrecording_utils.metadata.types import Track
from soundrecording_utils.metadata.types import TrackConnection
def test_format_track_duration_iso_8601(mock_track: Track):
"""Test that format_track_duration formats validly."""
formatted = sound_recording._format_track_duration_iso_8601(mock_track)
assert formatted == 'PT1M2S'
def test_generate_language_of_performance_instrumental(
mock_track: Track,
helpers,
):
"""Test _generate_language_of_performance for N/A meta language."""
mock_track = mock_track._replace(
meta_language_code='N/A',
)
result = sound_recording._generate_language_of_performance(mock_track)
result = helpers.print_xml(result)
expected = """
true
"""
assert result == dedent(expected).strip()
def test_generate_language_of_performance_with_language(
mock_track: Track,
helpers,
):
"""Test _generate_language_of_performance with a language."""
mock_track = mock_track._replace(
meta_language_code='EN',
language=Language(
iso_639_1_code='ES',
),
)
result = sound_recording._generate_language_of_performance(mock_track)
result = helpers.print_xml(result)
expected = """
es
"""
assert result == dedent(expected).strip()
def test_generate_language_of_performance_without_language(
mock_track: Track,
helpers,
):
"""Test _generate_language_of_performance without a language."""
mock_track = mock_track._replace(
meta_language_code='EN',
language=Language(iso_639_1_code=None)
)
result = sound_recording._generate_language_of_performance(mock_track)
assert result is None
def test_generate_subtitle_with_version(
mock_track: Track,
helpers,
):
"""Test _generate_subtitle with a track version."""
mock_track = mock_track._replace(
version='Test Subtitle',
)
result = sound_recording._generate_subtitle(mock_track)
result = helpers.print_xml(result)
expected = """
Test Subtitle
"""
assert result == dedent(expected).strip()
def test_generate_subtitle_without_version(
mock_track: Track,
helpers,
):
"""Test _generate_subtitle with a track version."""
mock_track = mock_track._replace(
version=None,
)
result = sound_recording._generate_subtitle(mock_track)
assert result is None
@patch('src.ddex.sound_recording._generate_subtitle')
def test_generate_reference_title(
mock_generate_subtitle,
mock_track: Track,
helpers,
):
"""Test generate_reference_title."""
mock_generate_subtitle.return_value = E('MockSubTitle')
result = sound_recording.generate_reference_title(mock_track)
result = helpers.print_xml(result)
expected = """
Test Track Name
"""
assert result == dedent(expected).strip()
mock_generate_subtitle.assert_called_once_with(mock_track)
@patch(
'src.ddex.sound_recording.'
'generate_sound_recording_details_by_territory'
)
@patch(
'src.ddex.sound_recording.'
'deduplicate_territories'
)
def test_generate_sound_recording_details_by_territory(
mock_deduplicate_territories,
mock_generate_sound_recording_details_by_territory,
mock_orchard_sound_recording: OrchardSoundRecording,
mock_track: Track,
helpers,
):
"""Test _generate_sound_recording_details_by_territory with territories."""
mock_generate_sound_recording_details_by_territory.side_effect =\
lambda territories, track, rights_percent, upload_asset: E(
'MockSoundRecordingDetailByTerritory',
E('TrackName', track.name),
*(
E('MockTerritory', territory)
for territory
in territories
),
)
mock_tracks = [
mock_track._replace(
name='Track 1',
territories=['AA', 'BB', 'DD'],
),
mock_track._replace(
name='Track 2',
territories=['CC', 'EE', 'FF'],
),
mock_track._replace(
name='Track 3',
territories=[],
)
]
mock_asset = Asset(uuid='123', filename='456', extension='flac')
mock_orchard_sound_recording = mock_orchard_sound_recording._replace(
track_connection=TrackConnection(
tracks=mock_tracks
)
)
mock_deduplicate_territories.return_value = \
mock_orchard_sound_recording.track_connection.tracks
result = sound_recording._generate_sound_recording_details_by_territory(
mock_orchard_sound_recording,
mock_asset
)
assert mock_deduplicate_territories.call_args_list == [
call(mock_orchard_sound_recording)
]
# only expect first track should include asset
assert mock_generate_sound_recording_details_by_territory.call_args_list == [ # noqa:E501
call(
['AA', 'BB', 'DD'],
mock_tracks[0],
'100.00',
mock_asset
),
call(
['CC', 'EE', 'FF'],
mock_tracks[1],
'100.00',
None
)
]
track_by_territory_container = E(
'TestContainer',
*result,
)
result = helpers.print_xml(track_by_territory_container)
expected = """
Track 1
AA
BB
DD
Track 2
CC
EE
FF
""" # noqa: E501
assert result == dedent(expected).strip()
@patch(
'src.ddex.sound_recording.'
'generate_sound_recording_details_by_territory'
)
def test_generate_sound_recording_details_by_territory_takedown(
mock_generate_sound_recording_details_by_territory,
mock_orchard_sound_recording: OrchardSoundRecording,
mock_track: Track,
helpers
):
"""Test _generate_sound_recording_details_by_territory no territories."""
mock_generate_sound_recording_details_by_territory.side_effect =\
lambda territories, track, rights_percent, upload_asset: E(
'MockSoundRecordingDetailByTerritory',
E('TrackName', track.name),
*(
E('MockTerritory', territory)
for territory
in territories
),
)
mock_tracks = [
mock_track._replace(
name='Track 1',
territories=[],
primary=False
),
mock_track._replace(
name='Track 2',
territories=[]
)
]
mock_orchard_sound_recording = mock_orchard_sound_recording._replace(
track_connection=TrackConnection(tracks=mock_tracks)
)
result = sound_recording._generate_sound_recording_details_by_territory(
mock_orchard_sound_recording,
None
)
assert mock_generate_sound_recording_details_by_territory.call_args_list == [ # noqa:E501
call(
['Worldwide'],
mock_tracks[1],
'0.00',
None
)
]
track_by_territory_container = E(
'TestContainer',
*result,
)
result = helpers.print_xml(track_by_territory_container)
expected = """
Track 2
Worldwide
""" # noqa: E501
assert result == dedent(expected).strip()
@patch(
'src.ddex.sound_recording.'
'_generate_sound_recording_details_by_territory'
)
@patch('src.ddex.sound_recording._format_track_duration_iso_8601')
@patch('src.ddex.sound_recording._generate_language_of_performance')
def test_generate_sound_recording_resource(
mock_generate_language_of_performance,
mock_format_track_duration_iso_8601,
mock_generate_sound_recording_details_by_territory,
mock_orchard_sound_recording: OrchardSoundRecording,
mock_track: Track,
helpers,
):
"""Test generate_sound_recording_release."""
mock_generate_language_of_performance.return_value = E(
'MockLanguageOfPerformance',
)
mock_format_track_duration_iso_8601.return_value = 'Mock Duration'
mock_generate_sound_recording_details_by_territory.return_value = [
E('MockSoundRecordingDetailsByTerritory1'),
E('MockSoundRecordingDetailsByTerritory2'),
]
mock_orchard_sound_recording = mock_orchard_sound_recording._replace(
track_connection=TrackConnection(
tracks=[
mock_track._replace(primary=False, name='Track 1'),
mock_track._replace(primary=True, name='Track 2')
],
),
)
result = sound_recording.generate_sound_recording_resource(
'A1',
mock_orchard_sound_recording,
None
)
result = helpers.print_xml(result)
expected = """
MusicalWorkSoundRecording
isrc-123
A1
Track 2
Mock Duration
"""
assert result == dedent(expected).strip()