add audio/tests/string_test_string.py, audio/tests/test_rss.py

This commit is contained in:
Trent Palmer 2021-04-25 20:04:22 -07:00
parent 99dc32fa93
commit 0cd01577be
2 changed files with 211 additions and 0 deletions

View File

@ -0,0 +1,22 @@
from tp.settings import IMAGES_URL
def get_ep_a_description(feed_x, episode_x):
a = f'<h1>{episode_x}</h1>'
b = f'<img src="{IMAGES_URL}{episode_x.image.name}">'
c = f'<p>{episode_x.description}</p>'
d = f'<p>Photo <a href="{feed_x.original_image_url}">'
e = f'{feed_x.image_title}</a> by <a href="{feed_x.image_attribution_url}">'
f = f'{feed_x.image_attribution}</a> is licensed <a href="{feed_x.image_license_url}">'
g = f'{feed_x.image_license_name}</a> {feed_x.image_license_jurisdiction}.</p>'
h = f'<p>Photo <a href="{episode_x.original_image_url}">'
i = f'{episode_x.image_title}</a> by <a href="{episode_x.image_attribution_url}">'
j = f'{episode_x.image_attribution}</a> is licensed <a href="{episode_x.image_license_url}">'
k = f'{episode_x.image_license_name}</a> {episode_x.image_license_jurisdiction}.</p><p>'
m = f'<a href="{feed_x.ebook_url}">{feed_x.ebook_title}</a> by '
o = f'<a href="{feed_x.author_url}">{feed_x.author}</a> '
p = f'is licensed <a href="{feed_x.license_url}">{feed_x.license_name}</a> '
q = f'{feed_x.license_jurisdiction}. Translated by <a href="{feed_x.translator_url}">'
r = f'{feed_x.translator}</a>. '
s = f'Intro by <a href="{feed_x.intro_author_url}">{feed_x.intro_author}</a>.</p>'
return f'{a}{b}{c}{d}{e}{f}{g}{h}{i}{j}{k}{m}{o}{p}{q}{r}{s}'

189
audio/tests/test_rss.py Normal file
View File

@ -0,0 +1,189 @@
from django.test import TestCase
from django.contrib.auth.models import User
from audio.models import Feed, Episode
from accounts.models import Account
from datetime import date, timedelta
from dateutil import parser
from django.urls import reverse
import xml.etree.ElementTree as ET
from tp.settings import IMAGES_URL, MP3_URL
from .string_test_string import get_ep_a_description
class TestRssTestCase(TestCase):
def test_rss(self):
feed_a = Feed.objects.get(title='Caesar-Pompey Civil War')
kw_args = {'slug': feed_a.slug}
response = self.client.get(reverse('audio:rss', kwargs=kw_args))
self.assertEquals(response.status_code, 200)
self.assertEquals(len(response.templates), 0)
self.assertEquals(
response.request['PATH_INFO'],
f'/rss/{feed_a.slug}.xml'
)
rss = ET.fromstring(response.content)
self.assertEquals(rss.attrib['version'], '2.0')
rss_children = [t.tag for t in rss.findall('*')]
self.assertEquals(rss_children, ['channel'])
channel = rss.find('channel')
channel_children = [t.tag for t in channel.findall('*')]
self.assertEquals(channel_children, [
'title', 'link', 'description',
'{http://www.w3.org/2005/Atom}link',
'language', 'lastBuildDate', 'image',
'item', 'item'
])
channel_title = channel.find('title')
self.assertEquals(channel_title.text, 'Caesar-Pompey Civil War')
cdt = channel.find('description').text
self.assertEquals(cdt, 'Civil War between Pompey and Caesar.')
channel_link = channel.find('link')
self.assertEquals(channel_link.text[-75:], reverse(
'audio:feed', kwargs={'pk': feed_a.pk, 'slug': feed_a.slug})
)
cdlang = channel.find('language').text
self.assertEquals(cdlang, 'en-us')
latest_post = str(date.today() - timedelta(days=7))
cdlbd = parser.parse(channel.find('lastBuildDate').text)
cdlbd_string = cdlbd.strftime('%Y-%m-%d')
self.assertEquals(latest_post, cdlbd_string)
f_image = channel.find('image')
f_image_children = [t.tag for t in f_image.findall('*')]
self.assertEquals(f_image_children, [
'url', 'title', 'link', 'description'
])
f_image_url = f_image.find('url').text
self.assertEquals(f_image_url, f'{IMAGES_URL}{feed_a.image}')
f_image_title = f_image.find('title').text
self.assertEquals(f_image_title, feed_a.title)
f_image_link = f_image.find('link').text
self.assertEquals(
f_image_link,
f'testserver/feed/{feed_a.pk}/{feed_a.slug}'
)
f_image_description = f_image.find('description').text
self.assertEquals(
f_image_description, 'Image for: Caesar-Pompey Civil War'
)
episodes = [t for t in channel.findall('item')]
for i, ep in enumerate(episodes):
ep_children = [t.tag for t in ep.findall('*')]
self.assertEquals(ep_children, [
'title', 'link', 'description',
'pubDate', 'guid', 'enclosure', 'image'
])
episode = Episode.objects.get(feed=feed_a, episode_number=i + 1)
ep_title = ep.find('title').text
self.assertEquals(ep_title, f'{episode.episode_number}: {episode.title}')
ep_link = ep.find('link').text
self.assertEquals(
ep_link,
f'http://testserver/episode/{episode.pk}/{episode.slug}'
)
ep_desc = ep.find('description').text
self.assertEquals(
ep_desc,
get_ep_a_description(feed_a, episode)
)
ep_pub_date = parser.parse(ep.find('pubDate').text).strftime('%Y-%m-%d')
self.assertEquals(ep_pub_date, str(episode.pub_date))
ep_guid = ep.find('guid').text
self.assertEquals(
ep_guid,
f'http://testserver/episode/{episode.pk}/{episode.slug}'
)
ep_enclosure = ep.find('enclosure')
self.assertEquals(ep_enclosure.keys(), ['length', 'type', 'url'])
self.assertEquals(
ep_enclosure.attrib['length'], str(episode.image.size)
)
self.assertEquals(ep_enclosure.attrib['type'], 'audio/mpeg')
self.assertEquals(
ep_enclosure.attrib['url'], f'{MP3_URL}{episode.mp3}'
)
ep_image = ep.find('image')
epim_children = [t.tag for t in ep_image.findall('*')]
self.assertEquals(
epim_children, ['url', 'title', 'link', 'description']
)
epim_url = ep_image.find('url').text
self.assertEquals(epim_url, f'{IMAGES_URL}{episode.image.name}')
epim_title = ep_image.find('title').text
self.assertEquals(epim_title, episode.title)
epim_link = ep_image.find('link').text
self.assertEquals(
epim_link,
f'testserver/episode/{episode.pk}/{episode.slug}'
)
epim_desc = ep_image.find('description').text
self.assertEquals(epim_desc, f'Image for: {episode.title}')
def setUp(self):
user_a = User.objects.create(username='user_a')
user_a.set_password('password_user_a')
user_a.save()
Account.objects.create(user=user_a)
self.client.login(username='user_a', password='password_user_a')
with open('bicycle.jpg', 'rb') as image_f:
self.client.post(reverse('audio:new_feed'), {
'title': "Caesar-Pompey Civil War",
'author': "Gaius Julius Caesar",
'ebook_title': "Caesar's De Bello Gallico & Other Commentaries",
'ebook_url': "https://gutenberg.org/ebooks/10657",
'author_url': "https://gutenberg.org/ebooks/author/3621",
'translator': 'McDevitte, W. A. (William Alexander)',
'translator_url': 'https://gutenberg.org/ebooks/author/37952',
'intro_author': 'De Quincey, Thomas',
'intro_author_url': 'https://gutenberg.org/ebooks/author/797',
'license': 1,
'license_jurisdiction': 'in the USA',
'description': "Civil War between Pompey and Caesar.",
'image_title': 'A Penny Farthing',
'image_attribution': 'Agnieszka Kwiecień',
'image_attribution_url': 'https://commons.wikimedia.org/wiki/User:Nova',
'original_image_url': 'https://commons.wikimedia.org/wiki/File:Ordinary_bicycle01.jpg',
'image_license': 1,
'image_license_jurisdiction': 'in the USA',
'image': image_f,
})
feed_a = Feed.objects.get(title='Caesar-Pompey Civil War')
kw_args = {'feed_pk': feed_a.pk, 'feed_title_slug': feed_a.slug}
with (
open('bicycle.jpg', 'rb') as image_f,
open('Mark Twain Taming The Bicycle.mp3', 'rb') as mp3_f
):
self.client.post(reverse('audio:new_episode', kwargs=kw_args), {
'title': "Caesar-Pompey Civil War Book I",
'author': "Gaius Julius Caesar",
'pub_date': str(date.today() - timedelta(days=8)),
'episode_number': 1,
'description': 'Caesar confronts Afranius and Petreius',
'mp3': mp3_f,
'image_title': 'A Penny Farthing',
'image_attribution': 'Agnieszka Kwiecień',
'image_attribution_url': 'https://commons.wikimedia.org/wiki/User:Nova',
'original_image_url': 'https://commons.wikimedia.org/wiki/File:Ordinary_bicycle01.jpg',
'image_license': 1,
'image_license_jurisdiction': 'in the USA',
'image': image_f,
})
with (
open('bicycle.jpg', 'rb') as image_f,
open('Mark Twain Taming The Bicycle.mp3', 'rb') as mp3_f
):
self.client.post(reverse('audio:new_episode', kwargs=kw_args), {
'title': "Caesar-Pompey Civil War Book II",
'author': "Gaius Julius Caesar",
'pub_date': str(date.today() - timedelta(days=7)),
'episode_number': 2,
'description': 'Trebonius confronts Domitius',
'mp3': mp3_f,
'image_title': 'A Penny Farthing',
'image_attribution': 'Agnieszka Kwiecień',
'image_attribution_url': 'https://commons.wikimedia.org/wiki/User:Nova',
'original_image_url': 'https://commons.wikimedia.org/wiki/File:Ordinary_bicycle01.jpg',
'image_license': 1,
'image_license_jurisdiction': 'in the USA',
'image': image_f,
})