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

Last change on this file since 2826 was 2750, checked in by mylan, 14 years ago

#229: Added test for functions used in additional_maps in news sitemaps view

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