"""Tests Meta DDEX header generation.""" from textwrap import dedent from unittest.mock import call, patch from freezegun import freeze_time from soundrecording_utils.ddex.v38 import sound_recording from soundrecording_utils.ddex.v38.e import E from soundrecording_utils.metadata.types import ( Asset, FingerprintRule, Language, OrchardSoundRecording, Track, 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('soundrecording_utils.ddex.v38.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( 'soundrecording_utils.ddex.v38.sound_recording.' 'generate_sound_recording_details_by_territory' ) @freeze_time('2024-01-01 12:00:00') def test_generate_sound_recording_details_by_territory( mock_generate_sound_recording_details_by_territory, mock_orchard_sound_recording: OrchardSoundRecording, mock_track: Track, mock_fingerprint_rule: FingerprintRule, helpers, ): """Test _generate_sound_recording_details_by_territory with rules.""" 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_t1_rules = [ mock_fingerprint_rule._replace(territory='FR'), mock_fingerprint_rule._replace(territory='US'), ] mock_t2_rules = [ mock_fingerprint_rule._replace(territory='ES'), mock_fingerprint_rule._replace(territory='JP'), ] mock_tracks = [ mock_track._replace(tuid='123', name='Track 1', rules=mock_t1_rules), mock_track._replace( tuid='456', name='Track 2', rules=mock_t2_rules, primary=False ), ] mock_asset = Asset(uuid='123', filename='456', extension='flac') mock_orchard_sound_recording = mock_orchard_sound_recording._replace( track_connection=TrackConnection(tracks=mock_tracks) ) xml = sound_recording._generate_sound_recording_details_by_territory( # noqa:E501 mock_orchard_sound_recording, mock_tracks[0], mock_asset, 'tiktok' ) # only expect first track should include asset assert mock_generate_sound_recording_details_by_territory.call_args_list == [ # noqa:E501 call(['ES', 'FR', 'JP', 'US'], mock_tracks[0], '100.00', mock_asset) ] track_by_territory_container = E( 'TestContainer', *xml, ) result = helpers.print_xml(track_by_territory_container) expected = """ Track 1 ES FR JP US """ # noqa: E501 assert result == dedent(expected).strip() @patch( 'soundrecording_utils.ddex.v38.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, mock_fingerprint_rule: FingerprintRule, 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_t1_rules = [ mock_fingerprint_rule._replace(policy='carveout', territory='*'), ] mock_t2_rules = [ mock_fingerprint_rule._replace(policy='carveout', territory='FR'), ] mock_tracks = [ mock_track._replace( tuid='123', name='Track 1', rules=mock_t1_rules, primary=False, ), mock_track._replace( tuid='456', name='Track 2', rules=mock_t2_rules, ), ] mock_orchard_sound_recording = mock_orchard_sound_recording._replace( track_connection=TrackConnection(tracks=mock_tracks) ) xml = sound_recording._generate_sound_recording_details_by_territory( # noqa:E501 mock_orchard_sound_recording, mock_tracks[1], None, 'tiktok' ) 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', *xml, ) result = helpers.print_xml(track_by_territory_container) expected = """ Track 2 Worldwide """ # noqa: E501 assert result == dedent(expected).strip() @patch( 'soundrecording_utils.ddex.v38.sound_recording.' '_generate_sound_recording_details_by_territory' ) @patch('soundrecording_utils.ddex.v38.sound_recording._format_track_duration_iso_8601') @patch( 'soundrecording_utils.ddex.v38.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', tuid='123'), mock_track._replace(primary=True, name='Track 2', tuid='456'), ], ), ) xml = sound_recording.generate_sound_recording_resource( 'A1', mock_orchard_sound_recording, mock_orchard_sound_recording.track_connection.tracks[1], None, 'tiktok', ) result = helpers.print_xml(xml) expected = """ MusicalWorkSoundRecording isrc-123 A1 Track 2 Mock Duration """ assert result == dedent(expected).strip()