Skip to content

Commit

Permalink
Merge pull request #594 from ZeitOnline/MAINT_cleanup_audio_testsetup
Browse files Browse the repository at this point in the history
MAINT: Cleanup audio workflow testing
  • Loading branch information
louika committed Jan 23, 2024
2 parents 0a1b618 + b7eaa72 commit e1f7c38
Show file tree
Hide file tree
Showing 8 changed files with 84 additions and 81 deletions.
9 changes: 9 additions & 0 deletions core/src/zeit/content/audio/ctesting.zcml
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
<configure
xmlns="http://namespaces.zope.org/zope"
i18n_domain="zope">

<include package="zeit.content.audio" />
<include package="zeit.content.audio.browser" />
<includeOverrides package="zeit.content.audio" file="mock-workflow.zcml" />

</configure>
10 changes: 10 additions & 0 deletions core/src/zeit/content/audio/mock-workflow.zcml
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
<configure
xmlns="http://namespaces.zope.org/zope"
i18n_domain="zope">

<adapter
factory="zeit.cms.workflow.mock.MockPublishInfo"
for="zeit.content.audio.interfaces.IAudio"
/>

</configure>
27 changes: 22 additions & 5 deletions core/src/zeit/content/audio/testing.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,9 @@

from zeit.cms.repository.interfaces import IRepository
from zeit.content.audio.audio import Audio
from zeit.content.audio.interfaces import IPodcastEpisodeInfo, Podcast
from zeit.content.audio.interfaces import IPodcastEpisodeInfo, ISpeechInfo, Podcast
import zeit.cms.testing
import zeit.workflow.testing


T = TypeVar('T') # Can be anything
Expand All @@ -17,7 +18,11 @@
""".format(here=importlib.resources.files(__package__))

CONFIG_LAYER = zeit.cms.testing.ProductConfigLayer(
product_config, bases=(zeit.cms.testing.CONFIG_LAYER,)
product_config,
bases=(
zeit.workflow.testing.CONFIG_LAYER,
zeit.cms.testing.CONFIG_LAYER,
),
)

ZCML_LAYER = zeit.cms.testing.ZCMLLayer('ftesting.zcml', bases=(CONFIG_LAYER,))
Expand Down Expand Up @@ -62,6 +67,11 @@ def __init__(self):
'cat-jokes-pawdcast',
),
},
'tts': {
'article_uuid': 'a89ce2e3-4887-466a-a52e-edc6b9802ef9',
'preview_url': 'https://example-preview-url.bert',
'checksum': '123foo',
},
}

def with_attribute(self, attribute_name: str, value: T):
Expand All @@ -73,11 +83,18 @@ def with_attribute(self, attribute_name: str, value: T):

def build(self, repository: Optional[IRepository] = None) -> Audio:
audio = Audio()
episode = IPodcastEpisodeInfo(audio)
audio_type = self.attributes['audio']['audio_type']
for attribute, value in self.attributes['audio'].items():
setattr(audio, attribute, value)
for attribute, value in self.attributes['podcast'].items():
setattr(episode, attribute, value)
if audio_type == 'podcast':
episode = IPodcastEpisodeInfo(audio)
for attribute, value in self.attributes[audio_type].items():
setattr(episode, attribute, value)
if audio_type == 'tts':
tts = ISpeechInfo(audio)
audio.external_id = ''
for attribute, value in self.attributes[audio_type].items():
setattr(tts, attribute, value)
if repository is not None:
repository['audio'] = audio

Expand Down
48 changes: 41 additions & 7 deletions core/src/zeit/content/audio/tests/test_audio.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,15 @@

import zope.interface.verify

from zeit.cms.checkout.helper import checked_out
from zeit.cms.workflow.interfaces import CAN_PUBLISH_ERROR
from zeit.content.audio.interfaces import Podcast, PodcastSource
from zeit.content.audio.testing import AudioBuilder, FunctionalTestCase
import zeit.cms.content.interfaces
import zeit.cms.content.sources
import zeit.cms.interfaces
import zeit.cms.testing
import zeit.cms.workflow.interfaces
import zeit.content.audio.audio
import zeit.content.image.interfaces

Expand Down Expand Up @@ -50,19 +53,50 @@ def test_get_podcast_image(self):
), 'Fill color should match color audio/tests/fixtures/podcasts.xml'


class WorkflowTest(FunctionalTestCase):
def test_podcast_not_published_if_requirements_not_met_url(self):
audio = AudioBuilder().with_url('').build(self.repository)
workflow = zeit.cms.workflow.interfaces.IPublishInfo(audio)
assert workflow.can_publish() == zeit.cms.workflow.interfaces.CAN_PUBLISH_ERROR
assert 'Audio URL is missing' in workflow.error_messages[0]

def test_podcast_not_published_if_requirements_not_met_is_published(self):
audio = AudioBuilder().with_is_published(False).build(self.repository)
workflow = zeit.cms.workflow.interfaces.IPublishInfo(audio)
assert workflow.can_publish() == zeit.cms.workflow.interfaces.CAN_PUBLISH_ERROR
assert 'Podcast Episode is not published by Provider' in workflow.error_messages[0]

def test_podcast_not_retracted_if_requirements_not_met_is_not_published(self):
audio = AudioBuilder().build(self.repository)
workflow = zeit.cms.workflow.interfaces.IPublishInfo(audio)
assert workflow.can_retract() == zeit.cms.workflow.interfaces.CAN_RETRACT_ERROR
assert 'Podcast Episode is published by Provider' in workflow.error_messages[0]


class SpeechTest(FunctionalTestCase):
def setUp(self):
super().setUp()
article = zeit.cms.interfaces.ICMSContent('http://xml.zeit.de/online/2007/01/Somalia')
uuid = zeit.cms.content.interfaces.IUUID(article).shortened
AudioBuilder().with_audio_type('tts').with_article_uuid(uuid).build(self.repository)

def test_create_tts_audio(self):
article = zeit.cms.interfaces.ICMSContent('http://xml.zeit.de/online/2007/01/Somalia')
uuid = zeit.cms.content.interfaces.IUUID(article)
audio = zeit.content.audio.audio.Audio()
audio.audio_type = 'tts'
tts = zeit.content.audio.interfaces.ISpeechInfo(audio)
tts.article_uuid = uuid.shortened
tts.preview_url = 'https://example-preview-url.bert'
tts.checksum = '123foo'
audio = self.repository['audio'] = audio
audio = self.repository['audio']
speechinfo = zeit.content.audio.interfaces.ISpeechInfo(audio)
self.assertEqual(audio.audio_type, 'tts')
self.assertEqual(speechinfo.article_uuid, uuid.shortened)
self.assertEqual(speechinfo.preview_url, 'https://example-preview-url.bert')
self.assertTrue(speechinfo.checksum, '123foo')

def test_publish_tts_audio(self):
audio = self.repository['audio']
zeit.cms.workflow.interfaces.IPublish(audio).publish(background=False)
assert zeit.cms.workflow.interfaces.IPublishInfo(audio).published

def test_cannot_publish_tts_without_url(self):
audio = self.repository['audio']
with checked_out(audio) as co:
co.url = ''
assert zeit.cms.workflow.interfaces.IPublishInfo(audio).can_publish() == CAN_PUBLISH_ERROR
2 changes: 1 addition & 1 deletion core/src/zeit/simplecast/ftesting.zcml
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

<include package="zeit.cms" file="ftesting.zcml" />

<include package="zeit.content.audio" />
<include package="zeit.content.audio" file="ctesting.zcml"/>
<include package="zeit.content.audio.browser" />

<include package="zeit.simplecast" />
Expand Down
60 changes: 0 additions & 60 deletions core/src/zeit/simplecast/tests/test_connection.py
Original file line number Diff line number Diff line change
@@ -1,14 +1,12 @@
from unittest import mock

import pendulum
import pytest
import requests
import requests_mock
import zope.component

from zeit.cms.content.interfaces import ISemanticChange
from zeit.content.audio.interfaces import IPodcastEpisodeInfo
from zeit.content.audio.workflow import AudioWorkflow, PodcastWorkflow
import zeit.cms.repository.folder
import zeit.cms.workflow.interfaces
import zeit.content.audio.audio
Expand Down Expand Up @@ -181,7 +179,6 @@ def test_publish(self, m):
content = self.repository['podcasts']['2023-08'][self.episode_info['id']]

workflow = zeit.cms.workflow.interfaces.IPublishInfo(content)
assert isinstance(workflow, PodcastWorkflow)
assert workflow.can_publish() == zeit.cms.workflow.interfaces.CAN_PUBLISH_SUCCESS
assert workflow.published

Expand All @@ -194,63 +191,6 @@ def test_publish(self, m):
self.simplecast.synchronize_episode(self.episode_info['id'])
assert workflow.published

def test_podcast_not_published_if_requirements_not_met_url(self):
simplecast_resp = self.episode_info.copy()
simplecast_resp['audio_file_url'] = None
self._check_publishing_error(simplecast_resp, 'Audio URL is missing')

def test_podcast_not_published_if_requirements_not_met_is_published(self):
simplecast_resp = self.episode_info.copy()
simplecast_resp['is_published'] = False
self._check_publishing_error(
simplecast_resp, 'Podcast Episode is not published by Provider'
)

def test_podcast_not_retracted_if_requirements_not_met_is_not_published(self):
simplecast_resp = self.episode_info.copy()
simplecast_resp['is_published'] = True
self._check_retracting_error(simplecast_resp, 'Podcast Episode is published by Provider')

def _check_publishing_error(self, simplecast_resp, message):
self.create_audio(simplecast_resp)
content = self.repository['podcasts']['2023-08'][self.episode_info['id']]

workflow = zeit.cms.workflow.interfaces.IPublishInfo(content)
assert isinstance(workflow, PodcastWorkflow)
assert workflow.can_publish() == zeit.cms.workflow.interfaces.CAN_PUBLISH_ERROR
assert not workflow.published
assert message in workflow.error_messages[0]

publish = zeit.cms.workflow.interfaces.IPublish(content)
with pytest.raises(zeit.cms.workflow.interfaces.PublishingError):
publish.publish(background=False)
assert not workflow.published

def _check_retracting_error(self, simplecast_resp, message):
self.create_audio(simplecast_resp)
content = self.repository['podcasts']['2023-08'][self.episode_info['id']]

workflow = zeit.cms.workflow.interfaces.IPublishInfo(content)
assert isinstance(workflow, PodcastWorkflow)
assert workflow.can_retract() == zeit.cms.workflow.interfaces.CAN_RETRACT_ERROR
assert workflow.published
assert message in workflow.error_messages[0]

publish = zeit.cms.workflow.interfaces.IPublish(content)
with pytest.raises(zeit.cms.workflow.interfaces.RetractingError):
publish.retract(background=False)
assert workflow.published

def test_missing_audio_type_uses_default_workflow(self):
default_audio = zeit.content.audio.audio.Audio()
default_audio.uniqueId = 'http://xml.zeit.de/default'
default_audio.url = 'https://example.com/default.mp3'
default_audio.external_id = '1234'

workflow = zeit.cms.workflow.interfaces.IPublishInfo(default_audio)
assert isinstance(workflow, AudioWorkflow)
assert workflow.can_publish() == zeit.cms.workflow.interfaces.CAN_PUBLISH_SUCCESS

@requests_mock.Mocker()
def test_retract(self, m):
simplecast_resp = self.episode_info.copy()
Expand Down
2 changes: 1 addition & 1 deletion core/src/zeit/speech/ftesting.zcml
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
<include package="zeit.workflow" />
<include package="zeit.content.article" />

<include package="zeit.content.audio" />
<include package="zeit.content.audio" file="ctesting.zcml"/>
<include package="zeit.content.audio.browser" />

<include package="zeit.speech" />
Expand Down
7 changes: 0 additions & 7 deletions core/src/zeit/speech/tests/test_connection.py
Original file line number Diff line number Diff line change
Expand Up @@ -47,13 +47,6 @@ def _setup_speech_message(self, field, value):
tts_created['articlesAudio'][0][field] = value
return tts_created

def test_cannot_publish_without_url(self):
tts_msg = self._setup_speech_message('audioEntry', {'url': None})
self.create_audio(tts_msg)
assert not IPublishInfo(
ICMSContent(self.unique_id)
).published, 'Do not publish incomplete audio!'

def test_update_existing_tts_audio(self):
self.create_audio(TTS_CREATED)
cms_tts = ICMSContent(self.unique_id)
Expand Down

0 comments on commit e1f7c38

Please sign in to comment.