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
RevLine 
[3163]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
[2394]8from DateTime import DateTime
[2750]9from Missing import MV
[2394]10
[2750]11from zope.publisher.browser import TestRequest
12from zope.component import queryMultiAdapter
[2744]13from zope.component import adapts, provideAdapter
[2750]14from zope.annotation.interfaces import IAttributeAnnotatable
[2400]15from zope.component import getSiteManager, getGlobalSiteManager
[2744]16from zope.interface import implements, Interface, classImplements
17from archetypes.schemaextender.field import ExtensionField
[2400]18from archetypes.schemaextender.interfaces import ISchemaExtender
19
20from Products.CMFPlone.utils import _createObjectByType
[2744]21from Products.Archetypes.public import StringField
22from Products.ATContentTypes.content.newsitem import ATNewsItem
[2400]23
[3152]24
[2394]25class TestNewsSitemapsXML(FunctionalTestCase):
26
27    def afterSetUp(self):
28        super(TestNewsSitemapsXML, self).afterSetUp()
29        # Create news sitemaps
[2395]30        _createObjectByType("Sitemap", self.portal, id="news-sitemaps",
31                            sitemapType="news", portalTypes=("News Item",))
32        self.portal["news-sitemaps"].at_post_create_script()
[2394]33        # Add testing news item to portal
[3152]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")
[2538]44        self.workflow.doActionFor(self.my_news, "publish")
[2397]45        self.reParse()
46
47    def reParse(self):
[2394]48        # Parse news sitemap
[3152]49        self.sitemap = self.publish("/" + self.portal.absolute_url(1) + \
50                                    "/news-sitemaps",
51                                    "%s:%s" % (portal_owner,
52                                               default_password)).getBody()
[2394]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"]
[3152]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")
[2394]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())
[3152]74
[2394]75    def test_npublication(self):
76        self.assert_("n:publication" in self.start.keys())
77        self.assert_("n:name" in self.start.keys())
[2395]78        self.assert_("First news" in self.data, "No 'First news' in data")
[2394]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())
[2395]84        self.assert_(self.pubdate in self.data, "No %s in data" % self.pubdate)
[3152]85
[2394]86    def test_ntitle(self):
87        self.assert_("n:title" in self.start.keys())
[3152]88        self.assert_("First news (test)" in self.data,
89                     "No 'First news (test)' in data")
[2394]90
91    def test_naccess(self):
[2397]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")
[2394]95
[2422]96    def test_ngenres(self):
[2399]97        # Test when genres present
[2397]98        self.assert_("n:genres" in self.start.keys())
99        self.assert_("PressRelease" in self.data, "No 'PressRelease' in data")
[2394]100
[2410]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())
[3152]107        self.assert_("PressRelease, Blog" in self.data,
108                     "No 'PressRelease, Blog' in data")
[2394]109
[2413]110    def test_ngenresEmpty(self):
111        # No genres should present if it's not updated
[2422]112        self.my_news.edit(gsm_genres=[])
[2413]113        self.my_news.reindexObject()
114        self.reParse()
115        self.assertNotEqual("n:genres" in self.start.keys(), True)
[2410]116
[2413]117    def test_ngenresForNotExtended(self):
118        # No genres should present for not extended content type
[2538]119        my_doc = _createObjectByType('Document', self.portal, id='my_doc')
[2413]120        my_doc.edit(text="Test document")
[2538]121        self.workflow.doActionFor(my_doc, "publish")
[2422]122        self.portal["news-sitemaps"].edit(portalTypes=("Document",))
[2413]123        self.reParse()
124        self.assertNotEqual("n:genres" in self.start.keys(), True)
[2410]125
[2422]126    def test_nstock_tickers(self):
127        # Test n:stock_tickers
128        self.assert_("n:stock_tickers" in self.start.keys())
[3152]129        self.assert_("NASDAQ:AMAT, BOM:500325" in self.data,
130                     "No 'NASDAQ:AMAT, BOM:500325' in data")
[2413]131
[2422]132
[2415]133class TestNewsSitemapsXMLDefaultObject(FunctionalTestCase):
134
135    def afterSetUp(self):
136        super(TestNewsSitemapsXMLDefaultObject, self).afterSetUp()
[3152]137        # Create news sitemaps
[2415]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
[3152]142        self.pubdate = (DateTime() + 1).strftime("%Y-%m-%d")
143        self.my_news = _createObjectByType('News Item', self.portal,
144                                           id='my_news')
[2415]145        self.my_news.edit(effectiveDate=self.pubdate)
[2538]146        self.workflow.doActionFor(self.my_news, "publish")
[2415]147        self.reParse()
148
149    def reParse(self):
150        # Parse news sitemap
[3152]151        self.sitemap = self.publish("/" + self.portal.absolute_url(1) + \
152                                    "/news-sitemaps",
153                                    "%s:%s" % (portal_owner, default_password)
154                                    ).getBody()
[2415]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())
[3152]161
[2415]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)
[3152]172
[2415]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
[3163]186    def test_no_stock_tickers(self):
[2422]187        self.assert_("n:stock_tickers" not in self.start.keys())
[2415]188
[2422]189
[2410]190class TestSchemaExtending(TestCase):
[2400]191
192    def afterSetUp(self):
[2410]193        super(TestSchemaExtending, self).afterSetUp()
[2538]194        self.my_doc = _createObjectByType('Document', self.portal, id='my_doc')
[3152]195        self.my_news = _createObjectByType('News Item', self.portal,
196                                           id='my_news')
[2400]197
[2410]198    def testExtendNewsItemByDefault(self):
[2400]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)
[2422]202        self.assertNotEqual(self.my_news.getField("gsm_stock"), None)
[2400]203        self.assertEqual(self.my_doc.getField("gsm_access"), None)
204        self.assertEqual(self.my_doc.getField("gsm_genres"), None)
[2422]205        self.assertEqual(self.my_doc.getField("gsm_stock"), None)
[3152]206
[2400]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
[2410]215        self.assertNotEqual(localsm, globalsm)
[2747]216        self.assertNotEqual(localsm.queryAdapter(
217                self.my_news, ISchemaExtender,
[3152]218                name="quintagroup.plonegooglesitemaps.newssitemapextender"),
219            None)
[2747]220        self.assertEqual(globalsm.queryAdapter(
221                self.my_news, ISchemaExtender,
[3152]222                name="quintagroup.plonegooglesitemaps.newssitemapextender"),
223            None)
[2400]224
225
[2744]226##
227## Mock objects for TestNotOverrideExistingSchemaExtender
228## Test Case
229##
230
231class ITestTaggable(Interface):
232    """Taggable content
233
[3152]234"""
235
236
[2744]237class ExtendableStringField(ExtensionField, StringField):
238    """An extendable string field."""
239
[3152]240
[2744]241class TestExtender(object):
242    adapts(ITestTaggable)
243    implements(ISchemaExtender)
244
245    def __init__(self, context):
246        self.context = context
247
248    def getFields(self):
[3152]249        return [ExtendableStringField("testField",), ]
[2744]250
[2747]251from quintagroup.plonegooglesitemaps.interfaces import INewsSitemapProvider
[3152]252
253
[2744]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):
[3152]259
[2744]260        classImplements(ATNewsItem, ITestTaggable)
[3152]261        provideAdapter(TestExtender,
262                       name=u"archetypes.schemaextender.test.adapter")
[2744]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))
[2747]270        self.assert_(INewsSitemapProvider.providedBy(self.taggable_news))
271        schema = self.taggable_news.Schema().keys()
[3152]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)
[2744]276
277
[2750]278classImplements(TestRequest, IAttributeAnnotatable)
279
[3152]280
[2750]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()
[3152]290        # Create news sitemaps
[2750]291        _createObjectByType("Sitemap", self.portal, id="news-sitemaps",
292                            sitemapType="news")
293        context = self.portal['news-sitemaps']
[2841]294        request = TestRequest()
295        alsoProvides(request, IGoogleSitemapsLayer)
[3152]296        self.nsmv = queryMultiAdapter((context, request),
297                                      name="news-sitemap.xml")
[2750]298
299        self.brain = self.portal.portal_catalog(portal_type="Document")[0]
300        for k in self.mv_keys:
301            self.brain[k] = MV
[3152]302
[2750]303    def testAdditionalMaps(self):
[3152]304        for n, func in self.nsmv.additional_maps:
[2750]305            try:
[3163]306                func(self.brain)
[2750]307            except Exception, e:
[3152]308                self.fail("Wrong processing 'Missing' value for '%s': %s" \
[2750]309                          % (n, str(e)))
[3152]310
311
[2394]312def test_suite():
[3163]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))
[2394]319    return suite
[3163]320
321if __name__ == '__main__':
322    unittest.main(defaultTest='test_suite')
323#    framework()
Note: See TracBrowser for help on using the repository browser.