source: products/quintagroup.plonegooglesitemaps/trunk/quintagroup/plonegooglesitemaps/tests/testNewsSitemaps.py @ 3163

Last change on this file since 3163 was 3163, checked in by zidane, 13 years ago

fixes pyflakes and pylint

  • Property svn:eol-style set to native
File size: 12.4 KB
Line 
1from quintagroup.plonegooglesitemaps.tests.base \
2    import FunctionalTestCase, TestCase, IGoogleSitemapsLayer
3from quintagroup.plonegooglesitemaps.tests.XMLParser import parse
4from Products.PloneTestCase.setup import portal_owner, default_password
5from zope.interface import alsoProvides
6import unittest
7
8from DateTime import DateTime
9from Missing import MV
10
11from zope.publisher.browser import TestRequest
12from zope.component import queryMultiAdapter
13from zope.component import adapts, provideAdapter
14from zope.annotation.interfaces import IAttributeAnnotatable
15from zope.component import getSiteManager, getGlobalSiteManager
16from zope.interface import implements, Interface, classImplements
17from archetypes.schemaextender.field import ExtensionField
18from archetypes.schemaextender.interfaces import ISchemaExtender
19
20from Products.CMFPlone.utils import _createObjectByType
21from Products.Archetypes.public import StringField
22from Products.ATContentTypes.content.newsitem import ATNewsItem
23
24
25class TestNewsSitemapsXML(FunctionalTestCase):
26
27    def afterSetUp(self):
28        super(TestNewsSitemapsXML, self).afterSetUp()
29        # Create news sitemaps
30        _createObjectByType("Sitemap", self.portal, id="news-sitemaps",
31                            sitemapType="news", portalTypes=("News Item",))
32        self.portal["news-sitemaps"].at_post_create_script()
33        # Add testing news item to portal
34        self.pubdate = (DateTime() + 1).strftime("%Y-%m-%d")
35        self.my_news = _createObjectByType('News Item', self.portal,
36                                           id='my_news')
37        self.my_news.edit(text="Test news item",
38                          title="First news (test)",
39                          language="ua",
40                          effectiveDate=self.pubdate,
41                          gsm_access="Registration",
42                          gsm_genres=("PressRelease",),
43                          gsm_stock="NASDAQ:AMAT, BOM:500325")
44        self.workflow.doActionFor(self.my_news, "publish")
45        self.reParse()
46
47    def reParse(self):
48        # Parse news sitemap
49        self.sitemap = self.publish("/" + self.portal.absolute_url(1) + \
50                                    "/news-sitemaps",
51                                    "%s:%s" % (portal_owner,
52                                               default_password)).getBody()
53        parsed_sitemap = parse(self.sitemap)
54        self.start = parsed_sitemap["start"]
55        self.data = parsed_sitemap["data"]
56
57    def test_urlset(self):
58        self.assert_("urlset" in self.start.keys())
59        urlset = self.start["urlset"]
60        self.assertEqual(urlset.get("xmlns", ""),
61                         "http://www.sitemaps.org/schemas/sitemap/0.9")
62        self.assertEqual(urlset.get("xmlns:n", ""),
63                         "http://www.google.com/schemas/sitemap-news/0.9")
64
65    def test_url(self):
66        self.assert_("url" in self.start.keys())
67
68    def test_loc(self):
69        self.assert_("loc" in self.start.keys())
70        self.assert_(self.portal.absolute_url() + "/my_news" in self.data)
71
72    def test_nnews(self):
73        self.assert_("n:news" in self.start.keys())
74
75    def test_npublication(self):
76        self.assert_("n:publication" in self.start.keys())
77        self.assert_("n:name" in self.start.keys())
78        self.assert_("First news" in self.data, "No 'First news' in data")
79        self.assert_("n:language" in self.start.keys())
80        self.assert_("ua" in self.data, "No 'ua' in data")
81
82    def test_npublication_date(self):
83        self.assert_("n:publication_date" in self.start.keys())
84        self.assert_(self.pubdate in self.data, "No %s in data" % self.pubdate)
85
86    def test_ntitle(self):
87        self.assert_("n:title" in self.start.keys())
88        self.assert_("First news (test)" in self.data,
89                     "No 'First news (test)' in data")
90
91    def test_naccess(self):
92        # Test when access present
93        self.assert_("n:access" in self.start.keys())
94        self.assert_("Registration" in self.data, "No 'Registration' in data")
95
96    def test_ngenres(self):
97        # Test when genres present
98        self.assert_("n:genres" in self.start.keys())
99        self.assert_("PressRelease" in self.data, "No 'PressRelease' in data")
100
101    def test_ngenresMultiple(self):
102        # Test multiple genres
103        self.my_news.edit(gsm_genres=("PressRelease", "Blog"))
104        self.my_news.reindexObject()
105        self.reParse()
106        self.assert_("n:genres" in self.start.keys())
107        self.assert_("PressRelease, Blog" in self.data,
108                     "No 'PressRelease, Blog' in data")
109
110    def test_ngenresEmpty(self):
111        # No genres should present if it's not updated
112        self.my_news.edit(gsm_genres=[])
113        self.my_news.reindexObject()
114        self.reParse()
115        self.assertNotEqual("n:genres" in self.start.keys(), True)
116
117    def test_ngenresForNotExtended(self):
118        # No genres should present for not extended content type
119        my_doc = _createObjectByType('Document', self.portal, id='my_doc')
120        my_doc.edit(text="Test document")
121        self.workflow.doActionFor(my_doc, "publish")
122        self.portal["news-sitemaps"].edit(portalTypes=("Document",))
123        self.reParse()
124        self.assertNotEqual("n:genres" in self.start.keys(), True)
125
126    def test_nstock_tickers(self):
127        # Test n:stock_tickers
128        self.assert_("n:stock_tickers" in self.start.keys())
129        self.assert_("NASDAQ:AMAT, BOM:500325" in self.data,
130                     "No 'NASDAQ:AMAT, BOM:500325' in data")
131
132
133class TestNewsSitemapsXMLDefaultObject(FunctionalTestCase):
134
135    def afterSetUp(self):
136        super(TestNewsSitemapsXMLDefaultObject, self).afterSetUp()
137        # Create news sitemaps
138        _createObjectByType("Sitemap", self.portal, id="news-sitemaps",
139                            sitemapType="news", portalTypes=("News Item",))
140        self.portal["news-sitemaps"].at_post_create_script()
141        # Add minimal testing news item to portal
142        self.pubdate = (DateTime() + 1).strftime("%Y-%m-%d")
143        self.my_news = _createObjectByType('News Item', self.portal,
144                                           id='my_news')
145        self.my_news.edit(effectiveDate=self.pubdate)
146        self.workflow.doActionFor(self.my_news, "publish")
147        self.reParse()
148
149    def reParse(self):
150        # Parse news sitemap
151        self.sitemap = self.publish("/" + self.portal.absolute_url(1) + \
152                                    "/news-sitemaps",
153                                    "%s:%s" % (portal_owner, default_password)
154                                    ).getBody()
155        parsed_sitemap = parse(self.sitemap)
156        self.start = parsed_sitemap["start"]
157        self.data = parsed_sitemap["data"]
158
159    def test_nnews(self):
160        self.assert_("n:news" in self.start.keys())
161
162    def test_npublication(self):
163        self.assert_("n:publication" in self.start.keys())
164        self.assert_("n:name" in self.start.keys())
165        self.assert_("my_news" in self.data, "No 'First news' in data")
166        self.assert_("n:language" in self.start.keys())
167        self.assert_("en" in self.data, "No 'en' in data")
168
169    def test_npublication_date(self):
170        self.assert_("n:publication_date" in self.start.keys())
171        self.assert_(self.pubdate in self.data, "No %s in data" % self.pubdate)
172
173    def test_ntitle(self):
174        self.assert_("n:title" in self.start.keys())
175        self.assert_("my_news" in self.data, "No 'First news (test)' in data")
176
177    def test_no_naccess(self):
178        self.assert_("n:access" not in self.start.keys())
179
180    def test_no_ngenres(self):
181        self.assert_("n:genres" not in self.start.keys())
182
183    def test_no_keywords(self):
184        self.assert_("n:keywords" not in self.start.keys())
185
186    def test_no_stock_tickers(self):
187        self.assert_("n:stock_tickers" not in self.start.keys())
188
189
190class TestSchemaExtending(TestCase):
191
192    def afterSetUp(self):
193        super(TestSchemaExtending, self).afterSetUp()
194        self.my_doc = _createObjectByType('Document', self.portal, id='my_doc')
195        self.my_news = _createObjectByType('News Item', self.portal,
196                                           id='my_news')
197
198    def testExtendNewsItemByDefault(self):
199        # Neither of object has extended fields
200        self.assertNotEqual(self.my_news.getField("gsm_access"), None)
201        self.assertNotEqual(self.my_news.getField("gsm_genres"), None)
202        self.assertNotEqual(self.my_news.getField("gsm_stock"), None)
203        self.assertEqual(self.my_doc.getField("gsm_access"), None)
204        self.assertEqual(self.my_doc.getField("gsm_genres"), None)
205        self.assertEqual(self.my_doc.getField("gsm_stock"), None)
206
207    def testRegistrationOnLocalSM(self):
208        """SchemaExtender adapters must be registered
209           in Local SiteManager only.
210        """
211        localsm = getSiteManager(self.portal)
212        globalsm = getGlobalSiteManager()
213        # Now register SchemaExtender adapter and
214        # check if it present in Local SiteManger only
215        self.assertNotEqual(localsm, globalsm)
216        self.assertNotEqual(localsm.queryAdapter(
217                self.my_news, ISchemaExtender,
218                name="quintagroup.plonegooglesitemaps.newssitemapextender"),
219            None)
220        self.assertEqual(globalsm.queryAdapter(
221                self.my_news, ISchemaExtender,
222                name="quintagroup.plonegooglesitemaps.newssitemapextender"),
223            None)
224
225
226##
227## Mock objects for TestNotOverrideExistingSchemaExtender
228## Test Case
229##
230
231class ITestTaggable(Interface):
232    """Taggable content
233
234"""
235
236
237class ExtendableStringField(ExtensionField, StringField):
238    """An extendable string field."""
239
240
241class TestExtender(object):
242    adapts(ITestTaggable)
243    implements(ISchemaExtender)
244
245    def __init__(self, context):
246        self.context = context
247
248    def getFields(self):
249        return [ExtendableStringField("testField",), ]
250
251from quintagroup.plonegooglesitemaps.interfaces import INewsSitemapProvider
252
253
254class TestNotOverrideExistingSchemaExtender(TestCase):
255    """ Test if another schemaextender has been defined for the
256        IATNewsItem take in account by the system.
257    """
258    def prepareContent(self):
259
260        classImplements(ATNewsItem, ITestTaggable)
261        provideAdapter(TestExtender,
262                       name=u"archetypes.schemaextender.test.adapter")
263
264        self.portal.invokeFactory('News Item', 'taggable-news')
265        self.taggable_news = getattr(self.portal, 'taggable-news')
266
267    def testCorrectSchemaExtending(self):
268        self.prepareContent()
269        self.assert_(ITestTaggable.providedBy(self.taggable_news))
270        self.assert_(INewsSitemapProvider.providedBy(self.taggable_news))
271        schema = self.taggable_news.Schema().keys()
272        self.assert_("gsm_access" in schema, "no 'gsm_access' in schema: %s" \
273                     % schema)
274        self.assert_("testField" in schema, "no 'testField' in schema: %s" \
275                     % schema)
276
277
278classImplements(TestRequest, IAttributeAnnotatable)
279
280
281class TestAdditionalMaps(TestCase):
282    """Test bug in processing Missing value in functions,
283       defined in additional_maps property.
284    """
285    mv_keys = ['Date', 'Subject', 'getId', 'Language',
286               'gsm_access', 'gsm_genres', 'gsm_stock']
287
288    def afterSetUp(self):
289        super(TestAdditionalMaps, self).afterSetUp()
290        # Create news sitemaps
291        _createObjectByType("Sitemap", self.portal, id="news-sitemaps",
292                            sitemapType="news")
293        context = self.portal['news-sitemaps']
294        request = TestRequest()
295        alsoProvides(request, IGoogleSitemapsLayer)
296        self.nsmv = queryMultiAdapter((context, request),
297                                      name="news-sitemap.xml")
298
299        self.brain = self.portal.portal_catalog(portal_type="Document")[0]
300        for k in self.mv_keys:
301            self.brain[k] = MV
302
303    def testAdditionalMaps(self):
304        for n, func in self.nsmv.additional_maps:
305            try:
306                func(self.brain)
307            except Exception, e:
308                self.fail("Wrong processing 'Missing' value for '%s': %s" \
309                          % (n, str(e)))
310
311
312def test_suite():
313    suite = unittest.TestSuite()
314    suite.addTest(unittest.makeSuite(TestNewsSitemapsXML))
315    suite.addTest(unittest.makeSuite(TestNewsSitemapsXMLDefaultObject))
316    suite.addTest(unittest.makeSuite(TestSchemaExtending))
317    suite.addTest(unittest.makeSuite(TestNotOverrideExistingSchemaExtender))
318    suite.addTest(unittest.makeSuite(TestAdditionalMaps))
319    return suite
320
321if __name__ == '__main__':
322    unittest.main(defaultTest='test_suite')
323#    framework()
Note: See TracBrowser for help on using the repository browser.