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

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

fixes pep8

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