"""Test the direct delivery ERN XML model.""" import hashlib from flexmock import flexmock from deliveryhistory.connectors import s3 from deliveryhistory.models import delivery_xml def _ern(right_share_percentages): """Build a minimal ERN file with the given RightSharePercentage values.""" controllers = ''.join( '{0}' ''.format(value) for value in right_share_percentages ) return ( '' '' '' '{0}' '' '' ).format(controllers).encode('utf-8') def test_get_delivery_type_takedown(): """A RightSharePercentage of 0 marks the delivery as a takedown.""" (flexmock(s3) .should_receive('get_object_body') .and_return(_ern([0]))) assert delivery_xml.get_delivery_type(123) == delivery_xml.DELIVERY_TYPE_TAKEDOWN def test_get_delivery_type_not_takedown(): """A non-zero RightSharePercentage is not a takedown.""" (flexmock(s3) .should_receive('get_object_body') .and_return(_ern([100]))) assert delivery_xml.get_delivery_type(123) is None def test_get_delivery_type_missing_file(): """A missing ERN file resolves to no delivery type.""" (flexmock(s3) .should_receive('get_object_body') .and_return(None)) assert delivery_xml.get_delivery_type(123) is None def test_get_delivery_type_no_job_id(): """A missing job id resolves to no delivery type without hitting S3.""" assert delivery_xml.get_delivery_type(None) is None def test_get_delivery_type_non_numeric_percentage(): """A non-numeric RightSharePercentage is ignored; no type is resolved.""" (flexmock(s3) .should_receive('get_object_body') .and_return(_ern(['not-a-number']))) assert delivery_xml.get_delivery_type(123) is None def test_build_xml_key(): """The S3 key is the md5 of the job id under the metadata prefix.""" digest = hashlib.md5(b'123').hexdigest() assert delivery_xml._build_xml_key(123) == 'metadata/{0}-0.xml'.format(digest)