File: test_feedgenerator.py

package info (click to toggle)
feedgenerator 1.9-2
  • links: PTS, VCS
  • area: main
  • in suites: bullseye
  • size: 22,340 kB
  • sloc: python: 1,296; makefile: 4
file content (126 lines) | stat: -rw-r--r-- 5,980 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
# -*- encoding: utf-8 -*-

from __future__ import unicode_literals

try:
    import unittest2 as unittest
except ImportError:
    import unittest

import six
import datetime

import feedgenerator

FIXT_FEED = dict(
    title="Poynter E-Media Tidbits",
    link="http://www.poynter.org/column.asp?id=31",
    description="""A group Weblog by the sharpest minds in online media/journalism/publishing.
    Umlauts: äöüßÄÖÜ
    Chinese: 老师是四十四,是不是?
    Finnish: Mustan kissan paksut posket. (ah, no special chars) Kärpänen sanoi kärpäselle: tuu kattoon kattoon ku kaveri tapettiin tapettiin.
    """,
    language="en"
)
FIXT_ITEM = dict(
    title="Hello",
    link="http://www.holovaty.com/test/",
    description="Testing.",
    content="Full content of our testing entry.",
    pubdate=datetime.datetime(2016,8,11,0,0,0,0),
)


EXPECTED_RESULT_RSS = """<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0"><channel><title>Poynter E-Media Tidbits</title><link>http://www.poynter.org/column.asp?id=31</link><description>A group Weblog by the sharpest minds in online media/journalism/publishing.
    Umlauts: äöüßÄÖÜ
    Chinese: 老师是四十四,是不是?
    Finnish: Mustan kissan paksut posket. (ah, no special chars) Kärpänen sanoi kärpäselle: tuu kattoon kattoon ku kaveri tapettiin tapettiin.
    </description><language>en</language><lastBuildDate>%DATE%</lastBuildDate><item><title>Hello</title><link>http://www.holovaty.com/test/</link><description>Testing.</description><pubDate>Thu, 11 Aug 2016 00:00:00 -0000</pubDate></item></channel></rss>"""

EXPECTED_RESULT_ATOM = """<?xml version="1.0" encoding="utf-8"?>
<feed xml:lang="en" xmlns="http://www.w3.org/2005/Atom"><title>Poynter E-Media Tidbits</title><link href="http://www.poynter.org/column.asp?id=31" rel="alternate"></link><id>http://www.poynter.org/column.asp?id=31</id><updated>%DATE%</updated><entry><title>Hello</title><link href="http://www.holovaty.com/test/" rel="alternate"></link><published>2016-08-11T00:00:00Z</published><updated>2016-08-11T00:00:00Z</updated><id>tag:www.holovaty.com,2016-08-11:/test/</id><summary type="html">Testing.</summary><content type="html">Full content of our testing entry.</content></entry></feed>"""

ENCODING = 'utf-8'

def build_expected_rss_result(feed, expected_result, encoding):
    # Result's date is of course different from the date in the fixture.
    # So make them equal!
    d = feedgenerator.rfc2822_date(feed.latest_post_date())
    s = expected_result.replace('%DATE%', d)
    if encoding:
        return s.encode(encoding)
    else:
        return s

def build_expected_atom_result(feed, expected_result, encoding):
    # Result's date is of course different from the date in the fixture.
    # So make them equal!
    d = feedgenerator.rfc3339_date(feed.latest_post_date())
    s = expected_result.replace('%DATE%', d)
    if encoding:
        return s.encode(encoding)
    else:
        return s

class TestFeedGenerator(unittest.TestCase):

    def setUp(self):
        self.maxDiff = None

    def test_000_types(self):
        ty = str if six.PY3 else unicode
        for k, v in FIXT_FEED.items():
            self.assertEqual(type(v), ty)
        for k, v in FIXT_ITEM.items():
            if k == "pubdate" or k == "updateddate":
                self.assertEqual(type(v), datetime.datetime)
            else:
                self.assertEqual(type(v), ty)
        self.assertEqual(type(EXPECTED_RESULT_RSS), ty)

    def test_001_string_results_rss(self):
        #import ipdb; ipdb.set_trace()
        feed = feedgenerator.Rss201rev2Feed(**FIXT_FEED)
        feed.add_item(**FIXT_ITEM)
        result = feed.writeString(ENCODING)
        if six.PY3:
            # On Python 3, result of feedgenerator is a unicode string!
            # So do not encode our expected_result.
            expected_result = build_expected_rss_result(feed, EXPECTED_RESULT_RSS, None)
        else:
            # On Python 2, result of feedgenerator is a str string!
            # Expected_result must therefore encoded likewise.
            expected_result = build_expected_rss_result(feed, EXPECTED_RESULT_RSS, ENCODING)
        # The different result types of Python 2 (str=bytes) and Python 3
        # (str=text=unicode) stems from a different implementation of StringIO.
        # As I understand it, getvalue() in Python 2 returns the type you
        # originally wrote into the buffer. In Python 3 getvalue() always
        # returns a str (=text=unicode).
        # See other test: test_stringio.py
        #print type(result), type(expected_result)
        self.assertEqual(type(result), type(expected_result))
        self.assertEqual(result, expected_result)

    def test_002_string_results_atom(self):
        #import ipdb; ipdb.set_trace()
        feed = feedgenerator.Atom1Feed(**FIXT_FEED)
        feed.add_item(**FIXT_ITEM)
        result = feed.writeString(ENCODING)
        if six.PY3:
            # On Python 3, result of feedgenerator is a unicode string!
            # So do not encode our expected_result.
            expected_result = build_expected_atom_result(feed, EXPECTED_RESULT_ATOM, None)
        else:
            # On Python 2, result of feedgenerator is a str string!
            # Expected_result must therefore encoded likewise.
            expected_result = build_expected_atom_result(feed, EXPECTED_RESULT_ATOM, ENCODING)
        # The different result types of Python 2 (str=bytes) and Python 3
        # (str=text=unicode) stems from a different implementation of StringIO.
        # As I understand it, getvalue() in Python 2 returns the type you
        # originally wrote into the buffer. In Python 3 getvalue() always
        # returns a str (=text=unicode).
        # See other test: test_stringio.py
        #print type(result), type(expected_result)
        self.assertEqual(type(result), type(expected_result))
        self.assertEqual(result, expected_result)