"""Tests Meta DDEX header generation.""" from textwrap import dedent import pytest from unittest.mock import patch from freezegun import freeze_time from src.ddex import deal from src.ddex.e import E from soundrecording_utils.metadata.types import OrchardSoundRecording from soundrecording_utils.metadata.types import Product from soundrecording_utils.metadata.types import Track from soundrecording_utils.metadata.types import TrackConnection def test_get_start_date(mock_product: Product): """Test _get_start_date selection logic.""" assert '2019-06-15' == deal._get_start_date(mock_product._replace( ingestion_completed='2019-06-15', sale_start_date='2019-06-16', release_date='2019-06-17' )) assert '2019-06-16' == deal._get_start_date(mock_product._replace( ingestion_completed=None, sale_start_date='2019-06-16', release_date='2019-06-17' )) assert '2019-06-17' == deal._get_start_date(mock_product._replace( ingestion_completed=None, sale_start_date=None, release_date='2019-06-17' )) def test_generate_sound_recording_deals( mock_orchard_sound_recording: OrchardSoundRecording, mock_product: Product, mock_track: Track, helpers, ): """Test _generate_sound_recording_deals.""" mock_orchard_sound_recording = mock_orchard_sound_recording._replace( track_connection=TrackConnection( tracks=[ mock_track._replace( territories=['US', 'CA'], product=mock_product._replace(release_date='2019-06-15') ), mock_track._replace( territories=['UK', 'US'], product=mock_product._replace(release_date='2019-06-15') ), mock_track._replace( territories=['CA', 'MX'], product=mock_product._replace(release_date='2019-06-14') ), mock_track._replace( territories=[], product=mock_product._replace(release_date='2019-06-16') ) ] ) ) result = deal._generate_sound_recording_deals(mock_orchard_sound_recording) result = E( 'TestDealContainer', *result, ) # "CA" de-duplicated, select earliest start date # "US" de-duplicated # date w/o territories skipped result = helpers.print_xml(result) expected = """ RightsClaimModel UserMakeAvailableUserProvided CA MX 2019-06-14 Monetize RightsClaimModel UserMakeAvailableUserProvided US UK 2019-06-15 Monetize """ assert result == dedent(expected).strip() @freeze_time('2019-06-15') def test_generate_sound_recording_deals_takedown( mock_orchard_sound_recording: OrchardSoundRecording, mock_product: Product, mock_track: Track, helpers ): """Test _generate_sound_recording_details w/o territories.""" mock_orchard_sound_recording = mock_orchard_sound_recording._replace( track_connection=TrackConnection( tracks=[ mock_track._replace( territories=[] ) ] ) ) result = deal._generate_sound_recording_deals(mock_orchard_sound_recording) result = E( 'TestDealContainer', *result, ) result = helpers.print_xml(result) # no territories means "Worldwide" and yesterday as EndDate expected = """ RightsClaimModel UserMakeAvailableUserProvided Worldwide 2019-06-13 Monetize """ assert result == dedent(expected).strip() def test_generate_deal_value_error(): """Test exception on no date params.""" expected = 'Deal must include start and/or end date' with pytest.raises(ValueError, match=expected): deal._generate_sound_recording_deal(['US']) @patch('src.ddex.deal._generate_sound_recording_deals') def test_generate_release_deal( mock_generate_sound_recording_deals, mock_orchard_sound_recording: OrchardSoundRecording, helpers, ): """Test generate_release_deal.""" mock_generate_sound_recording_deals.return_value = ( E('MockSoundRecordingDeal1'), E('MockSoundRecordingDeal2'), ) result = deal.generate_release_deal( 'R0', mock_orchard_sound_recording, ) result = helpers.print_xml(result) expected = """ R0 """ assert result == dedent(expected).strip()