"""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()