Extended test Coverage

This patch extends the test coverage of the unit tests. It also enables
python-coverage and coveralls to track unit test coverage.

There are some additional minor issue fixed discovered during the test
creation.

Signed-off-by: Lars Kiesow <lkiesow@uos.de>
This commit is contained in:
Lars Kiesow 2017-02-05 14:33:22 +01:00
parent 68248e46a0
commit 4314475bfb
No known key found for this signature in database
GPG key ID: 5DAFE8D9C823CE73
8 changed files with 111 additions and 17 deletions

View file

@ -7,7 +7,7 @@ python:
- "3.5"
before_install:
- pip install flake8
- pip install flake8 python-coveralls coverage
- python setup.py bdist_wheel
- pip install dist/feedgen*
@ -16,3 +16,6 @@ script:
- python -m feedgen
- python -m feedgen atom
- python -m feedgen rss
after_success:
- coveralls

View file

@ -49,8 +49,5 @@ publish:
twine upload dist/*
test:
python -m unittest tests.test_feed
python -m unittest tests.test_entry
python -m unittest tests.test_extension
@rm -f tmp_Atomfeed.xml tmp_Rssfeed.xml
coverage run --omit='*/lib/*,tests/*' -m unittest discover -s tests
flake8 $$(find setup.py tests feedgen -name '*.py')

View file

@ -464,7 +464,7 @@ class FeedEntry(object):
if isSummary:
self.__atom_summary = description
else:
self.__atom_content = description
self.__atom_content = {'content': description}
return self.__rss_description
def category(self, category=None, replace=False, **kwargs):

View file

@ -8,7 +8,7 @@
Descriptions partly taken from
http://dublincore.org/documents/dcmi-terms/#elements-coverage
:copyright: 2013-2016, Lars Kiesow <lkiesow@uos.de>
:copyright: 2013-2017, Lars Kiesow <lkiesow@uos.de>
:license: FreeBSD and LGPL, see license.* for more details.
'''
@ -223,6 +223,7 @@ class DcBaseExtension(BaseExtension):
if replace or not self._dcelem_identifier:
self._dcelem_identifier = []
self._dcelem_identifier += identifier
return self._dcelem_identifier
def dc_language(self, language=None, replace=True):
'''Get or set the dc:language which describes a language of the

View file

@ -130,7 +130,7 @@ class PodcastEntryExtension(BaseEntryExtension):
if itunes_image.endswith('.jpg') or itunes_image.endswith('.png'):
self.__itunes_image = itunes_image
else:
ValueError('Image file must be png or jpg')
raise ValueError('Image file must be png or jpg')
return self.__itunes_image
def itunes_duration(self, itunes_duration=None):
@ -151,9 +151,9 @@ class PodcastEntryExtension(BaseEntryExtension):
itunes_duration = str(itunes_duration)
if len(itunes_duration.split(':')) > 3 or \
itunes_duration.lstrip('0123456789:') != '':
ValueError('Invalid duration format')
raise ValueError('Invalid duration format')
self.__itunes_duration = itunes_duration
return self.itunes_duration
return self.__itunes_duration
def itunes_explicit(self, itunes_explicit=None):
'''Get or the the itunes:explicit value of the podcast episode. This

View file

@ -13,41 +13,79 @@ from feedgen.feed import FeedGenerator
class TestSequenceFunctions(unittest.TestCase):
def setUp(self):
fg = FeedGenerator()
self.feedId = 'http://example.com'
self.title = 'Some Testfeed'
fg.id(self.feedId)
fg.title(self.title)
fg.link(href='http://lkiesow.de', rel='alternate')[0]
fg.description('...')
fe = fg.add_entry()
fe.id('http://lernfunk.de/media/654321/1')
fe.title('The First Episode')
fe.content(u'')
# Use also the different name add_item
fe = fg.add_item()
fe.id('http://lernfunk.de/media/654321/1')
fe.title('The Second Episode')
fe.content(u'')
fe = fg.add_entry()
fe.id('http://lernfunk.de/media/654321/1')
fe.title('The Third Episode')
fe.content(u'')
self.fg = fg
def test_checkEntryNumbers(self):
fg = self.fg
assert len(fg.entry()) == 3
def test_checkItemNumbers(self):
def test_TestEntryItems(self):
fe = self.fg.add_item()
fe.title('qwe')
assert fe.title() == 'qwe'
author = fe.author(name='John Doe', email='jdoe@example.com')[0]
assert author.get('name') == 'John Doe'
assert author.get('email') == 'jdoe@example.com'
contributor = fe.contributor(name='John Doe', email='jdoe@ex.com')[0]
assert contributor == fe.contributor()[0]
assert contributor.get('name') == 'John Doe'
assert contributor.get('email') == 'jdoe@ex.com'
link = fe.link(href='http://lkiesow.de', rel='alternate')[0]
assert link == fe.link()[0]
assert link.get('href') == 'http://lkiesow.de'
assert link.get('rel') == 'alternate'
fe.guid('123')
assert fe.guid() == '123'
fe.updated('2017-02-05 13:26:58+01:00')
assert fe.updated().year == 2017
fe.summary('asdf')
assert fe.summary() == 'asdf'
fe.description('asdfx')
assert fe.description() == 'asdfx'
fe.pubdate('2017-02-05 13:26:58+01:00')
assert fe.pubdate().year == 2017
fe.rights('asdfx')
assert fe.rights() == 'asdfx'
fe.comments('asdfx')
assert fe.comments() == 'asdfx'
fe.enclosure(url='http://lkiesow.de', type='text/plain', length='1')
assert fe.enclosure().get('url') == 'http://lkiesow.de'
fe.ttl(8)
assert fe.ttl() == 8
self.fg.rss_str()
self.fg.atom_str()
def test_checkItemNumbers(self):
fg = self.fg
assert len(fg.item()) == 3
def test_checkEntryContent(self):
fg = self.fg
assert fg.entry()

View file

@ -1,5 +1,4 @@
# -*- coding: utf-8 -*-
# vim: set et ts=4 sw=4 sts=4 sta tw=80 cc=81:
"""
Tests for extensions
@ -82,3 +81,56 @@ class TestExtensionPodcast(unittest.TestCase):
namespaces=ns)
assert cat[0] == 'Technology'
assert scat[0] == 'Podcasting'
def test_podcastEntryItems(self):
fe = self.fg.add_item()
fe.title('y')
fe.podcast.itunes_author('Lars Kiesow')
fe.podcast.itunes_block('x')
fe.podcast.itunes_duration('00:01:30')
fe.podcast.itunes_explicit('no')
fe.podcast.itunes_image('x.png')
fe.podcast.itunes_is_closed_captioned('yes')
fe.podcast.itunes_order(1)
fe.podcast.itunes_subtitle('x')
fe.podcast.itunes_summary('x')
assert fe.podcast.itunes_author() == 'Lars Kiesow'
assert fe.podcast.itunes_block() == 'x'
assert fe.podcast.itunes_duration() == '00:01:30'
assert fe.podcast.itunes_explicit() == 'no'
assert fe.podcast.itunes_image() == 'x.png'
assert fe.podcast.itunes_is_closed_captioned()
assert fe.podcast.itunes_order() == 1
assert fe.podcast.itunes_subtitle() == 'x'
assert fe.podcast.itunes_summary() == 'x'
# Check that we have the item in the resulting XML
ns = {'itunes': 'http://www.itunes.com/dtds/podcast-1.0.dtd'}
root = etree.fromstring(self.fg.rss_str())
author = root.xpath('/rss/channel/item/itunes:author/text()',
namespaces=ns)
assert author == ['Lars Kiesow']
class TestExtensionDc(unittest.TestCase):
def setUp(self):
self.fg = FeedGenerator()
self.fg.load_extension('dc')
self.fg.title('title')
self.fg.link(href='http://example.com', rel='self')
self.fg.description('description')
def test_entryLoadExtension(self):
fe = self.fg.add_item()
try:
fe.load_extension('dc')
except ImportError:
pass # Extension already loaded
def test_elements(self):
for method in dir(self.fg.dc):
if method.startswith('dc_'):
m = getattr(self.fg.dc, method)
m(method)
assert m() == [method]

View file

@ -7,6 +7,8 @@ These are test cases for a basic feed.
A basic feed does not contain entries so far.
"""
import os
import tempfile
import unittest
from lxml import etree
from feedgen.feed import FeedGenerator
@ -123,13 +125,14 @@ class TestSequenceFunctions(unittest.TestCase):
def test_atomFeedFile(self):
fg = self.fg
filename = 'tmp_Atomfeed.xml'
_, filename = tempfile.mkstemp()
fg.atom_file(filename=filename, pretty=True, xml_declaration=False)
with open(filename, "r") as myfile:
atomString = myfile.read().replace('\n', '')
self.checkAtomString(atomString)
os.remove(filename)
def test_atomFeedString(self):
fg = self.fg
@ -243,7 +246,7 @@ class TestSequenceFunctions(unittest.TestCase):
def test_rssFeedFile(self):
fg = self.fg
filename = 'tmp_Rssfeed.xml'
_, filename = tempfile.mkstemp()
fg.rss_file(filename=filename, pretty=True, xml_declaration=False)
with open(filename, "r") as myfile: