source: products/quintagroup.plonegooglesitemaps/branches/sitemap_date/quintagroup/plonegooglesitemaps/tests/testNewsSitemaps.py

Last change on this file was 3503, checked in by potar, 12 years ago

fixed pep8

  • Property svn:eol-style set to native
File size: 12.5 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
[3503]49        self.sitemap = self.publish("/" + self.portal.absolute_url(1) +
[3152]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
[3503]151        self.sitemap = self.publish("/" + self.portal.absolute_url(1) +
[3152]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
[3503]215        adapter = "quintagroup.plonegooglesitemaps.newssitemapextender"
[2410]216        self.assertNotEqual(localsm, globalsm)
[2747]217        self.assertNotEqual(localsm.queryAdapter(
[3503]218                            self.my_news, ISchemaExtender,
219                            name=adapter),
220                            None)
[2747]221        self.assertEqual(globalsm.queryAdapter(
[3503]222                         self.my_news, ISchemaExtender,
223                         name=adapter),
224                         None)
[2400]225
226
[2744]227##
228## Mock objects for TestNotOverrideExistingSchemaExtender
229## Test Case
230##
231
232class ITestTaggable(Interface):
233    """Taggable content
234
[3152]235"""
236
237
[2744]238class ExtendableStringField(ExtensionField, StringField):
239    """An extendable string field."""
240
[3152]241
[2744]242class TestExtender(object):
243    adapts(ITestTaggable)
244    implements(ISchemaExtender)
245
246    def __init__(self, context):
247        self.context = context
248
249    def getFields(self):
[3152]250        return [ExtendableStringField("testField",), ]
[2744]251
[2747]252from quintagroup.plonegooglesitemaps.interfaces import INewsSitemapProvider
[3152]253
254
[2744]255class TestNotOverrideExistingSchemaExtender(TestCase):
256    """ Test if another schemaextender has been defined for the
257        IATNewsItem take in account by the system.
258    """
259    def prepareContent(self):
[3152]260
[2744]261        classImplements(ATNewsItem, ITestTaggable)
[3152]262        provideAdapter(TestExtender,
263                       name=u"archetypes.schemaextender.test.adapter")
[2744]264
265        self.portal.invokeFactory('News Item', 'taggable-news')
266        self.taggable_news = getattr(self.portal, 'taggable-news')
267
268    def testCorrectSchemaExtending(self):
269        self.prepareContent()
270        self.assert_(ITestTaggable.providedBy(self.taggable_news))
[2747]271        self.assert_(INewsSitemapProvider.providedBy(self.taggable_news))
272        schema = self.taggable_news.Schema().keys()
[3503]273        self.assert_("gsm_access" in schema, "no 'gsm_access' in schema: %s"
[3152]274                     % schema)
[3503]275        self.assert_("testField" in schema, "no 'testField' in schema: %s"
[3152]276                     % schema)
[2744]277
278
[2750]279classImplements(TestRequest, IAttributeAnnotatable)
280
[3152]281
[2750]282class TestAdditionalMaps(TestCase):
283    """Test bug in processing Missing value in functions,
284       defined in additional_maps property.
285    """
286    mv_keys = ['Date', 'Subject', 'getId', 'Language',
287               'gsm_access', 'gsm_genres', 'gsm_stock']
288
289    def afterSetUp(self):
290        super(TestAdditionalMaps, self).afterSetUp()
[3152]291        # Create news sitemaps
[2750]292        _createObjectByType("Sitemap", self.portal, id="news-sitemaps",
293                            sitemapType="news")
294        context = self.portal['news-sitemaps']
[2841]295        request = TestRequest()
296        alsoProvides(request, IGoogleSitemapsLayer)
[3152]297        self.nsmv = queryMultiAdapter((context, request),
298                                      name="news-sitemap.xml")
[2750]299
300        self.brain = self.portal.portal_catalog(portal_type="Document")[0]
301        for k in self.mv_keys:
302            self.brain[k] = MV
[3152]303
[2750]304    def testAdditionalMaps(self):
[3152]305        for n, func in self.nsmv.additional_maps:
[2750]306            try:
[3163]307                func(self.brain)
[2750]308            except Exception, e:
[3503]309                self.fail("Wrong processing 'Missing' value for '%s': %s"
[2750]310                          % (n, str(e)))
[3152]311
312
[2394]313def test_suite():
[3163]314    suite = unittest.TestSuite()
315    suite.addTest(unittest.makeSuite(TestNewsSitemapsXML))
316    suite.addTest(unittest.makeSuite(TestNewsSitemapsXMLDefaultObject))
317    suite.addTest(unittest.makeSuite(TestSchemaExtending))
318    suite.addTest(unittest.makeSuite(TestNotOverrideExistingSchemaExtender))
319    suite.addTest(unittest.makeSuite(TestAdditionalMaps))
[2394]320    return suite
[3163]321
322if __name__ == '__main__':
323    unittest.main(defaultTest='test_suite')
324#    framework()
Note: See TracBrowser for help on using the repository browser.